Case 03 Creator Nov 2026 – Present
Fisher of Fire
Since I was a kid, I've wanted to rebuild the fishing game from Breath of Fire III as a mobile app, and expand on an experience I was so attached to. The game came out on PlayStation in 1997. I decrypted the program on a disc I own, decompiled all of it, and rebuilt Fishing Mode in TypeScript and Phaser 4 rather than emulating it. The rebuild runs in a browser at the game's native 480×272, and once it matched the original I built on top of it: save files, four playable fishers, a shop, a jukebox and support for any screen and any controller.
- Vite
- Node.js
- Phaser
- Ghidra
- FFmpeg
- Java
- WebGL
- TypeScript
- Vercel
- Functions decompiled
- 11,676 48 MB of C
- Port source
- About 6,900 lines of TypeScript and tools
- TypeScript modules
- 57
- Game-rule modules
- 11 no rendering: state machine, fish AI, saves
- Phaser scenes
- 13 one per screen
- Typed data tables
- 9 spots, fish, gear, music and more
- Runtime dependencies
- 1 Phaser
- Extractor dependencies
- 0 plain Node.js
- Fishing spots
- 17
- Music player
- 128 tracks
- Native resolution
- 480×272
- Empty folder to 0.1.0 Beta
- About 14 hours, November 2–3, 2026
- Input methods
- 4 keyboard, mouse, controllers and touch
01
Notes from the build
Rebuilt, not emulated
No emulator runs the original code. The port re-implements the fishing rules, casting, the lure rhythm and the fights in TypeScript, read from the decompiled program.
Measured against the original
Six screenshots from the real hardware set every layout, so sprite positions and window sizes were measured rather than guessed.
Past the original
Three save files, Young Ryu, Ryu, Young Nina and Nina as playable fishers, the Manillo shop, a gallery, a 128-track music player, cheats, a CRT TV mode and any screen at 1–4× or fill.
Any input
Keyboard, mouse, game controllers, touch and an on-screen pad, with a controls screen in PlayStation symbols.
Tooling for the next one
An animation viewer and sheet editor, URL flags for testing, and a porting playbook written up so the method carries to other games.
02
What it's written in
- TypeScript 100%
Estimated from the stack, not measured from the source. Measured figures replace this once the repository is counted.
03
The stack 14
Reverse engineering
- pspdecrypt EBOOT.BIN to a relocatable MIPS (Allegrex) PRX
- Ghidra 12.2 headless, with ghidra-allegrex
- Java a custom Ghidra export script
- llvm-objdump quick disassembly
Extraction
- Node.js 20+ 7 zero-dependency scripts: textures, palettes, terrain, objects, sound, music
- ffmpeg ATRAC3+ jingles and the jukebox
Game
- TypeScript 5.9.3 strict, ES2022 target, bundler module resolution
- Phaser 4.2.1
- Vite 6.4.5
Browser
- WebGL Phaser 4 renderer
- Gamepad API controllers, with an on-screen pad for touch
- Web Audio API sound banks and the 128-track jukebox
Toolchain
- npm lockfile v3: 3 direct dependencies, 68 packages in the tree
- Vercel CLI prebuilt production and preview deploys
04
How it ships Custom Pipeline Built
From an encrypted disc image to a playable, extended browser port. The repository holds no game data: the extractors read it from the owner's own disc.
-
01 Decrypt
pspdecrypt turns the encrypted EBOOT.BIN into a relocatable MIPS (Allegrex) program.
-
02 Decompile
Ghidra 12.2 headless with ghidra-allegrex and a custom export script writes every function out as C.
-
03 Trace
The fish table, matched against a PS1 speedrun's star table, located the fishing logic. Fishing turned out to run on world-map areas.
-
04 Extract
Node tools decode tiled textures, per-strip palettes, terrain meshes, sound banks and music: about 830 files.
-
05 Rebuild
Phaser 4 and TypeScript, with a PSX-style affine triangle renderer for the terrain. Every layout measured against reference screenshots.
-
06 Extend
Three save files, four fishers, a shop, a gallery, a jukebox, cheats, a CRT mode, 1–4× scaling and any input.