From 8aea0dba74aecf0846217b5363cd3f9eab543f35 Mon Sep 17 00:00:00 2001 From: TheMas3212 Date: Sun, 24 Sep 2023 20:55:48 +1000 Subject: Finish Input Packets --- src/packets/index.ts | 8 ++-- src/packets/input.ts | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 4 deletions(-) diff --git a/src/packets/index.ts b/src/packets/index.ts index 08ceb79..f2f29c7 100644 --- a/src/packets/index.ts +++ b/src/packets/index.ts @@ -46,10 +46,10 @@ export function parse(type: number, buffer: Uint8Array): TASDPacket { // case PACKET_TYPES.GENESIS_GAME_GENIE_CODE: return XXXXX.fromBuffer(buffer); // Input case PACKET_TYPES.INPUT_CHUNK: return input.InputChunkPacket.fromBuffer(buffer); - // case PACKET_TYPES.INPUT_MOMENT: return XXXXX.fromBuffer(buffer); - // case PACKET_TYPES.TRANSITION: return XXXXX.fromBuffer(buffer); - // case PACKET_TYPES.LAG_FRAME_CHUNK: return XXXXX.fromBuffer(buffer); - // case PACKET_TYPES.MOVIE_TRANSITION: return XXXXX.fromBuffer(buffer); + case PACKET_TYPES.INPUT_MOMENT: return input.InputMomentPacket.fromBuffer(buffer); + case PACKET_TYPES.TRANSITION: return input.TransitionPacket.fromBuffer(buffer); + case PACKET_TYPES.LAG_FRAME_CHUNK: return input.LagFrameChunkPacket.fromBuffer(buffer); + case PACKET_TYPES.MOVIE_TRANSITION: return input.MovieTransitionPacket.fromBuffer(buffer); // Extra // case PACKET_TYPES.COMMENT: return XXXXX.fromBuffer(buffer); // case PACKET_TYPES.EXPERIMENTAL: return XXXXX.fromBuffer(buffer); diff --git a/src/packets/input.ts b/src/packets/input.ts index 915c3b7..7d02a2e 100644 --- a/src/packets/input.ts +++ b/src/packets/input.ts @@ -22,4 +22,110 @@ export class InputChunkPacket implements TASDPacket { toString() { return `InputChunk ${this.port}, ${this.size}`; } +} + +export class InputMomentPacket implements TASDPacket { + constructor(public port: number, public indexType: number, public index: bigint, public inputs: Uint8Array) {} + get key() { + return PACKET_TYPES.INPUT_MOMENT; + } + get size() { + return 10 + this.inputs.length; + } + static fromBuffer(buffer: Uint8Array) { + const port = readUint8(buffer, 0); + const indexType = readUint8(buffer, 1); + const index = readUint64(buffer, 2); + const inputs = buffer.subarray(10); + return new this(port, indexType, index, inputs); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(this.size); + writeUint8(this.port, payload, 0); + writeUint8(this.indexType, payload, 1); + writeUint64(this.index, payload, 2); + payload.set(this.inputs, 10); + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `InputMoment ${this.port}, ${this.indexType}, ${this.index}, ${this.inputs.length}`; + } +} + +export class TransitionPacket implements TASDPacket { + constructor(public indexType: number, public index: bigint, public type: number, public data: Uint8Array) {} + get key() { + return PACKET_TYPES.TRANSITION; + } + get size() { + return 10 + this.data.length; + } + static fromBuffer(buffer: Uint8Array) { + const indexType = readUint8(buffer, 0); + const index = readUint64(buffer, 1); + const type = readUint8(buffer, 9); + const data = buffer.subarray(10); + return new this(indexType, index, type, data); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(this.size); + writeUint8(this.indexType, payload, 0); + writeUint64(this.index, payload, 1); + writeUint8(this.type, payload, 9); + payload.set(this.data, 10); + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `Transition ${this.indexType}, ${this.index}, ${this.type}, ${this.data.length}`; + } +} + +export class LagFrameChunkPacket implements TASDPacket { + constructor(public frame: number, public count: number) {} + get key() { + return PACKET_TYPES.LAG_FRAME_CHUNK; + } + get size() { + return 8; + } + static fromBuffer(buffer: Uint8Array) { + const frame = readUint32(buffer, 0); + const count = readUint32(buffer, 4); + return new this(frame, count); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(this.size); + writeUint32(this.frame, payload, 0); + writeUint32(this.count, payload, 4); + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `LagFrameChunk ${this.frame}, ${this.count}`; + } +} + +export class MovieTransitionPacket implements TASDPacket { + constructor(public frame: number, public type: number, public data: Uint8Array) {} + get key() { + return PACKET_TYPES.MOVIE_TRANSITION; + } + get size() { + return 5 + this.data.length; + } + static fromBuffer(buffer: Uint8Array) { + const frame = readUint32(buffer, 0); + const type = readUint8(buffer, 4); + const data = buffer.subarray(5); + return new this(frame, type, data); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(this.size); + writeUint32(this.frame, payload, 0); + writeUint8(this.type, payload, 4); + payload.set(this.data, 5); + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `MovieTransition ${this.frame}, ${this.type}, ${this.data.length}`; + } } \ No newline at end of file -- cgit v1.2.3