diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/packets/extra.ts | 62 | ||||
| -rw-r--r-- | src/packets/genesis.ts | 22 | ||||
| -rw-r--r-- | src/packets/index.ts | 32 | ||||
| -rw-r--r-- | src/packets/nes.ts | 85 | ||||
| -rw-r--r-- | src/packets/snes.ts | 93 |
5 files changed, 280 insertions, 14 deletions
diff --git a/src/packets/extra.ts b/src/packets/extra.ts new file mode 100644 index 0000000..da8bb42 --- /dev/null +++ b/src/packets/extra.ts @@ -0,0 +1,62 @@ +import { PACKET_TYPES } from "../constants"; +import { encodeString, readBoolean, readString, writeBoolean } from "../utils"; +import { TASDPacket, buildBuffer } from "./utils"; + +export class CommentPacket implements TASDPacket { + constructor(public comment: string) {} + get key() { + return PACKET_TYPES.COMMENT; + } + get size() { + return this.comment.length; + } + static fromBuffer(buffer: Uint8Array) { + return new this(readString(buffer, 0, buffer.length)); + } + toBuffer(g_keylen: number): Uint8Array { + return buildBuffer(g_keylen, this.key, encodeString(this.comment)); + } + toString(): string { + return `Comment ${this.comment}`; + } +} + +export class ExperimentalPacket implements TASDPacket { + constructor(public experimental: boolean) {} + get key() { + return PACKET_TYPES.EXPERIMENTAL; + } + get size() { + return 1; + } + static fromBuffer(buffer: Uint8Array) { + return new this(readBoolean(buffer, 0)); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(1); + writeBoolean(this.experimental, payload, 0); + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `Experimental ${this.experimental}`; + } +} + +export class UnspecifiedPacket implements TASDPacket { + constructor(public data: Uint8Array) {} + get key() { + return PACKET_TYPES.UNSPECIFIED; + } + get size() { + return this.data.length; + } + static fromBuffer(buffer: Uint8Array) { + return new this(buffer); + } + toBuffer(g_keylen: number): Uint8Array { + return buildBuffer(g_keylen, this.key, this.data); + } + toString(): string { + return `Unspecified ${this.data.length}`; + } +}
\ No newline at end of file diff --git a/src/packets/genesis.ts b/src/packets/genesis.ts new file mode 100644 index 0000000..807cc45 --- /dev/null +++ b/src/packets/genesis.ts @@ -0,0 +1,22 @@ +import { PACKET_TYPES } from "../constants"; +import { encodeString, readString } from "../utils"; +import { TASDPacket, buildBuffer } from "./utils"; + +export class GenesisGameGenieCodePacket implements TASDPacket { + constructor(public code: string) {} + get key() { + return PACKET_TYPES.GENESIS_GAME_GENIE_CODE; + } + get size() { + return this.code.length; + } + static fromBuffer(buffer: Uint8Array) { + return new this(readString(buffer, 0, buffer.length)); + } + toBuffer(g_keylen: number): Uint8Array { + return buildBuffer(g_keylen, this.key, encodeString(this.code)); + } + toString(): string { + return `GenesisGameGenieCode ${this.code}`; + } +}
\ No newline at end of file diff --git a/src/packets/index.ts b/src/packets/index.ts index f2f29c7..ab22704 100644 --- a/src/packets/index.ts +++ b/src/packets/index.ts @@ -1,9 +1,13 @@ import { PACKET_TYPES } from "../constants"; -import { AttributionPacket, BlankFramesPacket, CategoryPacket, ConsoleRegionPacket, ConsoleTypePacket, DumpCreatedPacket, DumpLastModifiedPacket, EmulatorCorePacket, EmulatorNamePacket, EmulatorVersionPacket, GameTitlePacket, MovieLicensePacket, PortControllerPacket, ROMNamePacket, RerecordsPacket, SourceLinkPacket, TASLastModifedPacket, TotalFramesPacket, VerifiedPacket } from "./general"; -import { InputChunkPacket } from "./input"; import { TASDPacket, UnknownPacket } from "./utils"; + import * as general from "./general"; +import * as nes from "./nes"; +import * as snes from "./snes"; +import * as genesis from "./genesis"; import * as input from "./input"; +import * as extra from "./extra"; + export * as General from './general'; export * as Input from './input'; @@ -33,17 +37,17 @@ export function parse(type: number, buffer: Uint8Array): TASDPacket { case PACKET_TYPES.MOVIE_FILE: return general.MovieFilePacket.fromBuffer(buffer); case PACKET_TYPES.PORT_CONTROLLER: return general.PortControllerPacket.fromBuffer(buffer); // NES - // case PACKET_TYPES.NES_LATCH_FILTER: return XXXXX.fromBuffer(buffer); - // case PACKET_TYPES.NES_CLOCK_FILTER: return XXXXX.fromBuffer(buffer); - // case PACKET_TYPES.NES_OVERREAD: return XXXXX.fromBuffer(buffer); - // case PACKET_TYPES.NES_GAME_GENIE_CODE: return XXXXX.fromBuffer(buffer); + case PACKET_TYPES.NES_LATCH_FILTER: return nes.NESLatchFilterPacket.fromBuffer(buffer); + case PACKET_TYPES.NES_CLOCK_FILTER: return nes.NESClockFilterPacket.fromBuffer(buffer); + case PACKET_TYPES.NES_OVERREAD: return nes.NESOverreadPacket.fromBuffer(buffer); + case PACKET_TYPES.NES_GAME_GENIE_CODE: return nes.NESGameGenieCodePacket.fromBuffer(buffer); // SNES - // case PACKET_TYPES.SNES_CLOCK_FILTER: return XXXXX.fromBuffer(buffer); - // case PACKET_TYPES.SNES_OVERREAD: return XXXXX.fromBuffer(buffer); - // case PACKET_TYPES.SNES_GAME_GENIE_CODE: return XXXXX.fromBuffer(buffer); - // case PACKET_TYPES.SNES_LATCH_TRAIN: return XXXXX.fromBuffer(buffer); + case PACKET_TYPES.SNES_CLOCK_FILTER: return snes.SNESClockFilterPacket.fromBuffer(buffer); + case PACKET_TYPES.SNES_OVERREAD: return snes.SNESOverreadPacket.fromBuffer(buffer); + case PACKET_TYPES.SNES_GAME_GENIE_CODE: return snes.SNESGameGenieCodePacket.fromBuffer(buffer); + case PACKET_TYPES.SNES_LATCH_TRAIN: return snes.SNESLatchTrainPacket.fromBuffer(buffer); // Genesis - // case PACKET_TYPES.GENESIS_GAME_GENIE_CODE: return XXXXX.fromBuffer(buffer); + case PACKET_TYPES.GENESIS_GAME_GENIE_CODE: return genesis.GenesisGameGenieCodePacket.fromBuffer(buffer); // Input case PACKET_TYPES.INPUT_CHUNK: return input.InputChunkPacket.fromBuffer(buffer); case PACKET_TYPES.INPUT_MOMENT: return input.InputMomentPacket.fromBuffer(buffer); @@ -51,9 +55,9 @@ export function parse(type: number, buffer: Uint8Array): TASDPacket { 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); - // case PACKET_TYPES.UNSPECIFIED: return XXXXX.fromBuffer(buffer); + case PACKET_TYPES.COMMENT: return extra.CommentPacket.fromBuffer(buffer); + case PACKET_TYPES.EXPERIMENTAL: return extra.ExperimentalPacket.fromBuffer(buffer); + case PACKET_TYPES.UNSPECIFIED: return extra.UnspecifiedPacket.fromBuffer(buffer); // Unknown default: return new UnknownPacket(type, buffer); } diff --git a/src/packets/nes.ts b/src/packets/nes.ts new file mode 100644 index 0000000..30b1418 --- /dev/null +++ b/src/packets/nes.ts @@ -0,0 +1,85 @@ +import { PACKET_TYPES } from "../constants"; +import { encodeString, readBoolean, readString, readUint16, readUint8, writeBoolean, writeUint16, writeUint8 } from "../utils"; +import { TASDPacket, buildBuffer } from "./utils"; + +export class NESLatchFilterPacket implements TASDPacket { + constructor(public time: number) {} + get key() { + return PACKET_TYPES.NES_LATCH_FILTER; + } + get size() { + return 2; + } + static fromBuffer(buffer: Uint8Array) { + return new this(readUint16(buffer, 0)); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(2); + writeUint16(this.time, payload, 0); + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `NESLatchFilter ${this.time}`; + } +} + +export class NESClockFilterPacket implements TASDPacket { + constructor(public time: number) {} + get key() { + return PACKET_TYPES.NES_CLOCK_FILTER; + } + get size() { + return 1; + } + static fromBuffer(buffer: Uint8Array) { + return new this(readUint8(buffer, 0)); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(1); + writeUint8(this.time, payload, 0); + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `NESClockFilter ${this.time}`; + } +} + +export class NESOverreadPacket implements TASDPacket { + constructor(public high: boolean) {} + get key() { + return PACKET_TYPES.NES_OVERREAD; + } + get size() { + return 1; + } + static fromBuffer(buffer: Uint8Array) { + return new this(readBoolean(buffer, 0)); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(1); + writeBoolean(this.high, payload, 0); + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `NESOverread ${this.high}`; + } +} + +export class NESGameGenieCodePacket implements TASDPacket { + constructor(public code: string) {} + get key() { + return PACKET_TYPES.NES_GAME_GENIE_CODE; + } + get size() { + return this.code.length; + } + static fromBuffer(buffer: Uint8Array) { + return new this(readString(buffer, 0, buffer.length)); + } + toBuffer(g_keylen: number): Uint8Array { + return buildBuffer(g_keylen, this.key, encodeString(this.code)); + } + toString(): string { + return `NESGameGenieCode ${this.code}`; + } +}
\ No newline at end of file diff --git a/src/packets/snes.ts b/src/packets/snes.ts new file mode 100644 index 0000000..07ee91b --- /dev/null +++ b/src/packets/snes.ts @@ -0,0 +1,93 @@ +import { PACKET_TYPES } from "../constants"; +import { encodeString, readBoolean, readString, readUint64, readUint8, writeBoolean, writeUint64, writeUint8 } from "../utils"; +import { TASDPacket, buildBuffer } from "./utils"; + +export class SNESClockFilterPacket implements TASDPacket { + constructor(public time: number) {} + get key() { + return PACKET_TYPES.SNES_CLOCK_FILTER; + } + get size() { + return 1; + } + static fromBuffer(buffer: Uint8Array) { + return new this(readUint8(buffer, 0)); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(1); + writeUint8(this.time, payload, 0); + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `SNESClockFilter ${this.time}`; + } +} + +export class SNESOverreadPacket implements TASDPacket { + constructor(public high: boolean) {} + get key() { + return PACKET_TYPES.SNES_OVERREAD; + } + get size() { + return 1; + } + static fromBuffer(buffer: Uint8Array) { + return new this(readBoolean(buffer, 0)); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(1); + writeBoolean(this.high, payload, 0); + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `SNESOverread ${this.high}`; + } +} + +export class SNESGameGenieCodePacket implements TASDPacket { + constructor(public code: string) {} + get key() { + return PACKET_TYPES.SNES_GAME_GENIE_CODE; + } + get size() { + return this.code.length; + } + static fromBuffer(buffer: Uint8Array) { + return new this(readString(buffer, 0, buffer.length)); + } + toBuffer(g_keylen: number): Uint8Array { + return buildBuffer(g_keylen, this.key, encodeString(this.code)); + } + toString(): string { + return `SNESGameGenieCode ${this.code}`; + } +} + +export class SNESLatchTrainPacket implements TASDPacket { + constructor(public trains: bigint[]) {} + get key() { + return PACKET_TYPES.SNES_LATCH_TRAIN; + } + get size() { + return this.trains.length * 8; + } + static fromBuffer(buffer: Uint8Array) { + const trains = []; + for (let index = 0; index < buffer.length; index += 8) { + trains.push(readUint64(buffer, index)); + } + return new this(trains); + } + toBuffer(g_keylen: number): Uint8Array { + const payload = new Uint8Array(this.size); + let index = 0; + for (const train of this.trains) { + writeUint64(train, payload, index); + index += 8; + } + return buildBuffer(g_keylen, this.key, payload); + } + toString(): string { + return `SNESLatchTrain ${this.trains.length}`; + } +} |
