diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fb1fbe91a458992c3a94549e838437b124094de..29b96e5d0d6c4ca00c2a27976763ba071ddaafa5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -* +* Support for Zip file in Web frontend ### Changed diff --git a/frontends/web/package.json b/frontends/web/package.json index 9827d355d64641282765ae13af01316fe5dfbd65..eb9e9644fae4015b4f66722c51f57651b7a5a658 100644 --- a/frontends/web/package.json +++ b/frontends/web/package.json @@ -23,8 +23,10 @@ "@types/react-dom": "^18.2.11", "@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/parser": "^6.7.4", + "buffer": "^6.0.3", "emukit": "^0.9.2", "eslint": "^8.51.0", + "jszip": "^3.10.1", "nodemon": "^3.0.1", "parcel": "^2.9.3", "prettier": "^3.0.3", diff --git a/frontends/web/ts/gb.ts b/frontends/web/ts/gb.ts index b77a7474a77b8d8acc844a1e3f5bd1b00851edba..a7a5a68ee9f9e04b85b14bfd0da476817cbebd53 100644 --- a/frontends/web/ts/gb.ts +++ b/frontends/web/ts/gb.ts @@ -1,3 +1,4 @@ +import { loadAsync } from "jszip"; import { AudioSpecs, base64ToBuffer, @@ -594,7 +595,7 @@ export class GameboyEmulator extends EmulatorBase implements Emulator { } get romExts(): string[] { - return ["gb", "gbc"]; + return ["gb", "gbc", "zip"]; } get pixelFormat(): PixelFormat { @@ -785,6 +786,19 @@ export class GameboyEmulator extends EmulatorBase implements Emulator { this.gameBoy?.key_lift(keyCode); } + async buildRomData(file: File): Promise<Uint8Array> { + const arrayBuffer = await file.arrayBuffer(); + let romData = new Uint8Array(arrayBuffer); + + if (file.name.endsWith(".zip")) { + const zip = await loadAsync(romData); + const firstFile = Object.values(zip.files)[0]; + romData = await firstFile.async("uint8array"); + } + + return romData; + } + serializeState(): Uint8Array { if (!this.gameBoy) throw new Error("Unable to serialize state"); return StateManager.save(this.gameBoy, SaveStateFormat.Bos);