UNPKG

@slippi/slippi-js

Version:
60 lines (56 loc) 2.66 kB
'use strict'; var types = require('../types.cjs'); var exists = require('../utils/exists.cjs'); // The Target item's in-game ID const TARGET_ITEM_TYPE_ID = 209; class TargetBreakComputer { constructor() { this.targetBreaks = []; this.isTargetTestGame = false; } setup(settings) { // Reset the state this.targetBreaks = []; this.isTargetTestGame = settings.gameMode === types.GameMode.TARGET_TEST; } processFrame(frame, allFrames) { if (!this.isTargetTestGame) { return; } handleTargetBreak(allFrames, frame, this.targetBreaks); } fetch() { return this.targetBreaks; } } function handleTargetBreak(frames, frame, targetBreaks) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const currentFrameNumber = frame.frame; const prevFrameNumber = currentFrameNumber - 1; // Add all targets on the first frame if (currentFrameNumber === types.Frames.FIRST) { const targets = (_c = (_b = (_a = frames[types.Frames.FIRST]) === null || _a === void 0 ? void 0 : _a.items) === null || _b === void 0 ? void 0 : _b.filter((item) => item.typeId === TARGET_ITEM_TYPE_ID)) !== null && _c !== void 0 ? _c : []; targets.forEach((target) => { targetBreaks.push({ spawnId: target.spawnId, frameDestroyed: undefined, positionX: target.positionX, positionY: target.positionY, }); }); } const currentTargets = (_f = (_e = (_d = frames[currentFrameNumber]) === null || _d === void 0 ? void 0 : _d.items) === null || _e === void 0 ? void 0 : _e.filter((item) => item.typeId === TARGET_ITEM_TYPE_ID)) !== null && _f !== void 0 ? _f : []; const previousTargets = (_j = (_h = (_g = frames[prevFrameNumber]) === null || _g === void 0 ? void 0 : _g.items) === null || _h === void 0 ? void 0 : _h.filter((item) => item.typeId === TARGET_ITEM_TYPE_ID)) !== null && _j !== void 0 ? _j : []; const currentTargetIds = currentTargets.map((item) => item.spawnId).filter(exists.exists); const previousTargetIds = previousTargets.map((item) => item.spawnId).filter(exists.exists); // Check if any targets were destroyed const brokenTargetIds = previousTargetIds.filter((id) => !currentTargetIds.includes(id)); brokenTargetIds.forEach((id) => { // Update the target break const targetBreak = targetBreaks.find((targetBreak) => targetBreak.spawnId === id); if (targetBreak) { targetBreak.frameDestroyed = currentFrameNumber; } }); } exports.TargetBreakComputer = TargetBreakComputer;