Skip to content

port: faithful turns, stops in clip frames, facing through flips - #133

Open
sp00ktober wants to merge 18 commits into
framework/chain-aimfrom
port/faithful-turns
Open

sp00ktober wants to merge 18 commits into
framework/chain-aimfrom
port/faithful-turns

Conversation

@sp00ktober

Copy link
Copy Markdown
Contributor

The derivation's fixes from the second Zinogre play test (F1, F2, F4, F6-F9) on #132's framework.

  • Facing keys in every turn mode; the walk resolves the donor's turn rates (ent[0xAC4] = 1.0, splice.GLOBAL_540) and its blend-in window.
  • body_turn bridges the frames where the twist about y is ill-defined (a body upside down): clip 225's facing no longer flips 240°.
  • A step on a one-shot clip ends at the walk's cursor (stop), not an AI-frame count; air steps end on no wall and at their last frame at or above rest.
  • Faithful turns: a handler that plays by the target's bearing derives a picker over a variant per arm (arcs to 1/256 turn), spliced as if_target_in_arc; code yaw curves become code_turn (aim where the donor scales them to the angle). The 38 turn wrappers share 4 variants and reach their attack through combos.
  • Zinogre: 137 own moves, 40 pickers, 88 combos; pools keys 5696, samples 1792, turns 448, lunges 12; EM_MOVES 36976 B; PRX 669,574 B.

Live, lane 3, size 0.5: no hub frame in 142 hand-overs; the somersault lands as MHP3rd's model in 8/8; the turn variant matches the bearing in 48/49; aims and lunges at the Felyne within 1°; 20 min with no crash.

