aboutsummaryrefslogtreecommitdiffstats
path: root/requirements/v0.1-core.org
diff options
context:
space:
mode:
Diffstat (limited to 'requirements/v0.1-core.org')
-rw-r--r--requirements/v0.1-core.org338
1 files changed, 338 insertions, 0 deletions
diff --git a/requirements/v0.1-core.org b/requirements/v0.1-core.org
new file mode 100644
index 0000000..ce3d99c
--- /dev/null
+++ b/requirements/v0.1-core.org
@@ -0,0 +1,338 @@
+#+TITLE: Forts Clone v0.1 — Core Requirements
+#+AUTHOR: Forts Clone Project
+#+DATE: 2025-06-19
+#+OPTIONS: toc:3 num:t
+
+* Purpose
+
+v0.1 exists to prove the core loop: build a fort, place weapons, and destroy
+an enemy reactor through physics-based structural damage. No multiplayer.
+No AI. No commanders. Just the fundamental building↔physics↔destruction
+feedback loop working end-to-end.
+
+* Resources
+
+Two resources only. No tech tree — everything is available from the start.
+
+** Metal
+- Gathered via Mines placed on metal deposits in the terrain
+- Deposits are fixed nodes on the map — a mine on a deposit produces metal at
+ a constant rate
+- Metal is consumed when placing building pieces and weapons
+- If you run out of metal, you cannot build
+
+** Energy
+- Generated by Wind Turbines placed on your fort
+- Turbine output scales with:
+ - Height above terrain (higher = more energy)
+ - Lack of obstruction around the turbine (clear air = more energy)
+- Energy is consumed when placing building pieces and weapons
+- If you run out of energy, you cannot build
+
+* Building Materials
+
+** Wood (Normal Bracing)
+- Primary structural building material
+- Opaque: projectiles CANNOT pass through it
+- Guns cannot shoot through wood bracing — it blocks line of fire for both
+ the player and hypothetically for enemies
+- Has HP — takes damage from cannon shells, lasers, and fire
+- Flammable: can be set on fire by laser or cannon (chance-based)
+- When HP reaches zero, the piece is destroyed
+- When a load-bearing piece is destroyed, connected pieces may collapse
+ (Box2D joint destruction → cascade)
+- Costs: metal + energy (exact values TBD during implementation)
+- Appears as a solid plank/beam visually
+
+** Background Bracing
+- Structural building material — provides support just like wood
+- Translucent/façade: structures behind it are visually hidden from the
+ opponent (in v0.1, this is mostly cosmetic since there is no opponent)
+- Projectiles pass THROUGH background bracing — it does NOT block shots
+- Guns CAN shoot through background bracing (it doesn't block line of fire)
+- Has HP — takes damage from cannon shells and lasers
+- Flammable: fire-spreading weapons (laser, cannon) set fire to it
+- When HP reaches zero, the piece is destroyed
+- When destroyed, any structures it was hiding become visible
+- Costs: metal + energy (likely cheaper than wood since it doesn't block
+ projectiles — TBD)
+- Appears as a visually distinct, lighter/more transparent plank
+
+** Ropes
+- Tension element connecting two points
+- Provides structural stability — keeps structures from tipping over
+- Does NOT block projectiles (they pass through ropes)
+- Has HP (low compared to wood)
+- Vulnerable to: fire (can burn through), cannon splash damage
+- If a rope is destroyed, the structure it was stabilizing may collapse
+ (tension is released → connected bodies may fall)
+- Implemented via Box2D =b2DistanceJoint=
+- Costs: metal + energy (cheap per segment — ropes are primarily for
+ structural engineering, not defense)
+- Appears as a thin line/cable visually
+
+** Material Property Summary
+
+| Property | Wood Bracing | Background Bracing | Ropes |
+|-----------------------+--------------+-------------------+-------------|
+| Blocks projectiles | ✅ Yes | ❌ No | ❌ No |
+| Blocks line of fire | ✅ Yes | ❌ No | ❌ No |
+| Provides structure | ✅ Yes | ✅ Yes | ✅ Tension |
+| Flammable | ✅ Yes | ✅ Yes | ✅ Yes |
+| HP (relative) | High | Medium | Low |
+| Hides structures | ❌ No | ✅ Yes | ❌ No |
+
+* Weapons
+
+** Cannon (Artillery)
+- Type: arcing projectile (affected by gravity)
+- Aiming: player sets angle and power, fires on click
+- Projectile: cannon shell with ballistic trajectory
+ - Travels in an arc (Box2D body under gravity)
+ - On impact: deals damage in a small splash radius
+ - Knockback: applies force to bodies near impact point
+ - Structural damage: can break joints near impact
+- Chance to set fire: ~20-30% chance on impact to ignite the struck piece
+ (fire then spreads to connected flammable materials)
+- Firing rate: slow (e.g., 1 round per 2-3 seconds)
+- Good against: structures, wooden walls
+- Counter: Flak gun can shoot down cannon shells in flight
+- Costs: metal + energy to build the cannon device on your fort
+
+** Flak Gun
+- Type: point-defense, hitscan or very fast projectile
+- Aiming: automatic or manual? (TBD — auto-targeting incoming projectiles in
+ a cone/radius, or player aims at incoming shells)
+- Purpose: shoots down incoming cannon shells before they impact
+- Cannot damage buildings (or does very little building damage)
+- Firing rate: moderate/high (needs to be able to intercept cannon shells)
+- Placement matters: must have line of sight to incoming projectiles
+ (cannot shoot through wood bracing, CAN shoot through background bracing
+ and ropes)
+- Costs: metal + energy to build
+
+** Laser
+- Type: Line-of-Sight beam weapon
+- Aiming: player draws a line from the laser turret to target point
+- The beam traces through:
+ - Empty space: passes freely
+ - Background bracing: passes through (doesn't block)
+ - Ropes: passes through
+ - Wood bracing: blocked — beam stops at first wood piece hit
+- Damage: low continuous damage to whatever piece it hits (or low damage
+ per tick while beam is active)
+- Fire starter: 100% chance to set the struck piece on fire (if flammable)
+ — this is the laser's primary purpose
+- Beam duration: fires for a short burst (e.g., 0.5-1 second) then goes on
+ cooldown
+- Cannot penetrate normal wood — the beam stops at the first wood surface
+- Good against: starting fires in enemy structures, burning through ropes
+ and background bracing, igniting key support pieces
+- Costs: metal + energy to build
+
+** Weapon Summary
+
+| Weapon | Damage | Fire? | Blocks Projectiles? | Penetrates Bg. Bracing? |
+|----------+--------+-------+---------------------+--------------------------|
+| Cannon | High | ~25% | Flak can intercept | Yes (arcing shot) |
+| Flak Gun | Low | No | N/A (defensive) | Yes (hitscan within arc) |
+| Laser | Low | 100% | N/A (stops at wood) | Yes (beam passes through)|
+
+* Reactor
+
+- The win/loss condition for both the player and the dummy fort
+- A large, relatively fragile device placed at the core of each fort
+- Has HP — when HP reaches zero, that side loses
+- Can be damaged by:
+ - Direct cannon shell hits
+ - Fire reaching the reactor (spread from burning connected pieces)
+ - Falling/collision damage if the reactor's supports are destroyed and
+ it falls
+- Player's reactor starts at a fixed position on the left side of the map
+- Dummy reactor starts at a fixed position on the right side of the map
+- Visually distinct — glows, pulses, or is marked clearly
+- Costs: free (starts pre-placed on the map)
+
+* Fire System
+
+- Fire starts when:
+ - Laser hits a flammable piece (100% ignition chance)
+ - Cannon shell impacts a flammable piece (~20-30% ignition chance)
+- Once ignited, a piece burns:
+ - Takes damage over time (HP decreases per tick)
+ - Fire spreads to adjacent connected flammable pieces (via Box2D joint
+ graph — check neighboring bodies)
+ - Burning pieces produce visual fire particles and smoke
+ - Ropes burn faster than wood (lower HP, fire kills them quickly)
+- Fire does NOT spread through empty space — only along joint connections
+ between flammable bodies
+- A piece destroyed by fire releases its joints, potentially causing
+ structural collapse
+- Fire can reach and damage the reactor if connected through flammable
+ structure
+- Extinguish? Not in v0.1 — once something is burning, it burns until
+ destroyed. (Future: repair tool extinguishes fire.)
+
+* Physics
+
+- Box2D v3 simulation at fixed timestep (60Hz)
+- Every building piece (wood, background bracing) is a =b2Body= (dynamic)
+- Terrain/map geometry is =b2Body= (static)
+- Joints:
+ - Weld joints connect adjacent building pieces (rigid attachment)
+ - Distance joints represent ropes (maintain fixed distance between two
+ anchor points)
+- Gravity: standard downward gravity (~9.8 m/s² in world units)
+- Projectiles: dynamic =b2Body= with initial velocity, affected by gravity
+- Impact forces: cannon shells apply =b2Body::ApplyLinearImpulse= to nearby
+ bodies on detonation
+- Joint breaking: when a body is destroyed (HP reaches zero), its attached
+ joints are destroyed → connected bodies may fall
+- =b2DestructionListener= triggers game-side logic (spawn debris particles,
+ mark connected bodies for stability check, fire spread check)
+- Structural collapse emerges naturally from the physics — if enough
+ supports are destroyed, structures fall
+
+* Map
+
+** Layout
+- 2D side-view
+- Fixed-size playfield (e.g., 200m wide × 100m tall in world units)
+- Left side: player's starting area
+ - Player reactor pre-placed at a fixed position
+ - Small starter structure around the reactor (a few wood planks forming
+ a basic shell)
+ - 2-3 metal deposits near the player's side
+- Right side: dummy enemy fort
+ - Dummy reactor pre-placed at a fixed position
+ - Pre-built fort structure around the reactor (wood bracing walls, some
+ background bracing panels hiding the reactor, a few rope supports)
+ - Intended as a target to shoot at — the dummy has enough structure to
+ demonstrate the physics/destruction/fire systems
+ - 2-3 metal deposits near the enemy side
+- Terrain: simple ground plane with some unevenness/hills
+- Metal deposits: visible ore nodes embedded in terrain
+
+** Visual Style
+- Simple, functional — colored rectangles/sprites for building pieces
+- Distinct colors for: wood (brown), background bracing (lighter brown/
+ beige, semi-transparent), ropes (dark line), metal deposits (gray/silver),
+ reactor (glowing red/orange)
+- Sky/gradient background (simple)
+- This is v0.1 — programmer art is fine. Aesthetics can wait.
+
+* Game Mode: Target Practice (v0.1)
+
+** Setup
+- Single player on the left side
+- Dummy fort on the right side (pre-built, no AI, no player controlling it)
+- The dummy does NOT: build, shoot back, repair, or take any action
+- The dummy fort is a static structure — it just sits there
+
+** Player Actions
+- Build: place wood, background bracing, and ropes on your fort
+ - Drag to place beams/planks (TBD: exact building UX)
+ - Click points to connect ropes
+- Place weapons: build cannon, flak gun, and laser on your fort
+ - Weapons are placed like building pieces but have an aim direction
+- Aim & Fire:
+ - Cannon: click and drag to set angle/power, release to fire
+ - Laser: click and drag to draw beam path, fires along line
+ - Flak gun: active passively? Or player aims at incoming shells?
+ (TBD — simplest v0.1 approach: flak automatically shoots at cannon
+ shells within its arc/range)
+- Manage resources: build mines on deposits, build wind turbines for energy
+- Repair: damaged structures can be repaired for a resource cost
+ (TBD: repair tool or automatic?)
+
+** Win Condition
+- Destroy the dummy reactor
+ - Reduce its HP to zero via direct hits, fire, or structural collapse
+
+** Lose Condition
+- Your own reactor is destroyed
+ - In v0.1 with no enemy AI, this can only happen if you damage your own
+ reactor (unlikely) or your fort collapses onto it (possible if built
+ poorly)
+
+** No Win/Lose Condition (Stretch)
+- The game simply continues — there's no victory screen yet. When a reactor
+ dies, it explodes/dissolves visually. Press R to restart.
+
+* Camera & Controls
+
+** Camera
+- 2D orthographic projection via bgfx
+- Camera pans with mouse (drag middle-mouse or scroll to edge)
+- Zoom with scroll wheel (zoom in/out to see details or full battlefield)
+- Default view: centered on the map, showing both forts
+
+** Controls (Mouse + Keyboard)
+| Action | Input |
+|-------------------+------------------------------|
+| Pan camera | Middle-mouse drag or arrow keys |
+| Zoom | Scroll wheel |
+| Select build mode | Number keys (1=wood, 2=bg.brace, 3=rope, 4=cannon, 5=flak, 6=laser) |
+| Place piece | Click (in build mode) |
+| Cancel build | Right-click or Escape |
+| Aim weapon | Click (in weapon mode) |
+| Fire weapon | Release after aim, or click |
+| Repair | Right-click on damaged piece |
+| Recycle/delete | Shift+click on piece |
+| Restart | R key |
+
+* What is Explicitly OUT of Scope for v0.1
+
+- Multiplayer (no networking needed)
+- AI opponents (dummy fort is entirely passive)
+- Commanders
+- Tech tree
+- Damage types beyond fire + kinetic (no EMP, no shields)
+- Particle effects beyond basic fire/smoke
+- Sound (can be added but not required — focus on gameplay)
+- UI beyond basic resource counters and build mode indicators
+- Save/load
+- Replays
+- Mod loading (Lua infrastructure can be in engine but no mods to load yet)
+- Menu system (just drop into the game on launch)
+- Win/loss screens (reactor explodes, press R to restart)
+
+* Development Priorities (Build Order)
+
+1. Windowing + rendering (SDL3 + bgfx — get a triangle on screen)
+2. 2D sprite batcher on bgfx (colored quads for building pieces)
+3. Box2D world + basic bodies (static terrain, dynamic plank)
+4. Build mode: click to place a plank (creates Box2D body + renders sprite)
+5. Resource system (mines, turbines, metal/energy counters)
+6. Multiple connected pieces (weld joints, structural integrity)
+7. Ropes (distance joints, tension visualization)
+8. Cannon + projectile physics (spawn shell, ballistic arc, impact)
+9. Flak gun (shoot down cannon shells)
+10. Laser (line trace, fire ignition)
+11. Fire system (HP-over-time, spread along joints, visual feedback)
+12. Reactor + win/loss check
+13. Dummy fort (pre-built target structure on the right side)
+14. Camera (pan, zoom)
+15. Repair + recycle
+16. Polish pass (visual clarity, controls feel, edge cases)
+
+* Open Design Questions (Resolve During Implementation)
+
+- [ ] Building UX: drag-to-place beams? Click start + end points? Grid snap
+ or freeform?
+- [ ] Cannon aiming: click on your cannon + click target point? Or angle/
+ power slider?
+- [ ] Flak gun behavior: fully automatic within an arc? Or player manually
+ targets incoming shells?
+- [ ] Laser duration: continuous beam while holding click? Or fixed-duration
+ burst?
+- [ ] Resource rates: how much metal per mine per second? How much energy per
+ turbine? (Tune during playtesting)
+- [ ] Piece HP values: how many cannon hits to destroy wood? Background
+ bracing? Ropes?
+- [ ] Building piece sizes: fixed sizes (1m, 2m, 4m beams)? Or freeform drag?
+- [ ] Does fire spread upward preferentially? (Heat rises — fire climbing up
+ a structure is more dangerous than fire going down)
+- [ ] Can you build pieces that intersect? Or is placement blocked by existing
+ bodies?
+- [ ] Repair cost: proportional to missing HP? Flat cost?