feat: implement DoT/debuff runtime system (spec §6, AC-12, AC-13)
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m18s
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m18s
- Add ActiveEffect, EffectType types to game.ts; activeEffects + effectiveArmor on EnemyState - Add SpellOnHitEffect + onHitEffect field to SpellDefinition - Wire onHitEffect to fire (burn), death (curse), lightning (armor_corrode), frost (freeze), soul (bypassArmor burn) - Add applyOnHitEffect() — applies on-hit effect on successful spell hit (spec §6.2) - Add processDoTPhase() — ticks all active effects after weapon/golem attacks (spec §6.3) - Add bypassArmor/bypassBarrier support in applyEnemyDefenses() (AC-13) - Export standalone applyEnemyDefenses from combat-tick.ts for DoT pipeline - Split DoT runtime into separate dot-runtime.ts (135 lines) to keep combat-actions.ts under 400 lines - Update all enemy generation sites with activeEffects/effectiveArmor defaults - Fix test helpers for new required fields All 921 tests pass (45 test files)
This commit is contained in:
@@ -65,6 +65,8 @@ export function generateSwarmEnemies(floor: number): EnemyState[] {
|
||||
dodgeChance: 0,
|
||||
barrier: getEnemyBarrier(floor, element),
|
||||
element,
|
||||
activeEffects: [],
|
||||
effectiveArmor: SWARM_CONFIG.armorBase + Math.floor(floor / 10) * SWARM_CONFIG.armorPerFloor,
|
||||
});
|
||||
}
|
||||
return enemies;
|
||||
|
||||
@@ -110,6 +110,8 @@ export function generateFloorState(floor: number): FloorState {
|
||||
dodgeChance: 0,
|
||||
barrier: 0,
|
||||
element: guardian.element.join('+'),
|
||||
activeEffects: [],
|
||||
effectiveArmor: guardian.armor || 0,
|
||||
}],
|
||||
};
|
||||
|
||||
@@ -132,6 +134,8 @@ export function generateFloorState(floor: number): FloorState {
|
||||
dodgeChance: getDodgeChance(floor),
|
||||
barrier: getEnemyBarrier(floor, element),
|
||||
element,
|
||||
activeEffects: [],
|
||||
effectiveArmor: getFloorArmor(floor),
|
||||
}],
|
||||
};
|
||||
}
|
||||
@@ -164,6 +168,8 @@ export function generateFloorState(floor: number): FloorState {
|
||||
dodgeChance: 0,
|
||||
barrier: getEnemyBarrier(floor, element),
|
||||
element,
|
||||
activeEffects: [],
|
||||
effectiveArmor: getFloorArmor(floor),
|
||||
}],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -111,6 +111,8 @@ export function generateSpireFloorState(floor: number, roomIndex: number, totalR
|
||||
dodgeChance: 0,
|
||||
barrier: 0,
|
||||
element: guardian.element.join('+'),
|
||||
activeEffects: [],
|
||||
effectiveArmor: guardian.armor || 0,
|
||||
}],
|
||||
};
|
||||
}
|
||||
@@ -184,6 +186,8 @@ function generateCombatRoom(floor: number, element: string, baseHP: number): Flo
|
||||
dodgeChance: 0,
|
||||
barrier,
|
||||
element,
|
||||
activeEffects: [],
|
||||
effectiveArmor: armor,
|
||||
}],
|
||||
};
|
||||
}
|
||||
@@ -203,6 +207,8 @@ function generateSwarmRoom(floor: number, element: string, baseHP: number): Floo
|
||||
dodgeChance: 0,
|
||||
barrier: 0,
|
||||
element,
|
||||
activeEffects: [],
|
||||
effectiveArmor: Math.floor(floor / 15) * 0.02,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -224,6 +230,8 @@ function generateSpeedRoom(floor: number, element: string, baseHP: number): Floo
|
||||
dodgeChance,
|
||||
barrier: getSpireEnemyBarrier(floor, element),
|
||||
element,
|
||||
activeEffects: [],
|
||||
effectiveArmor: armor,
|
||||
}],
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user