From 2dc9bba7f988a52d8e26df66f4c43b5e14fa84d9 Mon Sep 17 00:00:00 2001 From: Admin Date: Fri, 18 Sep 2026 01:10:42 +0000 Subject: [PATCH] Add per-broadside player damage reducer --- src/game-logic.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/game-logic.js b/src/game-logic.js index dad284c..32b1831 100644 --- a/src/game-logic.js +++ b/src/game-logic.js @@ -67,3 +67,47 @@ export const processQueuedPlayerHits = ({ maxHull, }); }; + +export const reducePlayerVolleyHits = ({ + hull, + hits, + seenVolleyIds = [], + maxHull = PLAYER_MAX_HULL, + fallbackDamage = DEFAULT_PIRATE_SHOT_DAMAGE, + maxSeenVolleys = 128, +}) => { + const seen = new Set(seenVolleyIds); + const acceptedHits = []; + const ignoredHits = []; + let totalDamage = 0; + + for (const hit of hits) { + const volleyId = hit?.volleyId ?? null; + + if (volleyId !== null && seen.has(volleyId)) { + ignoredHits.push(hit); + continue; + } + + if (volleyId !== null) seen.add(volleyId); + acceptedHits.push(hit); + totalDamage += normalizePlayerDamage(hit?.damage, fallbackDamage); + } + + while (seen.size > maxSeenVolleys) { + const oldest = seen.values().next().value; + seen.delete(oldest); + } + + const currentHull = Number.isFinite(hull) ? hull : maxHull; + const nextHull = Math.max(0, currentHull - totalDamage); + + return { + hull: nextHull, + totalDamage, + acceptedHits, + ignoredHits, + seenVolleyIds: seen, + gameOver: nextHull <= 0, + }; +};