Spaces:
Paused
Paused
Commit History
-
P8 Combat Depth: veterancy chevrons + tiered destruction visuals and audio
Claude +1: Claude Sonnet 5Unverified signaturePresentation half of the veterancy/tiered-destruction proposals (the sim half landed in the previous commit): - renderUnits.js's drawUnits overlay pass stamps a small chevron stack above the health bar for any unit at rankMults(unit).rank > 0 — either owner (an enemy veteran's rank is intel, same as its hostile pip), and independent of drawHealthBar's own "hide at full hp" rule since a rank is a permanent trait, not a damage state. - effects.js's addDeathFlash now carries the killed entity's radius/kind (defaulting to a small-hull baseline for back-compat), and scales the death flash's own lifetime by both: a bigger hull lingers longer (clamped 0.7x-2.2x), and a building's slower collapse gets an extra 1.6x on top. renderEffects.js's death-ring draw scales its radius/width off the same baseline, flings a few outward debris shards for a hull at or above the debris threshold (radius 10 — Breacher and up), and draws a building as a slower two-ring collapse (a laggi…d213ade -
Colossus splash: def-driven area damage as the T3 anti-mass verb
Claude +1: Claude Sonnet 5Unverified signatureAdds a generic def.splash = {radius, frac} mechanic and puts it on the Colossus (radius 26, 50% falloff damage), giving T3 a real answer to "spread out vs artillery" that punishes separation.js's own same-owner unit packing — until now every T3 unit was single-target, so clumped deathballs were never punished by anything. engine/combat.js: performAttack's new applySplash helper runs after the primary hit lands. It mirrors acquireTarget's own grid/full-scan idiom (queryNeighbors(state.unitGrid, ...) when a grid exists, else a plain scan over state.units.values()) and, by construction, walks only state.unitGrid/state.units — never state.buildings — so splash can never reach a building or the attacker's own side, however close either stands to the impact point. The primary target itself is excluded from its own splash (it already took the full direct hit). HP is subtracted for every splash victim in one pass before any death is resolved, so the outcome never depends on queryNeighbors' it…8f2921c -
HUD alerts + selection UX: minimap attack pings, base cycling, idle-production chip, Alt-subtract
Claude +1: Claude Sonnet 5Unverified signatureThree related input.js proposals landed as one coherent pass, per the roadmap's Phase 3 UX grouping (docs/improvement-proposals.md lines 351-372, 563-572): - Attack pings on the minimap plus a jump-to-last-alert key: effects.js exports activePings() (the same under-attack pings addUnderAttackPing already feeds, kept alive far longer via a new MINIMAP_PING_LIFETIME_MS so the minimap can still show them once the world-space ping and the banner have faded); minimap.js draws pulsing red rings for them; boot.js threads activePings() into its drawMinimap call and moves the remembered attack site onto game.lastAttackAt (session.js, next to supplyBlockedUntil, which already crosses this exact module boundary) so input.js's new Backspace binding can jump to it too, not just the banner's own click handler. - Space cycles bases and an idle-production topbar chip: centerOnBase() used to always land on the first completed Command Center a .find() happened to hit; repeated presses wi…18ec8e7 -
Telegraph counter-triangle hits: bonus flag, hotter tracers, HUD counter text
Claude +1: Claude Sonnet 5Unverified signatureMerges "Counter-triangle telegraphs" and "Surface the counter-triangle on unit buttons and selection rows" into one readability feature, per the roadmap. - engine/combat.js: performAttack stamps bonus:true on the attackHit event whenever the attacker's bonusVs counters the target's type (scoped to the per-type hard counter only, distinct from the pre-existing heavy flag's class-wide siege bonus). Zero sim effect - UI-only field. - effects.js/boot.js: addTracer takes the bonus flag through from the event. - renderEffects.js: a bonus tracer renders hotter (shade()'d toward white) and thicker, with a bigger/hotter impact spark. - hudSelection.js: unitTip() appends "strong vs / falls to" lines derived from UNITS[].bonusVs (+ "structures" for bonusVsBuildings) via a hoisted reverse index (COUNTERED_BY), same idiom as ALL_COSTS and aiMilitary.js's own COUNTER_OF. The aggregated multi-type selection rows get the same "falls to" suffix (shared summaryRowLabel() feeds both the …0056365
-
Add a fuse delay to the Helium Bomb and slow the shockwave further (#12)
Unverified signatureProximity and the player's own "Detonate Now" command now light a 4-second fuse (BOMB_FUSE_DELAY) instead of detonating on the spot; the actual blast follows once the timer comes due, via a new updateBombFuse tick check. Being attacked stays an instant, unrelated trigger. Disarming a bomb also cuts a lit fuse. The proximity trigger distance (BOMB_DETECT_RANGE) is now tied to BOMB_CORE_RADIUS (1.5x the bomb unit's own radius) instead of a distance past the blast radius, so only a point-blank enemy sets it off. Adds a pulsing amber warning ring + a distinct beep cue while the fuse burns, and slows the shockwave ring's travel by a further 20% for more dramatic pacing. Updates the HUD panel text and persistence (fuseUntil survives save/load, sanitized like armed) accordingly. Co-authored-by: Claude <noreply@anthropic.com>c1ba8ce -
Give the Helium Bomb distance-based damage falloff and a slow shockwave (#11)
Unverified signatureReplace the flat "erase everything within blast radius" kill with a distance-squared decay of HP loss: entities within BOMB_CORE_RADIUS (1.5x the bomb's own radius) still take a guaranteed-kill hit, but damage tapers off with the square of distance beyond that, reaching zero at BOMB_BLAST_RADIUS. Blast-killed entities still grant no salvage, same as before. Also slows and reworks the detonation VFX into a dramatic, decelerating shockwave ring that crawls out to the true blast radius and cools from a hot core color to ash-grey at the tapering edge, echoing the new damage curve. Updates the HUD panel text and test suite to match. Co-authored-by: Claude <noreply@anthropic.com>33fe16b
-
Add the Helium Bomb: a mobile, arm-then-detonate doomsday unit
Claude +1: Claude Sonnet 5Unverified signatureA new Odyssey unit (engine/entities.js UNITS.heliumbomb), built at the Star Dock alongside the Leviathan, costed entirely in the three named materials: gas (Helium-3), antimatter, and plasmatorp (Plasma Torpedoes) - all three already-real commodities, no new economy pieces needed. Lifecycle: built UNARMED (safe to move anywhere, no different from any other unit) - the player ARMS it via a HUD toggle (hudSelection.js, same direct-mutation pattern as the Mender's auto-repair switch) - once armed, it detonates the instant any of three triggers fires: - it's attacked at all (combat.js's performAttack calls engine/bomb.js's detonateIfAttacked before applying normal damage - any hit sets it off instead of chipping its hp) - a live enemy unit or building comes within BOMB_DETECT_RANGE (checked once per tick from sim.js for every role:"bomb" unit) - the player clicks "Detonate Now" (calls detonateBomb directly) All three funnel through the one detonateBomb() function in the …53d4247
-
Odyssey: 3-tier Spaceport (supply-capacity jumps), no wins, milestone fireworks
Claude +1: Claude Opus 4.8Unverified signatureThree changes to the open-world Odyssey, per request. 3-tier Spaceport with population-limited jumps: - A Spaceport now has a tier (1..3), upgradeable in place for escalating ore (upgradeSpaceport), like the Capital fortification. Its jump capacity — measured in ship POPULATION (supply), not head-count — scales 12 → 24 → 40. - A jump lifts only up to the pad's capacity (jumpManifest, closest-to-the-pad first, skip-not-break fill); a fleet larger than that crosses over several jumps, the overflow waiting at the origin pad. jumpCapital carries the manifest and reports what it left behind. - HUD: tier + capacity line, a live staged-fleet manifest (what lifts, what waits), and an upgrade button. render.js draws tier pips on the pad. No win conditions — play forever: - The Antimatter Gate and Domination no longer END the run. checkGalaxyProgress and checkDomination now emit one-time progress milestones instead of a victory; checkEndlessWin is suppressed for galaxy states (…947d9db
-
Tier 3: repeated AI waves + counter-building, combat feedback, minimap, build validation
Claude +1: Claude Sonnet 5Unverified signatureAI: - Replace the one-shot attack flag with a home-army/committed-army split, so the AI launches repeated waves for the rest of the match instead of attacking exactly once and then sitting on an ever-growing army. - Every third unit built reacts to whatever combat type the player fields most, building its hard counter (derived from the bonusVs tables, not hardcoded) instead of blindly following the archetype's mix -- the Skiff/Bastion/Lancer triangle now actually matters to the AI's play. Combat feedback: - attackHit/entityKilled sim events now carry enough info for a new effects.js (transient, client-side) to drive tracer lines and death flashes, drained each render frame the same way sound events already were. Situational awareness: - A minimap (fog, deposits, units/buildings, camera viewport) that doubles as a click-to-jump camera shortcut. - An "Under Attack" banner + alarm sound + world/minimap ping when the AI lands a hit on the player, throttled so a siege …cae3dc6