Tests: mhfu-port 1195, mhfu 1692, framework 808, studio/monster 1640 passed (with #129).

🤖 Generated with Claude Code

sp00ktober and others added 18 commits October 26, 2026 01:29
… facing holds through a flip

`moves.curve` wrote the clip's turn keys only for `turn = "clip"`, so a step that turns toward
the target lost the facing `carry` took out of its pose (clip 203's -90 swing, the first step of
every claw-stamp combo). Every turn mode now plays them, under the entity's own yaw.

`travel.body_turn` read the somersault's facing as -69 then +171 degrees once the body was
upside down. Frames whose summed (w, y) is under 0.7 per child (tipped past vertical) now take the
facing interpolated between the nearest frames that are not, held beyond them; a clip with none
keeps its raw twist. Clip 225's keys turn 15.4 degrees a key at most and end at 12.

The Zinogre's own moves now need 4218 turn keys (2432 before) against the 2944 the registry
holds: the pool is B2's to size.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A handler's TURN rate is `trunc(deg * ent[0xAC4] * 65536/360 + 0.5)` and the walk did not know
ent[0xAC4], the clip's speed, so every rate fell back to the host's 64 units a frame. The walk's
motion now holds it at 1.0. The rates that depend on the word at +0x540 off the global object
(5.5 degrees where it reads 2, else 4) read the same `splice.GLOBAL_540` the script's
`switch_global_540` is answered with: `Walker` takes `pointers`, global pointers by address with
the words read off them.

Every hunter turn of the Zinogre now has the donor's rate: 546 (3 degrees) for the combo
openers, 728, 1001 for the stamps' re-aim, 1092 to 1365 for the others.

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

A step on a clip that does not loop is cut by `stop`, the clip frame the walk's cursor stood at
when the handler handed over, never by `length` in AI frames: the engine holds the cursor through
a blend, so 30 AI frames left the backflip at 54 of its 60 (clip 25's joint 0 at 388 where the
next clip starts from 134). `length` is left to a step on a looping clip. 14 of the Zinogre's
steps went from `length` to `stop` (p3_7_33: 60).

A step with a lift, a jump, ends on no wall: its clip counts as a loop, which a run ends at one,
and the leap was cut short mid-air. It stops at the last frame whose height is at rest or above, so
the landing clip takes the fall instead of the tail that sinks under the floor: p3_225_air at 39
(its lift reads -54 at 40), p3_209_air at 36, its lift never under rest.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The Turn row listed only the modes a person picks, so a move with `turn = "aim"` (a derived move)
showed whichever mode was checked before it. It lists the derived modes after them: Aim turns
exactly onto the target along the donor's code turn, and its button is on only for a move that
has a code turn, which the game would refuse it without. The Hunter and Away tips say target.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A hunter turn whose rate the walk lacks falls back to the host's, as before, but now says so
(`P3_OWN_MOTION`), as it does for a rate out of range. Every rate of the Zinogre resolves.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The facing through a flip (`travel.body_turn`) changes the turn keys and the root's turn of 4 of
the Brute's clips (7 degrees at most) and 20 of the Zinogre's.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…rt a path's stores

negu, max, min and cvt.s.w on known values; lwc1 of a word the path stored;
Walker.run(persist=True) reports every store to the entity as a Site, for a
caller that carries cells from one run to the next.

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

A walk can be at a bearing D: the side rule and the angle of the target are
answered for it, the cells the handler stores are carried from frame to frame, and
the yaw it adds is the step's code turn. Walk.arms samples D at 45 degrees, finds
each change of plan to a 256th of a turn and gives the arcs that play one plan: a
turn by code that comes to D itself is an aim turn on its curve at 90 or 180
degrees, one that does not a curve that stands; a fixed turn that varies with D is
left out. Pairs of one handler that differ in what they hand over to share their
arms. The blend a handler hands over with is the last step's.

A clip is answered as blending in for the AI frames it was played with, where it
was answered so all clip long: p3_7_0 and p3_7_236 turn at 1092 over frames 0 to 24
and 455 over 26 to 38, as the donor does.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Move.pick: no clip and no slot; where the target stands to the left of the move's
facing, in 256ths of a turn, the script enters one of its variants. The splice
compiles it to nested if_target_in_arc and, with an own move after it in the pair's
list, one combo of each variant and that move; moves.slots, the module and the
capacity check leave pickers out, moves.combos has a combo per variant.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…a variant per arm

own.expand asks the walk for the arms of each pair a chain does not hand over to (that one
is an after, so one move): more than one makes a picker, p3_2_26, over p3_2_26_a0, ..., each
a chain of its own, entering the pair's list as combos where the list names the move after it,
and handing over as any chain does where it does not. A turn by code is the step's code_turn,
an aim one where it goes by the bearing, its aim_out the blend the donor hands over with.
Variants equal across pickers are one move (the pairs of one wrapper handler share four), and a
picker whose variants came to one is that move. A cost on a picker is on its variants; travel
is held to what a move holds.

The Brute: (2,19) plays clips 31 or 32 by the side and (7,14) three plans by how far round
the target is, so both are pickers (16 own moves, was 10).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…'s pools hold them

(1,1), (2,5), (2,6), (2,26) and the 38 turn wrappers are derived: two variants by side (clips
11, 39, a fixed 20 degrees), one move each for the sidesteps (a fixed 90 degrees and their travel),
four by the bearing (clips 9, 38, 37, 8, aim turns on the curves of 90 and 180 degrees), and four
shared by every wrapper, which stop where the donor hands over (clip frame 52 or 62) and slide the
rest of the angle over 6 or 10 AI frames; a wrapper enters one combo of a variant and the move it
leads to. 137 own moves (125), 88 combos.

EM_KEYS, EM_SAMPLES, EM_TURNS and EM_LUNGES hold the Zinogre's need (4711, 1447, 322, 10) and a fifth,
to a multiple of 64 (4 for lunges): 5696, 1792, 448, 12. EM_MOVES is 36976 bytes, was 30576.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…m is left out

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… not away from the hunter

The studio's turn label read an aim steer as away; it and the hunter's say the target, as the move
player aims at it. A picker has no clip, so the studio's check of own moves leaves it to its
variants.

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

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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