slp-enforcer
Version:
Finds violations of the Melee Controller Ruleset by inspecting SLP files
223 lines (222 loc) • 12.4 kB
JavaScript
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const globals_1 = require("@jest/globals");
const index_1 = require("../index");
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
globals_1.test('Float equals allow a tiny bit of wiggle room', () => {
globals_1.expect(index_1.FloatEquals(0.8, 0.8)).toEqual(true);
globals_1.expect(index_1.FloatEquals(0.8, 0.7999)).toEqual(true);
globals_1.expect(index_1.FloatEquals(-0.7, -0.7000000000001)).toEqual(true);
globals_1.expect(index_1.FloatEquals(0.8, -0.8)).toEqual(false);
});
globals_1.test('Get target coords', () => {
var coords = [];
globals_1.expect(index_1.getTargetCoords(coords).length).toEqual(0);
coords.push({ x: 0, y: 0 });
coords.push({ x: -1, y: 0 });
coords.push({ x: 1, y: 0 });
coords.push({ x: -1, y: 0 });
coords.push({ x: 1, y: 0 });
coords.push({ x: 1, y: 0 });
coords.push({ x: 1, y: 0 });
coords.push({ x: 1, y: 0 });
coords.push({ x: 0.5, y: 0.5 });
coords.push({ x: 1, y: 0.5 });
coords.push({ x: 1, y: 0.5 });
coords.push({ x: 1, y: 0.5 });
var targets = index_1.getTargetCoords(coords);
globals_1.expect(targets.length).toEqual(2);
});
globals_1.test('Get unique coords', () => {
var coords = [];
globals_1.expect(index_1.getUniqueCoords(coords).length).toEqual(0);
coords.push({ x: 0, y: 0 });
coords.push({ x: -1, y: 0 });
coords.push({ x: 1, y: 0 });
coords.push({ x: -1, y: 0 });
coords.push({ x: 1, y: 0 });
coords.push({ x: 1, y: 0 });
coords.push({ x: 1, y: 0 });
coords.push({ x: 1, y: 0 });
coords.push({ x: 0.5, y: 0.5 });
coords.push({ x: 1, y: 0.5 });
coords.push({ x: 1, y: 0.5 });
coords.push({ x: 1, y: 0.5 });
var targets = index_1.getUniqueCoords(coords);
globals_1.expect(targets.length).toEqual(5);
});
globals_1.test('Is box inputs? Pikachu game', () => {
// Game 1. Read from an SLP file now. Confirmed box player
let data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/digital/should_count_as_box/Game_20250201T124602.slp'), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
let gameCoords = index_1.getCoordListFromGame(game, 1, true);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(true);
});
globals_1.test('Is box inputs?', () => {
// Game 1. Read from an SLP file now. Confirmed box player
var data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/digital/techno_p1/Steech_vs_techno_G1.slp'), null);
var game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
var gameCoords = index_1.getCoordListFromGame(game, 0, true);
var uniqueCoords = index_1.getUniqueCoords(gameCoords);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(true);
// Game 2
var data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/digital/techno_p1/Steech_vs_techno_G2.slp'), null);
var game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
var gameCoords = index_1.getCoordListFromGame(game, 0, true);
var uniqueCoords = index_1.getUniqueCoords(gameCoords);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(true);
// Game 3
var data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/digital/techno_p1/Steech_vs_techno_G3.slp'), null);
var game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
var gameCoords = index_1.getCoordListFromGame(game, 0, true);
var uniqueCoords = index_1.getUniqueCoords(gameCoords);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(true);
// Game 4
var data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/digital/techno_p1/Steech_vs_techno_G4.slp'), null);
var game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
var gameCoords = index_1.getCoordListFromGame(game, 0, true);
var uniqueCoords = index_1.getUniqueCoords(gameCoords);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(true);
// Game 5
var data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/digital/techno_p1/Steech_vs_techno_G5.slp'), null);
var game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
var gameCoords = index_1.getCoordListFromGame(game, 0, true);
var uniqueCoords = index_1.getUniqueCoords(gameCoords);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(true);
// Confirmed GCC player
data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/analog/traveltime/Game_8C56C529AEAA_20231022T181554.slp'), null);
var game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
var gameCoords = index_1.getCoordListFromGame(game, 3, true);
globals_1.expect(gameCoords.length).toBeGreaterThan(0);
var uniqueCoords = index_1.getUniqueCoords(gameCoords);
globals_1.expect(uniqueCoords.length).toBeGreaterThan(13);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(false);
});
globals_1.test('Is box inputs? Potion dataset', () => {
for (let i = 1; i <= 7; i++) {
let data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/digital/potion_p3/potion_' + i + '.slp'), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
let gameCoords = index_1.getCoordListFromGame(game, 2, true);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(true);
}
});
globals_1.test('Is box inputs? Orca dataset A', () => {
let data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/analog/orca/Game_20241228T175942.slp'), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
let gameCoords = index_1.getCoordListFromGame(game, 0, true);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(false);
});
globals_1.test('Is box inputs? Orca dataset B', () => {
let data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/analog/orca/Game_20241228T180350.slp'), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
let gameCoords = index_1.getCoordListFromGame(game, 0, true);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(false);
});
globals_1.test('Is box inputs? Orca dataset C', () => {
let data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/analog/orca/Game_20241228T180707.slp'), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
let gameCoords = index_1.getCoordListFromGame(game, 0, true);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(false);
});
globals_1.test('Is box inputs? Orca dataset D', () => {
let data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/analog/orca/Game_20241228T180831.slp'), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
let gameCoords = index_1.getCoordListFromGame(game, 0, true);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(false);
});
globals_1.test('Is box inputs? Orca dataset E', () => {
let data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/analog/orca/Game_20241228T181133.slp'), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
let gameCoords = index_1.getCoordListFromGame(game, 0, true);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(false);
});
globals_1.test('Is box inputs? xbox controller A', () => {
let data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/analog/xbox_p2/Game_20250209T181347.slp'), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
let gameCoords = index_1.getCoordListFromGame(game, 1, true);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(false);
});
globals_1.test('Is box inputs? xbox controller B', () => {
let data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/analog/xbox_p2/Game_20250209T183921.slp'), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).not.toBeNull();
let gameCoords = index_1.getCoordListFromGame(game, 1, true);
globals_1.expect(index_1.isBoxController(gameCoords)).toEqual(false);
});
globals_1.test('Parse replay file correctly', () => {
var _a, _b;
const data = fs.readFileSync(path.join(__dirname, '../../test_data/banned_c_stick_analog_player_1.slp'), null);
const game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(game).toBeDefined();
var frames = game.getFrames();
for (let frame = -123; frame < 1111; frame++) {
globals_1.expect((_a = frames[frame].players[0]) === null || _a === void 0 ? void 0 : _a.pre.frame).toEqual(frame);
}
globals_1.expect((_b = frames[500].players[0]) === null || _b === void 0 ? void 0 : _b.post.internalCharacterId).toEqual(0x0A);
});
globals_1.test('Process main stick inputs', () => {
var _a, _b, _c, _d;
globals_1.expect(index_1.isEqual(index_1.processAnalogStick({ x: 0, y: 0 }, false), { x: 0, y: 0 })).toEqual(true);
globals_1.expect(index_1.isEqual(index_1.processAnalogStick({ x: 0, y: -80 }, false), { x: 0, y: -1 })).toEqual(true);
const data = fs.readFileSync(path.join(__dirname, '../../test_data/legal/digital/techno_p1/Steech_vs_techno_G1.slp'), null);
const game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
var frames = game.getFrames();
for (let frame = -123; frame < 1794; frame++) {
let x = (_a = frames[frame].players[0]) === null || _a === void 0 ? void 0 : _a.pre.rawJoystickX;
let y = (_b = frames[frame].players[0]) === null || _b === void 0 ? void 0 : _b.pre.rawJoystickY;
let rawCoord = index_1.processAnalogStick({ x: x, y: y }, true);
let processedX = (_c = frames[frame].players[0]) === null || _c === void 0 ? void 0 : _c.pre.joystickX;
let processedY = (_d = frames[frame].players[0]) === null || _d === void 0 ? void 0 : _d.pre.joystickY;
let processedCoord = { x: processedX, y: processedY };
globals_1.expect(index_1.isEqual(processedCoord, rawCoord)).toEqual(true);
}
});
globals_1.test('Is handwarmer? (A)', async () => {
const slpDir = path.join(__dirname, '../../test_data/legal/digital/techno_p1');
const files = await fs.promises.readdir(slpDir);
for (const filename of files) {
let data = fs.readFileSync(path.join(slpDir, filename), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(index_1.isHandwarmer(game)).toEqual(false);
}
});
globals_1.test('Is handwarmer? (B)', async () => {
const handwarmerDir = path.join(__dirname, '../../test_data/handwarmers/');
const handwarmerFiles = await fs.promises.readdir(handwarmerDir);
for (const filename of handwarmerFiles) {
let data = fs.readFileSync(path.join(handwarmerDir, filename), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(index_1.isHandwarmer(game)).toEqual(true);
}
});
globals_1.test('Is handwarmer? (C)', async () => {
let data = fs.readFileSync(path.join(__dirname, '../../test_data/doubles_match_1.slp'), null);
let game = new index_1.SlippiGame(index_1.toArrayBuffer(data));
globals_1.expect(index_1.isHandwarmer(game)).toEqual(false);
});
globals_1.test('List checks', () => {
let checks = index_1.ListChecks();
globals_1.expect(checks.length).toEqual(7);
});