- Add `bulletHoming` config section and `stepHomingBullets` pass so Mindweave bolts/shells bend toward the nearest live hostile for a capped duration (turn-rate limited, range-limited, own-wing exempt)
- Extend telekinetic wave (`stepTkwaves`) to shove/pull every hostile craft in radius, not just the player; own wing and cloaked craft are excluded
- Extend illusion pop rule so rival-faction enemy tracers can pop their own court's phantoms (all-hostile), while own-wing bolts pass through and unclaimed courts remain player-only
- Tag illusions and tkwaves with `factionId` to support the all-hostile targeting rules
- Switch apex_mauler weapon from single "lance" to 3-bolt "burst" pattern (16 dmg each, fan 0.12 rad) per updated design comment
- Add `dev/faction-battle-sim.mjs`: headless Node harness that runs the real combat stack with Phaser stubs to fight random faction compositions and print win/loss + power reports
- 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.
- 8 new enemy types (frames 50–57) split 4/4: combo seekers fire flank-angle homing missiles with capped turn-rate; elementals throw darts that bloom into growing, damage-ticking electrified zones
- Balance follows the faction rule (2× damage, 3.5× armor vs pirate raider), documented in combat.json comments
- New `flank_barrage` and `shock_dart` abilities in EnemyAbilities.js with shared `stepShock` frame step wired into CombatSystem.update
- Generalized `_combatBootMode` to accept any id from `factionIds()` so new factions need no code change
- Painted frames 50–57 in ships-enemy.png/.psd; added capital-mindweave-surface-01 reference art
- Tests: dev/zenith.test.mjs (Node), dev/zenith-arena-browser.mjs (Playwright), updated combat.test.mjs roster and sheet-art checks, extended cdp-faction-arena.mjs with zenith tab
- 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