UNPKG

@slippi/slippi-js

Version:
191 lines (188 loc) 5.72 kB
'use strict'; // We don't want to use an enum here because it's not a good fit for the use case. // Different animations can have the same ID, so we need to use a constant object instead. const State = { // Animation ID ranges DAMAGE_START: 0x4b, DAMAGE_END: 0x5b, CAPTURE_START: 0xdf, CAPTURE_END: 0xe8, GUARD_START: 0xb2, GUARD_END: 0xb6, GROUNDED_CONTROL_START: 0xe, GROUNDED_CONTROL_END: 0x18, SQUAT_START: 0x27, SQUAT_END: 0x29, DOWN_START: 0xb7, DOWN_END: 0xc6, TECH_START: 0xc7, TECH_END: 0xcc, DYING_START: 0x0, DYING_END: 0xa, CONTROLLED_JUMP_START: 0x18, CONTROLLED_JUMP_END: 0x22, GROUND_ATTACK_START: 0x2c, GROUND_ATTACK_END: 0x40, AERIAL_ATTACK_START: 0x41, AERIAL_LANDING_START: 0x46, AERIAL_LANDING_END: 0x4a, ATTACK_FTILT_START: 0x33, ATTACK_FTILT_END: 0x37, ATTACK_FSMASH_START: 0x3a, ATTACK_FSMASH_END: 0x3e, // Animation ID specific ROLL_FORWARD: 0xe9, ROLL_BACKWARD: 0xea, SPOT_DODGE: 0xeb, AIR_DODGE: 0xec, ACTION_WAIT: 0xe, ACTION_DASH: 0x14, ACTION_KNEE_BEND: 0x18, GUARD_ON: 0xb2, TECH_MISS_UP: 0xb7, JAB_RESET_UP: 0xb9, TECH_MISS_DOWN: 0xbf, JAB_RESET_DOWN: 0xc1, NEUTRAL_TECH: 0xc7, FORWARD_TECH: 0xc8, BACKWARD_TECH: 0xc9, WALL_TECH: 0xca, MISSED_WALL_TECH: 0xf7, DASH: 0x14, TURN: 0x12, LANDING_FALL_SPECIAL: 0x2b, JUMP_FORWARD: 0x19, JUMP_BACKWARD: 0x1a, FALL: 0x1d, FALL_FORWARD: 0x1e, FALL_BACKWARD: 0x1f, GRAB: 0xd4, DASH_GRAB: 0xd6, GRAB_WAIT: 0xd8, PUMMEL: 0xd9, CLIFF_CATCH: 0xfc, THROW_UP: 0xdd, THROW_FORWARD: 0xdb, THROW_DOWN: 0xde, THROW_BACK: 0xdc, DAMAGE_FALL: 0x26, ATTACK_JAB1: 0x2c, ATTACK_JAB2: 0x2d, ATTACK_JAB3: 0x2e, ATTACK_JABM: 0x2f, ATTACK_DASH: 0x32, ATTACK_UTILT: 0x38, ATTACK_DTILT: 0x39, ATTACK_USMASH: 0x3f, ATTACK_DSMASH: 0x40, AERIAL_NAIR: 0x41, AERIAL_FAIR: 0x42, AERIAL_BAIR: 0x43, AERIAL_UAIR: 0x44, AERIAL_DAIR: 0x45, AERIAL_NAIR_LANDING: 0x46, AERIAL_FAIR_LANDING: 0x47, AERIAL_BAIR_LANDING: 0x48, AERIAL_UAIR_LANDING: 0x49, AERIAL_DAIR_LANDING: 0x4a, TEETER: 0xf5, // Taunts TAUNT_LEFT: 0x108, TAUNT_RIGHT: 0x109, // Weird GnW IDs GNW_JAB1: 0x155, GNW_JABM: 0x156, GNW_DTILT: 0x159, GNW_FSMASH: 0x15a, GNW_NAIR: 0x15b, GNW_BAIR: 0x15c, GNW_UAIR: 0x15d, // Peach FSMASH ID // FSMASH1 = Golf Club, FSMASH2 = Frying Pan, FSMASH3 = Tennis Racket PEACH_FSMASH1: 0x15d, PEACH_FSMASH2: 0x15e, PEACH_FSMASH3: 0x15f, // Command Grabs BARREL_WAIT: 0x125, COMMAND_GRAB_RANGE1_START: 0x10a, COMMAND_GRAB_RANGE1_END: 0x130, COMMAND_GRAB_RANGE2_START: 0x147, COMMAND_GRAB_RANGE2_END: 0x152, }; const Timers = { PUNISH_RESET_FRAMES: 45, RECOVERY_RESET_FRAMES: 45, COMBO_STRING_RESET_FRAMES: 45, }; function getSinglesPlayerPermutationsFromSettings(settings) { if (!settings || settings.players.length !== 2) { // Only return opponent indices for singles return []; } return [ { playerIndex: settings.players[0].playerIndex, opponentIndex: settings.players[1].playerIndex, }, { playerIndex: settings.players[1].playerIndex, opponentIndex: settings.players[0].playerIndex, }, ]; } function didLoseStock(frame, prevFrame) { if (!frame || !prevFrame) { return false; } return prevFrame.stocksRemaining - frame.stocksRemaining > 0; } function isInControl(state) { const ground = state >= State.GROUNDED_CONTROL_START && state <= State.GROUNDED_CONTROL_END; const squat = state >= State.SQUAT_START && state <= State.SQUAT_END; const groundAttack = state > State.GROUND_ATTACK_START && state <= State.GROUND_ATTACK_END; const isGrab = state === State.GRAB; // TODO: Add grounded b moves? return ground || squat || groundAttack || isGrab; } function isTeching(state) { return state >= State.TECH_START && state <= State.TECH_END; } function isDown(state) { return state >= State.DOWN_START && state <= State.DOWN_END; } function isDamaged(state) { return ((state >= State.DAMAGE_START && state <= State.DAMAGE_END) || state === State.DAMAGE_FALL || state === State.JAB_RESET_UP || state === State.JAB_RESET_DOWN); } function isGrabbed(state) { return state >= State.CAPTURE_START && state <= State.CAPTURE_END; } // TODO: Find better implementation of 3 seperate ranges function isCommandGrabbed(state) { return (((state >= State.COMMAND_GRAB_RANGE1_START && state <= State.COMMAND_GRAB_RANGE1_END) || (state >= State.COMMAND_GRAB_RANGE2_START && state <= State.COMMAND_GRAB_RANGE2_END)) && state !== State.BARREL_WAIT); } function isDead(state) { return state >= State.DYING_START && state <= State.DYING_END; } function calcDamageTaken(frame, prevFrame) { var _a, _b; const percent = (_a = frame.percent) !== null && _a !== void 0 ? _a : 0; const prevPercent = (_b = prevFrame.percent) !== null && _b !== void 0 ? _b : 0; return percent - prevPercent; } exports.State = State; exports.Timers = Timers; exports.calcDamageTaken = calcDamageTaken; exports.didLoseStock = didLoseStock; exports.getSinglesPlayerPermutationsFromSettings = getSinglesPlayerPermutationsFromSettings; exports.isCommandGrabbed = isCommandGrabbed; exports.isDamaged = isDamaged; exports.isDead = isDead; exports.isDown = isDown; exports.isGrabbed = isGrabbed; exports.isInControl = isInControl; exports.isTeching = isTeching;