Matrix interpolation cannot cover SKIN_LIMB_TYPE_ANIMATED limbs: their
vertices are deformed on the CPU and referenced through
gSPSegment(0x08, ...) without any recorded matrix, so recorded matrix
interpolation never moves them.
Record each skinned limb's pose (double-buffered, keyed by the vertex
entry) and blend the previous and current poses for every displayed
frame, right before the graphics commands are run. Ties the blend to a
logical-frame counter so a limb that was skipped for a frame falls back
to its exact pose instead of blending against a stale one.
Weapon trails (EffectBlure) are CPU built vertex blocks, one segment per
sample of the weapon position; matrix interpolation cannot touch them, so
above 20 fps they pop segment by segment.
A trail is a history: its sample indices shift every logical frame, so only
its newest end has to be blended, sliding from the previous sample towards
the current one. Only frames that appended a sample are recorded, otherwise
a finished trail keeps collapsing its last segment.
Shifting a signed 1 into the sign bit is undefined, and UBSan reports it
as "left shift of 1 by 31 places cannot be represented in type 'int'".
The switch-flag helpers in z_actor.c take the bit position at runtime, so
every flag from 0x00 to 0x3F goes through the same shift. Flag 0x3F lands
on bit 31: the Potion Shop Granny sets and clears it while brewing the Odd
Potion, so this is reached in ordinary play, not just in theory.
The same shift appears as a constant in gBitFlags, in the two player state
flags that occupy bit 31, and in ENHORSE_FLAG_31.
Suffixing the 1 with u moves the shift to unsigned, where the value is
defined. Every flag field involved is already u32, so the results are
unchanged.
prevent Esc menu while speedrun file loaded, instead toggles gameplay stats / time splits
render RUN tag on speedrun files
don't persist speedrun preset into player's settings
Each streamed track brings its own sound font, so a pack with more than
~217 of them pushes font ids past 255. Stored in 8 bits they wrapped onto
vanilla fonts or onto 0xFF, which reads as "no font": the track played
vanilla instruments or nothing at all.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
In WriteMonoSingleSeq, layerPlaceholderOff was recorded before WriteNoshort,
causing a stray 0x00 byte to be emitted into the mono channel script. The
0x00 decoded as a delay of 0 ticks, which deferred the subsequent ldlayer
byte by one tick and left channel->instrument unset when the layer first
processed its note, producing no sound.
Move layerPlaceholderOff to after WriteNoshort so the placeholder writes
the correct address, matching WriteStereoSingleSeq.
Fixes#7264
The selected-slot index is only assigned when the cursor is on a slot, so on
the page arrows the song icons compared against an uninitialised value.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>