Skip to content

Replace uAxisThreshold with appropriate constant for octagon clamping - #83

Merged
Kenix3 merged 1 commit into
HarbourMasters:developfrom
kev4cards:bounded-octagon-fix
Mar 30, 2022
Merged

Replace uAxisThreshold with appropriate constant for octagon clamping#83
Kenix3 merged 1 commit into
HarbourMasters:developfrom
kev4cards:bounded-octagon-fix

Conversation

@kev4cards

Copy link
Copy Markdown
Contributor

In the "bound diagonals to an octagonal range" code, uAxisThreshold is incorrect. The value should be 16, which is the difference between the cardinal maximum of 85 of the diagonal maximum of 69. edgex and edgey are simply making use of equations for a line.

@MelonSpeedruns

Copy link
Copy Markdown
Contributor

LGTM!

@Kenix3
Kenix3 merged commit 5505336 into HarbourMasters:develop Mar 30, 2022
Malkierian pushed a commit to Malkierian/Shipwright that referenced this pull request Nov 20, 2023
garrettjoecox added a commit to Tawling/Shipwright that referenced this pull request Feb 21, 2024
GameInteractor hooks for adult and child shooting gallery
Patrick12115 pushed a commit to Patrick12115/Shipwright that referenced this pull request Nov 8, 2025
Made logic setting glitchless and added Tressanity reading from slot data
SomeoneIsWorking added a commit to SomeoneIsWorking/Shipwright that referenced this pull request Jun 21, 2026
…ion (HarbourMasters#70/HarbourMasters#83)

The 3d3 Link transient cluster (HarbourMasters#70 roll, HarbourMasters#83 dialog-arms) was BLOCKED on reaching
the failing state headlessly: natural triggers are context-gated (roll needs a moving
stick; talk needs an NPC's talk-offer accepted via an A edge), which btnhold/walkhold
can't reliably hit. Per the project rule "every bugfix STARTS by proving the tooling
can reach the failing state," build the state-injection primitive first.

New z_player.c hooks (mirror the existing SoH3D_PlayerForceClimb/Teleport pattern):
- SoH3D_PlayerForceRoll: Player_SetupRoll -> real forward dodge-roll, no NPC needed.
- SoH3D_PlayerForceTalk: pick nearest live ACTORCAT_NPC within range, wire talkActor/
  focusActor/textId, Player_SetupTalk -> real talk action (holds in talk_free_wait
  headlessly since no input advances the textbox). Returns the NPC's actor id.

REPL: `linkstate roll|talk`. Generic + reusable for any future player-state repro.

Finding with the new tooling (Kokiri Forest, 3d3 linksrc=3ds, vs Saria 0x146):
neither bug reproduces as broken — the roll plays a faithful forward somersault
matching N64 (standstill + run-roll), and the live talk blend (entry transition +
held) shows natural gesturing arms, extending the prior "static poses correct"
finding to the LIVE blend. Evidence posted to HarbourMasters#70/HarbourMasters#83; cards left in todo pending
user re-confirm/pinpoint.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018qR9VBpgoWRQCNew29Wooe
SomeoneIsWorking added a commit to SomeoneIsWorking/Shipwright that referenced this pull request Jun 21, 2026
…asters#86)

Per "trace via animation state, not eyeballed pixels": dump Link's live anim state so a
transient is read as a numeric discontinuity. Reports the resolved base+upper CSAB,
curFrame/animLength/playSpeed/morphWeight, upperLimbRot (the literal upper-torso euler),
headLimbRot.y, shape.rot.y/yaw/focus.rot.y, and speedXZ. Driven under freeze/step.

HarbourMasters#86 finding (quantitative, Kokiri, 3d3, freeze/step): the walk-stop transition is CLEAN
across straight / full-run / angled-turning stops:
- CSAB sequence is proper: nml_run_free (speed-driven loco) -> nml_walk_endR_free settle
  (curFrame 0->10) -> nml_wait_free idle.
- shapeY/yaw ramp smoothly into the walk direction at the START then HOLD constant through
  the stop -- no yaw snap. upperLimbRot.y stays 0; focusY shows no stop-time discontinuity.
- No ~90deg torso snap reproduces. Matches HarbourMasters#70/HarbourMasters#83: the 3d3 transient cluster appears
  resolved by the prior HarbourMasters#7/HarbourMasters#8 work.
- Lone latent nit (NOT the cause): walk_end settles match the isLoco "walk" strstr so they
  are speed-driven for 1 frame at the stop -- but only ever at curFrame=0, so visually
  identical to the one-shot path. Left unchanged (no observable effect to fix).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018qR9VBpgoWRQCNew29Wooe
SomeoneIsWorking added a commit to SomeoneIsWorking/Shipwright that referenced this pull request Jun 21, 2026
… (anim cluster)

"Better tooling to reveal what can go wrong with different animations" (user). Instead of
eyeballing one transition at a time, this systematically measures every transition's pose
discontinuity and flags hard-cuts automatically.

Mechanism: the 3d3 named-CSAB path picks ONE csab at a phase and never blends morphs, so any
anim-name change / phase-lock jump HARD-CUTS the pose -- a per-bone rotation that jumps far
beyond what continuous playback produces. New pieces:
- soh3d_model.cpp SoH3D_PoseDiscontinuity(modelId,&bone): largest per-bone rotation jump (deg)
  between this frame's cached pose (lastSkin) and the previous, orthonormalizing each bone's 3x3
  (removes skin scale) and measuring the relative angle. SoH3D_PoseScanReset baselines it.
- soh3d_link.cpp per-frame LOGGER sampled in the DRAW path (poseScanRecord): records each drawn
  player frame's {maxJump,bone,csab,curFrame}. SoH3D_LinkModelId exposes the body modelId.
- REPL `posescan on|off|dump` (CSV log); `linkstate idle` safe reset out of forced talk/roll
  (the forced-talk CLOSING path null-derefs talkActor since the NPC never did the handshake --
  reset by clearing talk flags + Message_CloseTextbox + standing-idle, NOT by mashing A).
- tools/soh3d_anim_qa.py: drives idle / walk-stop / run-stop / turn / roll / talk / sword-draw
  through the real action machine, oversamples dumps (headless renders on demand; freeze caches),
  de-dups redraws, and reports max jump + bone + csab + a sparkline, flagging isolated spikes.

Metric VALIDATED: scrubbing nml_wait_free frame-by-frame (animframe 0..N) yields a smooth
~3deg/frame series (no math artifacts), so spikes in LIVE playback are real transition hard-cuts.

Finding: idle (bone15, nml_wait_free) 110deg, talk (bone13) 136deg, run-start (bone14,
nml_run_free) 128deg all show isolated 1-frame pops; roll/sword show SUSTAINED high motion
(correctly not flagged). The pops are the morph-blindness of the 3d3 path -- the measurable root
mechanism behind the user-reported transient cluster (HarbourMasters#70/HarbourMasters#83/HarbourMasters#86 family). Fixing it = blend the
3d3 CSAB across anim transitions (honor morphWeight) instead of restarting at frame 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018qR9VBpgoWRQCNew29Wooe
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.

4 participants