@slippi/slippi-js
Version:
Official Project Slippi Javascript SDK
191 lines (188 loc) • 5.72 kB
JavaScript
'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;