Commit Graph

6 Commits

Author SHA1 Message Date
Brian Fertig 237a024f80 feat(civ): add status log panel, event announcements, smooth camera pan, and city sprites
- Add bottom-right status log panel with scrollable entries, word wrap,
  mask clipping, and mouse wheel scrolling; cap at 60 entries
- Replace toast popups with announceStatus() for major events (war, tech,
  first contact, city founded, trade routes, huts) — centered modal with
  CONTINUE button that animates into the log; supports queued popups and
  custom onDismiss callbacks (e.g. first contact opens diplomacy)
- Add smooth panToTile() tween for camera movement when selecting next unit,
  refactored clampPan into panBounds() reused by both clamp and tween
- Add classic city sprite sheet (civilization-cities-classic.png) and
  register it in artwork JSON and asset manifest
- Replace circular civ rings and selection ring with isometric ellipses
  matching the 2:1 tile ratio for better depth reading
- Paint tile neighbors in ascending c+r order during repaintTileAndNeighbors
  to prevent tall features from being overwritten by lower-sum neighbors
- Stop panTween on pointer down to avoid conflict with manual dragging
2026-07-16 13:48:39 -06:00
Brian Fertig def5c9904a feat(civ): add per-leader starting techs, union with trait techs, and setup background
Allow each opponent to declare their own 2-3 starting technologies in
opponents.json, independent of their civ trait. During game creation,
personal and trait-based starting techs are unioned (deduped) so
pioneering leaders with overlapping lists don't double-grant.

- Add optional setup screen background image (civilization-setup-bg)
- Update leader detail panel description to list personal starting techs
- Deduplicate trait + personal techs via Set in CivilizationLogic
- Add validation for startingTechs arrays, tech existence, 2-3 total count,
  and variety across leaders in verifyCivilization
- Add integration tests for personal tech granting and overlap deduplication
2026-07-16 10:31:25 -06:00
Brian Fertig 80d4a79593 feat(civ): add leader trait system with bonuses, starting techs, and UI
Introduce civTraits data structure with 8 traits (scientific, industrious,
commercial, philosophical, zealous, mercantile, pioneering, wealthy) that
provide science/gold/shield multipliers, starting gold, and starting
technologies. Assign each opponent a trait in opponents.json.

- Apply trait bonuses to starting gold and grant starting techs during
  game creation in CivilizationLogic
- Route trait multipliers into cityYields for science, gold, and production
- Add a leader detail panel to the setup screen showing name, trait name,
  and description, updated live when selecting leaders
- Add validation for civTraits in CivilizationRules (multipliers positive,
  starting techs valid, etc.)
- Add verification tests for trait application and city yield multipliers
- Nudge unit sprite position 5px down for better tile alignment
2026-07-16 10:31:02 -06:00
Brian Fertig 4d864503f2 fix: cap city shields at build cost to prevent overflow display
When a city cannot complete a build (e.g., size < 2 for settlers),
shields were accumulating past the build cost, showing confusing
values like "60/40 shields" or negative turn counts.

- Cap shieldBox at buildCost each turn in processCity
- Clamp displayed shields to min(shieldBox, cost) in city screen
- Add tests verifying shield capping and stalled build completion
2026-07-15 23:36:53 -06:00
Brian Fertig 325692fa35 feat(civ): animate combat events with attacker/defender ghosts and victory advance
- Capture attacker/defender snapshot (id, civ, type, start position) in
  combat events so the UI can reconstruct them after resolution
- Add `animateCombat()` that plays sequential lunge/retreat animations for
  each combat, death flash/shrink for the loser, and optional victory glide
  for unopposed winners stepping onto the cleared tile
- Add `animateUnitsAlong()` to glide AI civ units between before/after
  snapshots, enabling the same "resolve now, animate after" pattern for
  AI turns
- Track unit containers in `unitContainers` map for lookup by unitId
- When player unit encounters combat mid-path, animate the peaceful leg
  first then play the clash
- Add `collectNewCombatEvents()` to pick up and mark consumed combat events
- Add `isTileVisible()` helper for filtering AI combat to visible tiles
- Update tests to verify advance-after-kill and combat event shape
2026-07-15 23:26:29 -06:00
Brian Fertig 67a7ac857e feat: add Civilization II-lite game engine and UI
Implement a complete turn-based strategy game with:

- Deterministic headless engine: cities, units, combat, research, governments
- Seeded world generation with noise-based terrain, continents, quality scoring
- Isometric map renderer with procedural fallbacks and optional sprite sheets
- AI rivals with strategy phases, diplomacy, trade routes, and unit control
- Full UI: setup, city screen, tech tree, diplomacy, spaceship tracker, victory
- 80 techs, 51 units, 26 buildings, 11 terrains, 6 governments, 5 difficulties
- Comprehensive headless verification suite (rules integrity, worldgen, combat, AI self-play)
2026-07-15 18:56:02 -06:00