- Go 64.5%
- Assembly 15.3%
- JavaScript 9%
- CSS 7.8%
- HTML 2.4%
- Other 1%
| assets | ||
| bin | ||
| cmd | ||
| content/ch01 | ||
| docs | ||
| internal | ||
| src | ||
| .gitignore | ||
| AGENTS.md | ||
| CH01.md | ||
| go.mod | ||
| go.sum | ||
| Makefile | ||
| NARRATIVE.md | ||
| PLOT.md | ||
| README.md | ||
projectzero
An original relationship-driven NES RPG about unraveling assigned futures, building collective agency, and creating the material conditions for many worlds to live.
Chapter 1, The Future Assigned, is playable as a real NES cartridge image.
Studio
Open the native build-and-play workshop:
bin/studio
projectzero Studio is the default way to work on the game. It opens as a powered-off 16-bit dev kit: click the dark screen or PLAY to compile, verify (including the full Chapter 1 smoke playthrough), and insert the cartridge only after every check passes. The build runs entirely in-process — assembly and linking included — so no cc65, Make, or any external tool is required. A failure names the failed step, preserves the previous verified cartridge if one exists, and prints the matching terminal command beside the game.
The WORKSHOP panel adds CHECK (Go tests + vet), CLEAN (remove build output), and WATCH (rebuild on every source save and hot-reload the running game). Keyboard and gamepad input, pause, reset, sound control, ROM metadata, and battery-backed saves are built in.
The Studio frontend is plain HTML, CSS, and JavaScript embedded in a Go/Wails
binary. JSNES and the pixel font are pinned and vendored, so there is no
Node, npm, CDN, or frontend build step. See docs/STUDIO.md.
Build
The terminal workflow is fully supported and is what CI uses; Studio is the default for daily work.
Requirements:
- Go 1.22 or newer
- GNU or BSD Make
On macOS with Homebrew:
brew install go
Build the ROM:
bin/build
The result is:
dist/project-zero.nes
The ROM authoring tools use only Go's standard library. The optional desktop Studio's pinned Go dependencies are downloaded automatically by Go.
Play
If Mesen or OpenEmu is installed on macOS:
bin/run
To select another emulator:
NES_EMULATOR=/path/to/emulator make play
The ROM uses mapper 0/NROM-256 with 32 KiB PRG ROM, 8 KiB CHR ROM, and battery-backed PRG RAM.
Controls
Title
A: new storySelect: continue an autosave
Name entry
- D-pad: select a letter
A: typeB: deleteStart: confirm
Exploration
- D-pad: move
A: interact, talk, or use a doorStart: pause and revisit the current objective
Dialogue, decisions, and combat
A: advance dialogue or confirm- D-pad: select an option or combat action
Progress is automatically saved at story milestones and map transitions.
Build Targets
bin/studio is the default human workflow. The repository entrypoints
remain for terminal and CI use:
bin/build # build the ROM
bin/run # build and launch a configured emulator
bin/fmt # format Go source
bin/test # run Go tests
bin/cibuild # test, vet, and validate the complete ROM
bin/studio # open the native build-and-play studio
They delegate to ordinary Go and Make commands. The underlying Make targets remain available:
make # compile assets and build the ROM
make assets # regenerate packed data without linking
make validate # validate assets, ROM structure, and the whole chapter flow
make preview # render deterministic screenshots from the ROM
make watch # rebuild after editable files change
make play # build and launch a configured emulator
make studio # open the native build-and-play studio
make studio-build # build build/project-zero-studio
make clean # remove build/ and dist/
make validate boots the reset vector in a headless 6502/NES harness, supplies controller input, completes every Chapter 1 story state and both battles, and verifies that the ending is reachable.
This is strong automated coverage, but it is not a claim of testing on physical NES hardware.
Edit the Game
All creative sources are ordinary editable files:
- Narrative, names, choices, objectives:
content/ch01/game.json - Character sprites:
assets/sprites/ch01.png - Sprite frame metadata:
assets/sprites/ch01.json - Battle portraits:
assets/portraits/ch01.png - Maps:
assets/maps/ - Metatile art and properties:
assets/tilesets/ - Palettes:
assets/palettes.json - Font:
assets/font.png - Music:
assets/music.json
See docs/EDITING.md for formats, constraints, and examples.
Files under build/ and dist/ are generated and ignored by Git. Edit the source assets, then run bin/build.
Current Chapter
The cartridge includes:
- Player naming and battery-backed continuation
- Four editable maps with collision and placed events
- Seven story days
- Mina, Sol, and Ilya relationship decisions
- The Guidance Center and four personal doors
- First-person hybrid combat using Strike, Expose, Connect, Defy, Improvise, and Open a Way
- The Proper Introduction encounter
- The Kindly Hand boss
- Four records strategies with distinct consequences
- Placement Day
- Four possible first uses for the Common Room
- A complete Chapter 1 ending
The story foundation lives in NARRATIVE.md, PLOT.md, and CH01.md.