Extract testable combat hit logic
This commit is contained in:
parent
545e94dddc
commit
f03ff1e0cd
51
src/game-logic.js
Normal file
51
src/game-logic.js
Normal file
@ -0,0 +1,51 @@
|
||||
export const PLAYER_MAX_HULL = 100;
|
||||
export const DEFAULT_PIRATE_SHOT_DAMAGE = 6;
|
||||
export const PLAYER_HIT_COOLDOWN_MS = 300;
|
||||
|
||||
export const normalizePlayerDamage = (
|
||||
rawDamage,
|
||||
fallback = DEFAULT_PIRATE_SHOT_DAMAGE,
|
||||
) => {
|
||||
const parsed = Number(rawDamage);
|
||||
const value = Number.isFinite(parsed) ? parsed : fallback;
|
||||
return Math.max(1, Math.min(25, value));
|
||||
};
|
||||
|
||||
export const reducePlayerHitQueue = ({
|
||||
hull,
|
||||
lastHitAt,
|
||||
now,
|
||||
damages,
|
||||
cooldownMs = PLAYER_HIT_COOLDOWN_MS,
|
||||
maxHull = PLAYER_MAX_HULL,
|
||||
}) => {
|
||||
let nextHull = Number.isFinite(hull) ? hull : maxHull;
|
||||
let nextLastHitAt = Number.isFinite(lastHitAt) ? lastHitAt : -Infinity;
|
||||
let appliedHits = 0;
|
||||
let ignoredHits = 0;
|
||||
let totalDamage = 0;
|
||||
|
||||
for (const rawDamage of damages) {
|
||||
if (now - nextLastHitAt < cooldownMs) {
|
||||
ignoredHits += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
const damage = normalizePlayerDamage(rawDamage);
|
||||
nextLastHitAt = now;
|
||||
nextHull = Math.max(0, nextHull - damage);
|
||||
totalDamage += damage;
|
||||
appliedHits += 1;
|
||||
|
||||
if (nextHull <= 0) break;
|
||||
}
|
||||
|
||||
return {
|
||||
hull: nextHull,
|
||||
lastHitAt: nextLastHitAt,
|
||||
appliedHits,
|
||||
ignoredHits,
|
||||
totalDamage,
|
||||
gameOver: nextHull <= 0,
|
||||
};
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user