Repository navigation
Hybrid ports wave 3: the move player, travel, turns and walls, lane screenshots - #55
Merged
Merged
Conversation
… carry The engine moves a big monster by the root joint (joint 0's first child) and draws joint 0's translation without carrying it. `mhfu-port travel` reports each entry's carried and dropped travel; `travel.carry` moves a donor's travel onto the root and the height onto joint 0, pose unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the frame The slot-29 stub calls mhfu_em_step's function with the entity before it tail-calls the species' AI step, and returns to the engine instead when the step answers nonzero. Still branchless and frame-free: the call's target and the tail are movn-selected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… its own mhfu_move_play rides a native carrier pair entered through enter-action, puts the entry on every body part through the executor on the next AI step, spawns each attack when the timing part's cursor crosses its frame, and ends on the clip's end, a back pair, LENGTH frames or a pair change; SKIP keeps the host AI step out while the clip plays except on a hit. Lua mhfu.move_*, the debug bridge's CMD 4, structs MOVE and MOVE_STATE in addresses.toml. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mhfu_steer_step turns YAW toward or away from the hunter at TURN_TOWARD's rate, or by a fixed total spread over the move, and reports the frame's wall result in the direction of travel: a wall ends the move, a class-2 wall ends it into the stuck pair. Leaf code: no call, no stack frame. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tack mhfu.live.moves asks the move player through the debug bridge, watches the block to the end and after, and logs the hunter's HP writes with the timing part's clip phase, so a hit is placed against the spawn frame. mhfu move ride deploys the built PRX with the port. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ch AI frame One log-only breakpoint where MONSTER_STEP calls the AI step: every frame's POSITION, YAW, WALL_SECTORS, STUCK_WALL, pair and part-0 clip, as a step running there reads them, cut into one leg per clip played. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each clip leg of `mhfu observe path --csv` beside the root path between the cursors it played, up to its first wall; a frame's position holds the root motion up to its cursor less one frame's speed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ROOT_MOTION adds the root's move over one frame's speed up to the cursor, from 0 while the cursor is under the speed, so a clip's dispatch frames travel too: summed per frame, the game matches the build to 0.5 %. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The main-0 translator turns an entered (0,1) into (0,2) while ENTITY+0x4B9 is set, so a (0,1) carrier was refused; (0,2) is act_set as asked, plays one dispatch and hands off to the brain when the clip ends. cli_bridge.lua publishes the move block when it loads, and mhfu move logs the move's AI frame at each HP write. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A native's or a retarget build's travel is on the root already; carrying it again would put it back on joint 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No clip turns the monster: a body that ends a clip turned snaps back with the next one unless YAW turns as much, which is the move's to do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eering goes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ncludes move.h Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le the game runs A sixth patch: the screenshot hotkey's path, scheduled from the render thread, answering once the file is written. gpu.buffer.screenshot fails in a running or hidden lane. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…PNG while the game runs screenshot() stays as it is: it answers only while stepping and not in a lane. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An attack is (id, frame, end): its node is ended when the timing part's cursor crosses end, or when the move ends first, through the node's own end state (ATTACK_NODE_VTABLE.END), which stops its hit test at once and has the collision world delete it. Only a node still ours is touched. mhfu move play --attack ID@FRAME-END. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tact sheet A film is time-boxed: shots are due 1/fps apart and a late one skips the slots that passed. It reports the rate achieved, each shot's cost and the game's speed. Pillow draws the sheet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A read that waits for the CPU deadlocks PPSSPP while the queued load reinitialises memory, as it does when the state's memory size is not the boot's. The pause is retried while PPSSPP says the CPU has not started. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… in a lane Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A body that ends a clip turned snaps back with the next one: the engine turns a monster by YAW alone and draws the root's rotation. carry puts the body's turn (its children's twist about y) on the root, turned back, with joint 0's sway and the root's travel turned to match; turns() is the curve YAW follows, the manifest's turn eased in. The pose and path match the source within 0.2 units on the keys. The travel swap now keys on the root's height, so carrying twice changes nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
build.animation carries every source-skeleton build, the one place the build and the studio's clip preview pass through. The clips module gains _turns: per entry, YAW every 2 clip frames while it plays. travel reports the body's turn left in a clip, the one carried out and the manifest's; pose compares about the body joint, the port turned by its carried turn. The studio's preview turns the model as YAW will, so a turn still shows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
em_vhook wraps slot 30 (MONSTER_VTABLE.ANIM_EVENTS), the playing entry's attacks and effects at clip frames, and skips it for the entity mhfu_em_mute_events names. The move player names its monster from the carrier's entry to the move's end, so a port's clip no longer fires the host's attacks for the entry it sits in; MOVE.HOST_ATTACKS (Lua host_attacks, mhfu move --host-attacks) keeps them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With its hip height on joint 0, which the FK draws, the lift that made up for the height the engine dropped puts him in the air: lowest foot joint +13 at lift 0 (the native Tigrex +8 to +18), -40 before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The move player's seam calls the steer step each playing frame: YAW is its first-frame value plus the clip's turn curve (the clips module's _turns) at the cursor, a loop's turn kept, turned on by the spec's mode (toward or away from the hunter, a fixed total). A wall ahead ends the move; a class-2 one enters the stuck pair, (0,6) mode 1 as the Tigrex charge does, and clears the AI script's wake so it waits for the hub. mhfu.move_play takes a steer table, and mhfu move play --curve, --turn and --walls the same through the block. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ME; em_vhook logs slot 30 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd ends facing YAW A clip whose first frame already faces off the model's forward snapped there when the move began and back when it ended. Fast turns bake joint 0's sway on every frame. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Wave 3 of hybrid ports: a ported monster plays its own moves, with our attacks, travel, turns and wall stops, and hands back to the host's AI; plus screenshots from a hidden lane. For sp00ktober/MHFU-ModKit#102, #103.
framework,mhfu move play, Luamhfu.move_*): a C step on em_vhook's slot 29 plays an executor entry on all parts, riding em75's alert hub (0,2). Our attacks spawn at an authored clip frame and end at another (the engine's own end state). The host's animation events (slot 30: its entry-keyed attacks and effects) are muted while a move plays, with a per-move opt-out. Measured on the Zinogre (stamp_right_claw):mhfu-port): the engine carries a monster's travel from joint 1, but ports kept it on joint 0, so they ran ahead and snapped back.travel.carrymoves the donor's travel and body facing to where the engine takes them, for source-skeleton builds.[clips.x] turn(degrees). The build exports each entry's turn curve (_turnsin<port>_clips.lua). The studio preview turns the model the same way.mhfu-port travel [--against]reports what each clip travels and turns, and checks it against a measured game path.framework): turns YAW per frame (clip curve, toward or away from the hunter, fixed), and a wall ends the move. A class-2 wall hands the monster to the native stuck pair (0,6). Measured:ports/zinogre.tomlground_lift = 0(own commit 4ec1d3d; the stance waits for the owner's eye).ppsspppatch 0006,Client.save_screenshot,mhfu rig shot|film): the frame on screen to a PNG while the game runs, in a hidden lane too; 10/10, ~0.1 s each, filming at 10 fps costs no speed.Rig.open(state=…)no longer deadlocks on a fresh lane (50/50).mhfu observe pathtraces position, walls and clip per AI frame.mhfunow depends on Pillow (contact sheets).Tests: 2192 passed, 46 skipped (GL, Blender, live), with both games' data; pre-commit clean. Live gates measured in lanes 1, 3, 4.
🤖 Generated with Claude Code