Files
dota_factory/docs/concept.md
2026-04-15 22:19:26 +02:00

4.0 KiB

Concept

Overview

A single-player asymmetric game inspired by DOTA's wave/tower structure, combined with a Factorio-style factory builder. The player builds a factory on an asteroid to supply shipyards that produce autonomous combat ships. Those ships fight off endless enemy waves advancing from the right. The goal is to survive as long as possible; elapsed time is always displayed.

Setting & Visuals

  • Science-fiction setting on the boundary between an asteroid and space.
  • 2D (or 2.5D) top-down view similar to Factorio.
  • The game world has a fixed height and scrolls horizontally.
  • The asteroid occupies the left portion of the world; space extends to the right.

Game World Layout (left to right)

  1. Asteroid — the player's factory and shipyards are built here. The HQ sits at the asteroid's right edge.
  2. Player defence stations — automatically engage approaching enemies; can be destroyed.
  3. Enemy defence stations — the push target; mark the right boundary of the scrollable area.
  4. Enemy spawn area — waves originate from off-screen to the right.

Factory & Belts

  • Factory buildings are placed from a queue and constructed one at a time, each taking some time to complete.
  • Materials are transported between buildings manually using belts.
  • The crafting/production tree is defined in a config file so it can be extended without code changes.

Resources & Building Blocks

Two sources feed the same production tree:

  • Mining — the starting resource method; ores are extracted from the asteroid and smelted into basic materials.
  • Scrap — collected by salvage ships from destroyed enemies; can be smelted into basic materials like mined ores, or processed in a Reprocessing Plant to extract higher-level intermediate products (fixed probabilities per product type).

Building blocks are the only globally shared resource. An assembler recipe produces them from materials; they are transported via belts into the HQ, which adds them to the global stock. Building blocks are spent to place factory buildings and to unlock additional asteroid columns.

Ships & Shipyards

  • Shipyards are built at the asteroid's right edge.
  • The player clicks a shipyard to assign a blueprint; the shipyard then automatically produces that ship type whenever the required materials are available.
  • New blueprints are unlocked as loot from destroyed enemy defence stations.
  • Ships are fully autonomous. Known roles:
    • Combat ships — travel right and engage enemies.
    • Salvage ships — fly out, collect scrap from destroyed enemies, and return; vulnerable while operating.
    • Repair ships — fly out and repair damaged player defence stations and ships.

Enemy Waves & Difficulty Scaling

  • Waves spawn over several seconds; a gap follows before the next wave begins spawning. The previous wave may still be approaching or fighting during the gap.
  • Difficulty scales multiplicatively from two sources:
    • Time scaling — enemy strength increases gradually over elapsed time.
    • Push scaling — destroying a set of enemy defence stations multiplies enemy strength by a configurable factor. The replacement stations are scaled by the same factor.

Push Mechanic

  • The player is not forced to push; purely defensive play is valid.
  • Destroying enemy defence stations applies the push scaling multiplier to all future waves, extends the scrollable area, and places a new (stronger) set of stations at the new boundary.
  • Destroyed enemy defence stations drop ship blueprints.

Starting Conditions & Game Over

  • The player starts with the HQ pre-placed and a stock of building blocks; no other buildings are pre-placed.
  • There is a grace period before the first wave to allow initial setup.
  • If all ships and player defence stations are destroyed, enemies attack the HQ. The game is lost when the HQ is destroyed. Factory buildings are never targeted.

Asteroid Expansion

  • The asteroid has a configurable number of columns at game start.
  • Additional columns are unlocked by spending building blocks (cost per column to be tuned).