Skip to content

feat(ports): the Zinogre runs MHP3rd's brain - #123

Merged
sp00ktober merged 7 commits into
mainfrom
port/zinogre-brain
Oct 22, 2026
Merged

sp00ktober merged 7 commits into
mainfrom
port/zinogre-brain

Conversation

@sp00ktober

@sp00ktober sp00ktober commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #122. ports/zinogre.toml gets its [brain]: MHP3rd's base_3 spliced into em75's, with fatigue and charge.

  • Pairs: host pairs, the authored moves that are the donor's (charge_up, dash, dash_stop, break_howl), and derived own moves. A turn wrapper enters (1,2), then the move of the pair it leads to: a [brain.pairs] item may name another pair's derived move (Brain.derived, shared). The 17 pairs whose derived chains are identical share one move.
  • Removed, as they fought the brain: the lunge's claim, the stamp rules after the skid and the dash, the flinch counter and charge-up from idle, the far dash and low-HP howl, the enrage after the charge, dash.after.
  • Framework: own-move turn keys 2048 → 5632; the registry block grows 12.7 → 19.9 KB (not measured on a real PSP yet).
  • Studio: renaming or deleting an own move follows [brain.pairs]. Splice: prints each charge-up's gains; fix for a list pair in its summary.
  • Splice: 57 routines, +11258 B, worst run 125 of 999, no errors; 83 own moves in 96 slots, 4367 of 5632 keys. switch_global_540 folds to case 2, which differs from the default arm only by three more routine calls (0x32, 0x49, 0x4A), likely the donor's higher-rank set.

Tests: test_zinogre_brain on the real manifest (own enters, switch_query kept, if_gauge_a_low, the moves module's fatigue and charge, twins), rename/delete, the key pool.

Live (lane 3, with #121, 1980 s, two quests): the stick brain ran 8721/8721 dispatches; 318/318 enter 16 k played, 97 after the (1,2) turn; the charge cycle exact (17/17 gains, transform ×4, chips 5 on 77/77 hits, discharge then a 900-frame cooldown, switch_query 378/378); fatigue ledger 133/133, two 2700-frame tired spells; spare records 78/78 spawned on their frame; the second quest re-latched without a cold boot. Three defects it found are fixed in #124 (split picks), #125 (the walks parked in em75's (1, 0)) and #126 (mid-clip starts), and a re-run (5880 s, two quests, no workaround writes) passed: no park, every start and stop on its frame, all split arms reachable, and the charge (41/41 gains, 9 discharges), fatigue (265/265, 7 spells), spare records (297/297 on frame) and second quest unchanged.

🤖 Generated with Claude Code

sp00ktober and others added 7 commits October 22, 2026 00:58
A turn wrapper or a twin pair names the own move OWN derives for the pair it leads
to ("7,23" = [[1, 2], "p3_7_0"]) instead of deriving a duplicate; Brain.derived
and Brain.shared say which, and the splice does not report a pair whose move another
pair plays as unused.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The summary sorted its uses by donor pair and target, which a pair that plays a host
pair and an own move (a list value) made compare a tuple with a name.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Brain.users names the pairs that play a move and Brain.rename_move renames it in each
item; the studio's rename carries them over and a move a pair plays is not deleted.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ght it removed

[brain] splices the donor's base_3 into em75's with fatigue and charge. A donor pair
plays a host pair, the authored move that is the donor's (charge_up, dash, dash_stop,
break_howl) or an own move derived from it; a turn wrapper turns, then plays the move of
the pair it leads to. The registry's 2048 turn keys hold the authored moves' 991 and the
derived ones that fit: the groups that did not play the nearest that did.

Removed as they fought the brain: the lunge's claim, the stamp rules after the skid and
the dash, the flinch counter and charge-up from idle, the far-dash and low-HP howl, the
enrage after the charge, and the dash's stop. The tests and the README follow.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
EM_MOVES.KEYS 2048 -> 5632 (the moves block 12732 -> 19900 bytes, 0x4DBC, +7168): the
Zinogre's own moves, each donor move kept, need 4367 keys (the authored ones 991); 5632 is
that plus a quarter, up to a multiple of 512. The slots stay 96. The C arrays and asserts
read the generated KEYS_COUNT and offsets, the Python pool derives from it, and the tests
that spelled 2048 follow it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…e again

The stand-ins the 2048-key pool forced are gone: the horn charges, the claw combos, the
tumbles and flips, the second smackdown and the claw into a backflip each play their own
derived move. Only pairs whose derived chains are identical share one (17 pairs, checked by
a test), (1, 15) derives p3_1_15 and (1, 16) keeps charge_up so each charge-up has its own
gains, and the unentered charge-ups are derived for the charge table. 83 own moves of 96
slots take 4367 of the 5632 turn keys.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@sp00ktober
sp00ktober changed the base branch from port/charge to main October 22, 2026 21:58
@sp00ktober
sp00ktober merged commit a63bc41 into main Oct 22, 2026
5 checks passed
@sp00ktober
sp00ktober deleted the port/zinogre-brain branch October 22, 2026 21:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant