diff --git a/docs/concept.md b/docs/concept.md index 29e1bd4..0d8a7d3 100644 --- a/docs/concept.md +++ b/docs/concept.md @@ -2,94 +2,67 @@ ## 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. +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 surface occupies the left portion of the world; space extends to the right. -- The number of buildable tiles on the asteroid is configurable. +- The asteroid occupies the left portion of the world; space extends to the right. ## Game World Layout (left to right) -1. **Asteroid** — factory and shipyards are built here. -2. **Player defence stations** — a set of stations positioned in space at some distance from the asteroid edge. They automatically engage approaching enemies. They can be destroyed. -3. **Enemy defence stations** — a set of stations further to the right of the player's stations. The player can only scroll the view up to these stations. They are the push target. -4. **Enemy spawn area** — enemy waves originate from off-screen to the 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 +## Factory & Belts -- The player constructs factory buildings on the asteroid to produce materials and ship parts. -- Buildings are placed in a queue and constructed one at a time; each building takes time to complete. -- The crafting/production tree is defined in a config file so it can be extended later without code changes. -- The factory is simpler than Factorio in depth but follows the same production-chain principle. -- Materials are transported between buildings manually using **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 player's starting resource method. Ores are extracted from the asteroid and smelted into basic materials. -- **Scrap** — collected by dedicated salvage ships from destroyed enemy ships. - - Scrap can be smelted into the same basic materials as mined ores. - - A dedicated **Reprocessing Plant** building can extract higher-level intermediate products from scrap (with fixed probabilities per product type), bypassing parts of the normal crafting chain. +- **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 one globally shared resource: - -- An assembler recipe turns input materials into building blocks. -- Building blocks are transported via belts into the HQ, where they are added to the global building blocks stock. -- The global building blocks stock is the only global inventory; all other materials exist only in buildings and on belts. -- Building blocks are spent to place new factory buildings and to unlock new asteroid columns (see Asteroid Expansion). +**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 edge of the asteroid. -- When the player clicks a shipyard, they choose a blueprint from all currently unlocked blueprints. -- The shipyard automatically produces one ship of the selected blueprint whenever all required materials are available in the shipyard. -- Ships are fully autonomous and do not require player input. Known ship roles: - - **Combat ships** — travel right and engage enemy ships. - - **Salvage ships** — fly out to the battlefield, collect scrap from destroyed enemy ships, and return to the asteroid. They are vulnerable to enemy ships while operating. - - **Repair ships** — fly out and repair damaged player defence stations and other player ships in the field. -- If the player's ships are all destroyed, enemy ships advance unhindered toward the player's defence stations and then the asteroid. +- 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 continuously over a period of several seconds, then there is a gap before the next wave begins spawning. -- The previous wave may still be in transit or fighting during the gap — there is no hard "wave cleared" state. -- Difficulty scales multiplicatively from two independent sources: - - **Time scaling** — enemy strength increases gradually over elapsed game time. - - **Push scaling** — each time the player destroys a set of enemy defence stations, enemy strength is multiplied by a configurable factor (e.g. 1.5×). This factor also determines the strength of the replacement defence stations. -- Both scaling factors stack multiplicatively. +- 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 (Enemy Defence Stations) +## Push Mechanic -- The enemy owns a pair of defence stations positioned just beyond the scrollable area boundary. -- The player is **not** forced to push — purely defensive play is valid. -- If the player's fleet becomes strong enough that incoming waves are trivial, pushing to destroy enemy defence stations provides a new challenge: destroying them multiplies the enemy threat level by the configurable push scaling factor (starting with the next wave), extends the scrollable area, and places a new pair of stations (scaled by the same factor) at the new boundary. -- Destroyed enemy defence stations drop loot: primarily **ship blueprints** that unlock new ship types at shipyards. +- 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 +## Starting Conditions & Game Over -- The player starts with the **HQ** pre-placed and a stock of building blocks. -- Enemy waves do not begin immediately; there is a grace period at the start to allow initial factory setup. - -## Game Over Condition - -- There is a **Headquarters (HQ)** building at the asteroid edge, through which building blocks enter the global stock via belts. -- If enemy ships breach the asteroid — all player ships and defence stations destroyed — they attack the HQ. -- The game is lost when the HQ is destroyed. -- Individual factory buildings are **not** targeted or destroyed by enemies. - -## Progression & Goals - -- The primary goal is to survive as long as possible. -- Elapsed time is always displayed. -- New ship blueprints are unlocked by destroying enemy defence stations. +- 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 fixed number of columns, configurable at game start. -- Additional columns can be unlocked by spending building blocks from the global stock. -- Each unlocked column costs a fixed amount of building blocks (value to be tuned). +- 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).