Skip to content

feat(framework): an own move's travel, lunge and windowed fixed turn; 128 slots, shared pool runs - #130

Open
sp00ktober wants to merge 9 commits into
port/handoversfrom
framework/travel
Open

sp00ktober wants to merge 9 commits into
port/handoversfrom
framework/travel

Conversation

@sp00ktober

Copy link
Copy Markdown
Contributor

The move player carries an own move's travel by code, a lunge toward the hunter and a fixed turn across a clip-frame window (contract: manifest Move.travel, Move.lunge, Steer(turn="fixed", window=...), Clip.lift, first commit). Stacked on #128.

  • steer() moves POSITION before root motion, wall push-out and the ground query: travel samples (1/4 unit, every 2 clip frames, turned by the first frame's YAW, scaled by size), the lunge (base + range * clamp((d - near) / span, 0, 1) along the bearing at the first frame).
  • addresses.toml lays structs out with offset = "next" / size = "auto" and const-sized arrays; C static_asserts against it. OWN_MOVES 96 -> 128.
  • The own-move registry shares any run its pools already hold (keys, samples, lunges; a linear search at registration); mhfu_port.moves.Pools counts the same way, held to the registry by a host test.
  • Pools sized to the Zinogre (with fix(mhfu): rabbitizer enums hash by value; 1.16's hash leaks an object a call #129's derivation): keys 2944, samples 1280, lunges 12; EM_MOVES 0x4F3C -> 0x5E5C (24156 B). STEER_SAMPLES 132 (the Brute's p3_2_19 has 130).
  • No-feature moves write every byte as before (400 random runs).

Tests: framework 704, mhfu 1678, mhfu-port 1098, studio/monster 1634 passed (with #129; raw-file tests with .../data_files). PRX 661,758 B.

🤖 Generated with Claude Code

sp00ktober and others added 9 commits October 23, 2026 01:39
… fixed turn and lifted clip

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A field at "next" follows the one before as C places it, a struct of size
"auto" ends where its last field does, and an array's [n] may name a [const]:
OWN_MOVES, the key pools and a move's keys are each one number now, and every
offset after them follows. The structs that held 96 or 5632 by hand (EM_MOVES,
EM_OWN, FATIGUE_CFG, FATIGUE, EM_BLOCK, MOVE_STATE, STEER_SPEC, STEER_STATE)
are laid out from them; sizes and offsets come out as they were, bar EM_OWN's
trailing pad. A host build of the C structs' static_asserts against a raised
const keeps the C mirrors honest.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The move player's steer() moves POSITION each AI frame, before ROOT_MOTION,
WALL_COLLIDE and GROUND_QUERY, so a wall undoes it as it undoes root motion
and the floor keeps the height:
- travel: the monster's own (x, z) every STEER_KEY_STEP clip frames from the
  move's start, 16-bit samples of 1/STEER_TRAVEL_SCALE units; the change of
  the curve between the cursor's last frame and this one, turned by YAW at
  the first playing frame and scaled by ENTITY.SIZE_SCALE (any cursor rate,
  the blend's hold and a loop come out right).
- lunge: window (lo, hi], near, span, base, range; the length from the
  hunter's XZ distance on the first playing frame, along the bearing to it,
  in world axes, unscaled.
- a fixed turn with a window turns `total` across it by the cursor.

Travel samples are a pool of their own (EM_MOVES.SAMPLES, 512 x 4 B), a move's
inline in its STEER_SPEC (128 x 4 B), lunges a table (EM_LUNGES, 16 x 20 B);
EM_MOVES grows from 0x4DBC to 0x5C1C bytes and MOVE_STATE from 0x7B8 to
0xE08. A move without them writes every entity byte as before (checked
against the previous build over 400 random moves). Lua: steer.travel (8 hex
digits a sample) and steer.lunge, beside steer.window.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…nd the live steer

mhfu_port.moves writes a move's `travel` (steer.travel, the samples as 8 hex
digits each), its `lunge` and a fixed turn's `window` into the Lua module, and
`problems` refuses what the move player cannot carry: travel past its
capacity, reach or the clip, more samples or lunges than the registry holds,
a lunge or fixed window outside [start, stop], a lunge distance that is not a
length. mhfu.steering is the one place that quantizes and hexes the samples;
mhfu.live.moves.Steer packs and unpacks travel and lunge with it, and
SteerState reads the lunge's length.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
OWN_MOVES 96 -> 128, the one const: EM_MOVES grows from 0x5C1C to 0x679C
bytes (23580 to 26524), FATIGUE and EM_BLOCK by 0x40 each; the C structs,
Lua tables, Python limits and tests follow it.

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

mhfu_em_move reuses an identical run already in the pool, anywhere in it, instead of
appending: turn keys and travel samples word for word, a lunge byte for byte. A slot
that is rewritten with what it had adds nothing. mhfu_port.moves.Pools is the same
rule in Python; `problems` counts the pools through it, in slot order, and a test runs
equal, nested and distinct runs through the host registry and compares its tops and
each slot's offsets with Pools'.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
EM_KEYS 5632 -> 2944, EM_SAMPLES 512 -> 1280, EM_LUNGES 16 -> 12: the need of the
Zinogre's 125 own moves (2432 keys, 1052 samples, 10 lunges once equal runs are shared)
and about 20 %, in multiples of 64 (lunges of 4). EM_MOVES goes from 0x679C to 0x5E4C
bytes (26524 to 24140).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The Brute's longest derived walk travels over 130 samples (a 260-frame clip), which the
move player's 128 refused once the check ran on it. STEER_SAMPLES is 132; EM_MOVES grows
by 16 bytes, to 0x5E5C (24156).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A manifest whose own moves repeat turn keys, travel and lunges is registered slot by
slot through the host registry; its tops are those of mhfu_port.moves.pools.

Co-Authored-By: Claude Sonnet 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