Skip to content

feat(port): a donor attack with no host match plays a spare record derived at build time - #120

Merged
sp00ktober merged 3 commits into
mainfrom
port/spare-attacks
Oct 22, 2026
Merged

sp00ktober merged 3 commits into
mainfrom
port/spare-attacks

Conversation

@sp00ktober

Copy link
Copy Markdown
Contributor

Stacked on #119. A donor attack with no Tigrex record to match now plays a spare one, derived at each build.

  • Spare records (brain/spare.py, through own.expand): an em75 record a species-75 port never spawns (34-69, 71-106; ids the overlay's node code treats specially are skipped: 5, 6, 21, 22, 24, 28, 31, 39, 40, 99, 100) on a spare volume set with room, carrying the donor's volumes on the port's joints, its power scaled by the median host/donor ratio of the port's matched records, its kind by family and its active frames. They are [[attack]]/[[hitbox]] entries of the expanded manifest only (P3_OWN_SPARE); [[attack]] gains kind and active.
  • To the game: the studio's hit tables (studio port hit, push, Send to game) take the expanded manifest for a port with [brain].
  • Brute: record 26, the rush's hind feet, becomes spare 34 on set 19 (two r130 spheres on joints 24 and 29, power 18). Zinogre: its 9 unmatched records get spares.

Tests: allocation, capacity, scaling; with game data, Brute's and Zinogre's spares and the hit plan bytes.

🤖 Generated with Claude Code

sp00ktober and others added 3 commits October 22, 2026 00:21
Two more levers beside power, element and volume: kind (+0x03) and
active (+0x01, the frames a node stays active). A spare record needs
both; a hand-authored one may set them too.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
own.expand gives each donor record that no host record matches (and
[brain.attacks] does not name) one of the records a species-75 port never
spawns: ids 34-106 but 70 and the ones the node code treats by id (5, 6,
21, 22, 24, 28, 31, 39, 40, 99, 100). Its power is the donor's times the
median host/donor ratio of the port's matched records, its kind the
family's (hit, weak, a node that hurts nobody), its active frames the
donor's, grown to the move's window. It points at a free volume set that
holds the donor's volumes on the port's joints. Both go into the
expanded manifest as [[attack]] and [[hitbox]], never the saved one;
P3_OWN_SPARE says what was taken, P3_OWN_ATTACK where nothing is left.

Brute's record 26 (the hind feet) takes record 34 on set 19, spheres on
joints 24 and 29; Zinogre's nine unmatched records each get one.

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

runtime.expanded hands the write plan the manifest own.expand returns,
so studio port hit and push, Send hitboxes to game and Push to game ship
the spare [[attack]] and [[hitbox]] entries beside the authored ones;
the document keeps none of them. The plan writes the two new attack
levers (kind, active) and the content id covers them. Games are read
only when the brain has an own move the manifest does not define.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@sp00ktober
sp00ktober changed the base branch from framework/charge to main October 22, 2026 21:58
@sp00ktober
sp00ktober merged commit 8ea778c into main Oct 22, 2026
5 checks passed
@sp00ktober
sp00ktober deleted the port/spare-attacks branch October 22, 2026 21:58
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