- Bullets and seekers now carry their shooter's factionId so a
faction's fire drops rival-faction craft but never its own wing
(classic pack bolts/seekers are unaffected)
- NPC kills via crossfire are silent: no kill count, XP, defeat comm,
or screen shake — the war is the world's, not the player's ledger
- Survivors of a neutral-to-player side peel off once their rivals are
spent, clearing the sky for the director's cadence
- Bump faction cooldown to 40–60 s and update data/encounters tests
- Faction space now deploys the local faction AND one rival as hostile groups
(previously only an opposing faction attacked, local was allies), with both
sized off the level band.
- Each ship's hostility toward the player is stamped from reputation standing
vs `encounters.faction.hostileBelow`; neutral factions are observe-only —
untargetable by guns/skills/escort fire, their bolts/seekers/rams fizzle past
the ship, and they peel off once rivals are spent.
- Add faction-space encounter timers (tighter roll interval + cooldown) in
`encounters.faction`, applied via `ctx.faction` in the director.
- Route all player-targeting paths through a new `_playerPool()`/
`playerTargetable()` gate; add `_peelOff` disengage and rival-live check.
- Update tests for the two-group compose, disposition, and faction timers.
- Register 8 Apex (frames 30-37) and 8 Mindweave (frames 40-47) in
data/combat.json enemyTypes at 2x damage / 3.5x armor vs the pirate,
each with a distinct weapon pattern and ability kit
- New shared skill layer (js/combat/EnemyAbilities.js): cloaked ambush,
flank strafe, blink reposition, illusion decoys, telekinetic waves;
wired into CombatSystem update/collide with cloak gating on fire,
targeting, and player skills
- Add sweep/spiral/shell weapon patterns in js/combat/Weapons.js
- New ?combat=apex / ?combat=mindweave duel arena with an in-game
DuelPicker (keys 1-8 / click, 0 = whole pack); plain ?combat demo
unchanged
- Paint the 16 missing spritesheet frames (ships-enemy.png) so the
fighters are visible; add a PNG alpha regression test guarding against
blank cells
- Add dev/cdp-faction-arena.mjs CDP smoke check and extend
dev/combat.test.mjs with faction roster, balance, ability, duel, and
sheet-pixel checks
- New EncounterDirector (js/combat/Encounters.js): pure, data-driven clock that rolls pirate / neutral / mixed encounters in neutral non-home systems on a ~45–90s interval at 50–60% chance, one at a time with a 30–60s cooldown, never during a live wave run or on a downed player.
- Neutral ally ships (js/combat/NeutralShip.js) on spritesheet frames 20–27: escort the player for a per-ship 10–15s window, engage the nearest pirate in mixed fights, then break off and fly off-screen; player-safe by construction (never targeted or damaged by ally bolts/seekers).
- Pirate targeting generalized so hostiles can draw aggro onto escorts when the player is out of range; escort and pirate bolts/missiles collide with each other but not the player.
- Group size scales with combat level (1–2 low → 4–5 high, bands in data/combat.json); encounter hostiles are one-shots so the fight ends when the sky clears.
- New 'volley' weapon pattern (wide staggered-speed fan) and owner-tagged bolts/missiles for ally vs enemy routing in Weapons.js.
- Neutral roster config + encounters section added to data/combat.json; EnemyTypes gains neutralTypeConfig/Ids/SheetList.
- Tests: dev/encounters.test.mjs (cadence, gate, weights, size bands), dev/neutral.test.mjs (roster, escort AI, targeting, no friendly fire), plus combat/xp test updates; CDP probes and encounter-hud-check for in-browser HUD verification.
- New hostiles frames 1–7 (bomber → warden) with distinct stats and
monotonic difficulty ramp in data/combat.json
- Shared js/combat/Weapons.js dispatch for lance, spray, burst, rapid,
ring, missile, and combo patterns used by both combat contexts
- New dodgeable heat-seeking Missile (capped turn-rate homing) plus pure
geometry helpers in Combat.js
- Rewire ?combat boot to startWaves('combat_demo'): 7 rolling waves, one
type each, 6 ships per wave, 3 concurrent, replacement per kill
- Add missile_fire SFX voice and extend tests/CDP demo checks for all
patterns and the full wave run