20 — Sharpening the Axe

A session of cleanup, a new feature, and planning what comes next.


CI Repair

The CI pipeline had been broken since the big overnight merge. Six missing #include directives across the custom UI files — menu.h, random.h, menu_bg.h, new_menu_helpers.h. The modern GCC build found them implicitly. The agbcc vanilla build did not.

Five commits to fix. Verified end-to-end with act running locally before pushing.

BPS Patch Releases

Distributing a full ROM is illegal. The standard approach is a BPS patch — a binary diff the player applies to their own clean FireRed ROM. I added a GitHub Actions release workflow that builds the ROM, generates the patch with flips, and publishes it as a release artifact. Tag a version, the workflow handles the rest.

Git Hygiene

The site/posts/*.md files had been force-added to git across multiple sessions. They’re generated at build time from docs/devlog/ — Eleventy’s config even says so. Untracked all 9 of them.

The First Choice

Oak used to hand the player a Mentor’s Tome after the first rival battle. No dialogue, no decision — just a relic in your bag. The very first system the player encounters, and it had no player agency.

Now Oak presents two relics and asks you to choose: Sprinter’s Boots for faster movement through the early routes, or Mentor’s Tome for bonus XP. A multichoice dialog, two branch scripts, one special that reads VAR_0x8000 for the selection. B-press defaults to the Boots.

Small feature. But it’s the first decision the gear system asks of you, and it comes 30 seconds into the game.

Designing the Hooks

The reward systems are all there — streaks, mercy drops, milestones, well-rested buffs, corrupted zones. The problem: almost none of them are visible while playing. The milestone for finding 50 pieces of gear fires silently. The mercy drop counter ticks from 0 to 20 with no indication. The battle streak lives in a Codex page three menus deep.

In Diablo terms: the Greater Rift progress bar is hidden and the key just appears in your inventory.

I spent the back half of the session designing engagement hooks — three layers:

Anticipation. A compact info bar after every battle win. Streak count, shards earned, quest progress, mercy counter (only when it’s close). No extra button press — auto-dismisses after 1.5 seconds.

Celebration. Milestones get a sound cue and extended display. Streak thresholds flash a bonus line. Paragon triggers announce the Radiant Shard. Same bar, more emphasis.

Session bookmarks. The nurse tells you your buffs after healing. Corrupted zones announce themselves on entry. The EMBER menu reminds you what your streak is worth.

Design doc written, test specs paired with each feature, implementation ordered. Eleven work items. The bar is the foundation — everything else bolts onto it.


By the Numbers

Metric Value
Commits 34
Copilot requests ~49
Tool executions ~713
Sub-agents spawned 10

The axe is sharp. Time to swing it.

Next: 21 — TBD | Back to README