UNPKG

deadem

Version:

JavaScript (Node.js & Browsers) parser for Deadlock (Valve Source 2 Engine) demo/replay files

306 lines (273 loc) 13.3 kB
import Assert from '#core/Assert.js'; import BitBuffer from '#core/BitBuffer.js'; import FieldPathBuilder from '#data/fields/path/FieldPathBuilder.js'; const registry = { byCode: new Map() }; class FieldPathOperation { /** * @public * @constructor * @param {String} code * @param {String} name * @param {number} weight * @param {number} sequence * @param {Function|null} executor */ constructor(code, name, weight, sequence, executor) { Assert.isTrue(typeof code === 'string' && code.length > 0); Assert.isTrue(typeof name === 'string' && name.length > 0); Assert.isTrue(Number.isInteger(weight)); Assert.isTrue(Number.isInteger(sequence)); Assert.isTrue(executor === null || typeof executor === 'function'); this._code = code; this._name = name; this._weight = weight; this._sequence = sequence; this._executor = executor; registry.byCode.set(code, this); } /** * @public * @static * @returns {Array<FieldPathOperation>} */ static getAll() { const operations = Array.from(registry.byCode.values()); operations.sort((a, b) => a.sequence - b.sequence); return operations; } /** * @public * @returns {String} */ get code() { return this._code; } /** * @public * @returns {String} */ get name() { return this._name; } /** * @public * @returns {number} */ get weight() { return this._weight; } /** * @public * @returns {number} */ get sequence() { return this._sequence; } /** * @public * @returns {Function|null} */ get executor() { return this._executor; } /** * @public * @static * @returns {FieldPathOperation} */ static get FINISH() { return finish; } } const executor = (callback) => (bitBuffer, fieldPathBuilder) => { Assert.isTrue(bitBuffer instanceof BitBuffer); Assert.isTrue(fieldPathBuilder instanceof FieldPathBuilder); callback(bitBuffer, fieldPathBuilder); }; /* eslint-disable no-unused-vars */ const plusOne = new FieldPathOperation('PLUS_1', 'PlusOne', 36271, 0, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(1); })); const plusTwo = new FieldPathOperation('PLUS_2', 'PlusTwo', 10334, 1, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(2); })); const plusThree = new FieldPathOperation('PLUS_3', 'PlusThree', 1375, 2, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(3); })); const plusFour = new FieldPathOperation('PLUS_4', 'PlusFour', 646, 3, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(4); })); const plusN = new FieldPathOperation('PLUS_N', 'PlusN', 4128, 4, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(bitBuffer.readUVarIntFieldPath() + 5); })); const pushOneLeftDeltaZeroRightZero = new FieldPathOperation('PUSH_1L_D0_R0', 'PushOneLeftDeltaZeroRightZero', 35, 5, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.push(0); })); const pushOneLeftDeltaZeroRightNonZero = new FieldPathOperation('PUSH_1L_D0_R!0', 'PushOneLeftDeltaZeroRightNonZero', 3, 6, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); })); const pushOneLeftDeltaOneRightZero = new FieldPathOperation('PUSH_1L_D1_R0', 'PushOneLeftDeltaOneRightZero', 521, 7, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(1); fieldPathBuilder.push(0); })); const pushOneLeftDeltaOneRightNonZero = new FieldPathOperation('PUSH_1L_D1_R!0', 'PushOneLeftDeltaOneRightNonZero', 2942, 8, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(1); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); })); const pushOneLeftDeltaNRightZero = new FieldPathOperation('PUSH_1L_DN_R0', 'PushOneLeftDeltaNRightZero', 560, 9, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.push(0); })); const pushOneLeftDeltaNRightNonZero = new FieldPathOperation('PUSH_1L_DN_R!0', 'PushOneLeftDeltaNRightNonZero', 471, 10, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(bitBuffer.readUVarIntFieldPath() + 2); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath() + 1); })); const pushOneLeftDeltaNRightNonZeroPack6Bits = new FieldPathOperation('PUSH_1L_DN_R!0_P6B', 'PushOneLeftDeltaNRightNonZeroPack6Bits', 10530, 11, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(bitBuffer.read(3).readUInt8() + 2); fieldPathBuilder.push(bitBuffer.read(3).readUInt8() + 1); })); const pushOneLeftDeltaNRightNonZeroPack8Bits = new FieldPathOperation('PUSH_1L_DN_R!0_P8B', 'PushOneLeftDeltaNRightNonZeroPack8Bits', 251, 12, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(bitBuffer.read(4).readUInt8() + 2); fieldPathBuilder.push(bitBuffer.read(4).readUInt8() + 1); })); const pushTwoLeftDeltaZero = new FieldPathOperation('PUSH_2L_D0', 'PushTwoLeftDeltaZero', 0, 13, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); })); const pushTwoPack5BitsLeftDeltaZero = new FieldPathOperation('PUSH_2P5BL_D0', 'PushTwoPack5BitsLeftDeltaZero', 0, 14, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); })); const pushThreeLeftDeltaZero = new FieldPathOperation('PUSH_3L_D0', 'PushThreeLeftDeltaZero', 0, 15, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); })); const pushThreePack5BitsLeftDeltaZero = new FieldPathOperation('PUSH_3P5BL_D0', 'PushThreePack5BitsLeftDeltaZero', 0, 16, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); })); const pushTwoLeftDeltaOne = new FieldPathOperation('PUSH_2L_D1', 'PushTwoLeftDeltaOne', 0, 17, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(1); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); })); const pushTwoPack5BitsLeftDeltaOne = new FieldPathOperation('PUSH_2P5BL_D1', 'PushTwoPack5BitsLeftDeltaOne', 0, 18, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(1); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); })); const pushThreeLeftDeltaOne = new FieldPathOperation('PUSH_3L_D1', 'PushThreeLeftDeltaOne', 0, 19, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(1); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); })); const pushThreePack5BitsLeftDeltaOne = new FieldPathOperation('PUSH_3P5BL_D1', 'PushThreePack5BitsLeftDeltaOne', 0, 20, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(1); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); })); const pushTwoLeftDeltaN = new FieldPathOperation('PUSH_2L_DN', 'PushTwoLeftDeltaN', 0, 21, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(bitBuffer.readUVarInt() + 2); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); })); const pushTwoPack5BitsLeftDeltaN = new FieldPathOperation('PUSH_2P5BL_DN', 'PushTwoPack5BitsLeftDeltaN', 0, 22, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(bitBuffer.readUVarInt() + 2); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); })); const pushThreeLeftDeltaN = new FieldPathOperation('PUSH_3L_DN', 'PushThreeLeftDeltaN', 0, 23, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(bitBuffer.readUVarInt() + 2); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); })); const pushThreePack5BitsLeftDeltaN = new FieldPathOperation('PUSH_3P5BL_DN', 'PushThreePack5BitsLeftDeltaN', 0, 24, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(bitBuffer.readUVarInt() + 2); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); fieldPathBuilder.push(bitBuffer.read(5).readUInt8()); })); const pushN = new FieldPathOperation('PUSH_N', 'PushN', 0, 25, executor((bitBuffer, fieldPathBuilder) => { const count = bitBuffer.readUVarInt(); fieldPathBuilder.add(bitBuffer.readUVarInt()); for (let i = 0; i < count; i++) { fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); } })); const pushNAndNonTopological = new FieldPathOperation('PUSH_N_!N', 'PushNAndNonTopological', 310, 26, executor((bitBuffer, fieldPathBuilder) => { for (let i = 0; i < fieldPathBuilder.length; i++) { if (bitBuffer.readBit()) { fieldPathBuilder.add(bitBuffer.readVarInt32() + 1, i); } } const count = bitBuffer.readUVarInt(); for (let i = 0; i < count; i++) { fieldPathBuilder.push(bitBuffer.readUVarIntFieldPath()); } })); const popOnePlusOne = new FieldPathOperation('POP_1_PLUS_1', 'PopOnePlusOne', 2, 27, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.drop(1); fieldPathBuilder.add(1); })); const popOnePlusN = new FieldPathOperation('POP_1_PLUS_N', 'PopOnePlusN', 0, 28, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.drop(1); fieldPathBuilder.add(bitBuffer.readUVarIntFieldPath() + 1); })); const popAllButOnePlusOne = new FieldPathOperation('POP_ALL-1_PLUS_1', 'PopAllButOnePlusOne', 1837, 29, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.drop(fieldPathBuilder.length - 1); fieldPathBuilder.add(1); })); const popAllButOnePlusN = new FieldPathOperation('POP_ALL-1_PLUS_N', 'PopAllButOnePlusN', 149, 30, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.drop(fieldPathBuilder.length - 1); fieldPathBuilder.add(bitBuffer.readUVarIntFieldPath() + 1); })); const popAllButOnePlusNPack3Bits = new FieldPathOperation('POP_ALL-1_PLUS_N_P3B', 'PopAllButOnePlusNPack3Bits', 300, 31, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.drop(fieldPathBuilder.length - 1); fieldPathBuilder.add(bitBuffer.read(3).readUInt8() + 1); })); const popAllButOnePlusNPack6Bits = new FieldPathOperation('POP_ALL-1_PLUS_N_P6B', 'PopAllButOnePlusNPack6Bits', 634, 32, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.drop(fieldPathBuilder.length - 1); fieldPathBuilder.add(bitBuffer.read(6).readUInt8() + 1); })); const popNPlusOne = new FieldPathOperation('POP_N_PLUS_1', 'PopNPlusOne', 0, 33, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.drop(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.add(1); })); const popNPlusN = new FieldPathOperation('POP_N_PLUS_N', 'PopNPlusN', 0, 34, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.drop(bitBuffer.readUVarIntFieldPath()); fieldPathBuilder.add(bitBuffer.readVarInt32()); })); const popNAndNonTopographical = new FieldPathOperation('POP_N_!N', 'PopNAndNonTopographical', 1, 35, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.drop(bitBuffer.readUVarIntFieldPath()); for (let i = 0; i < fieldPathBuilder.length; i++) { if (bitBuffer.readBit()) { fieldPathBuilder.add(bitBuffer.readVarInt32(), i); } } })); const nonTopoComplex = new FieldPathOperation('NON_TOPO_COMPLEX', 'NonTopoComplex', 76, 36, executor((bitBuffer, fieldPathBuilder) => { for (let i = 0; i < fieldPathBuilder.length; i++) { if (bitBuffer.readBit()) { fieldPathBuilder.add(bitBuffer.readVarInt32(), i); } } })); const nonTopoPenultimatePlusOne = new FieldPathOperation('NON_TOPO_PEN_PLUS_1', 'NonTopoPenultimatePlusOne', 271, 37, executor((bitBuffer, fieldPathBuilder) => { fieldPathBuilder.add(1, fieldPathBuilder.length - 2); })); const nonTopoComplexPack4Bits = new FieldPathOperation('NON_TOPO_COMPLEX_P4B', 'NonTopoComplexPack4Bits', 99, 38, executor((bitBuffer, fieldPathBuilder) => { for (let i = 0; i < fieldPathBuilder.length; i++) { if (bitBuffer.readBit()) { fieldPathBuilder.add(bitBuffer.read(4).readUInt8() - 7, i); } } })); const finish = new FieldPathOperation('FINISH', 'Finish', 25474, 39, null); export default FieldPathOperation;