"""Pitch economy stub — numbers from docs/GAMEPLAY.md (Sump Wells / Start / Carry).""" from __future__ import annotations from dataclasses import dataclass, field # GAMEPLAY.md: Start 500 Pitch START_PITCH: float = 500.0 # GAMEPLAY.md: Worker load 100 WORKER_LOAD: int = 100 # GAMEPLAY.md: Sump Wells finite 2500, seep +0.4/s while claimed WELL_CAPACITY: float = 2500.0 SEEP_PER_SEC: float = 0.4 @dataclass class SumpWell: """Finite Pitch node. Claim via finished refinery in radius (GAMEPLAY.md).""" remaining: float = WELL_CAPACITY claimed: bool = False has_refinery: bool = False def claim_via_refinery(self) -> None: """Claim well by finishing a refinery flag (GAMEPLAY.md).""" self.has_refinery = True self.claimed = True def tick_seep(self, dt: float) -> float: """Seep +0.4/s while claimed; depletes remaining. Returns Pitch extracted.""" if not self.claimed or self.remaining <= 0.0 or dt <= 0.0: return 0.0 extracted = min(self.remaining, SEEP_PER_SEC * dt) self.remaining -= extracted return extracted @dataclass class Worker: """Carry load 100 (GAMEPLAY.md). Stub — load cap only for now.""" load: int = 0 capacity: int = WORKER_LOAD def can_pick(self, amount: int) -> int: return max(0, min(amount, self.capacity - self.load)) @dataclass class Economy: """Faction Pitch pool + claimed wells.""" pitch: float = START_PITCH wells: list[SumpWell] = field(default_factory=list) def add_well(self, well: SumpWell | None = None) -> SumpWell: w = well if well is not None else SumpWell() self.wells.append(w) return w def tick(self, dt: float) -> float: gained = 0.0 for w in self.wells: gained += w.tick_seep(dt) self.pitch += gained return gained