feat: implement regular enemy defenses — armor, barrier, dodge (spec §5.2)
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s

- Add applyEnemyDefenses() pipeline: dodge → barrier → armor for ALL enemies
- Add speed room + agile additive dodge (capped at 0.75, spec §4.5)
- Add mage barrier recharge per tick (spec §5.2)
- Add effectiveArmor support for armor_corrode debuff compatibility
- Pass enemy defense context via closure (no signature changes to onDamageDealt)
- Add 16 regression tests for defense mechanics
- All 921 tests pass (45 test files)
This commit is contained in:
2026-06-03 14:27:14 +02:00
parent 1b4e5cf5ac
commit 7c0e740226
4 changed files with 453 additions and 8 deletions
+15 -1
View File
@@ -25,6 +25,7 @@ import { buildTickContext, applyTickWrites } from './tick-pipeline';
import { processEnchantingTicks } from './pipelines/enchanting-tick';
import type { TickContext, TickWrites } from './tick-pipeline';
import type { GameCoordinatorState } from './gameStore.types';
import type { EnemyState } from '../types';
export interface GameCoordinatorStore extends GameCoordinatorState {
tick: () => void;
@@ -296,10 +297,23 @@ export const useGameStore = create<GameCoordinatorStore>()(
const combatCbs = buildCombatCallbacks({
ctx, effects, maxMana, addLog, useCombatStore, usePrestigeStore,
});
// Mage barrier recharge (spec §5.2) — recharge before building defense ctx
const roomEnemies = ctx.combat.currentRoom?.enemies ?? [];
const primaryEnemy = roomEnemies[0] ?? null;
const rechargedEnemy = combatCbs.applyMageBarrierRecharge(primaryEnemy);
const activeEnemy = rechargedEnemy ?? primaryEnemy;
// Build enemy defense context for this tick (spec §5.2)
const defCtx = {
roomType: ctx.combat.currentRoom?.roomType ?? 'combat',
enemy: activeEnemy,
};
const combatResult = useCombatStore.getState().processCombatTick(
rawMana, elements, maxMana, 1,
combatCbs.onFloorCleared,
combatCbs.makeOnDamageDealt(() => rawMana, () => elements),
combatCbs.makeOnDamageDealt(() => rawMana, () => elements, defCtx, addLog),
ctx.prestige.signedPacts,
);