Implement cyclic animation reset opcode
This commit is contained in:
@@ -1097,6 +1097,37 @@ public sealed class GfxState
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Op 0x230: stop every cyclic object channel without changing its base/current state,
|
||||
/// one-shot channels, or retained cyclic targets. Native clears flag bit 2 and the five start/period
|
||||
/// pairs at obj+0x20c..0x230, including one secondary matrix channel not otherwise modeled here.</summary>
|
||||
public void ResetCyclicAnimationChannels(long handle)
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
var o = GetOrCreate(handle);
|
||||
o.ColorStart = -1;
|
||||
o.ScaleCycleStartMs = -1;
|
||||
o.RotationStartMs = -1;
|
||||
o.SrcStart = -1;
|
||||
o.ColorPeriod = 0;
|
||||
o.ScaleCyclePeriodMs = 0;
|
||||
o.RotationPeriodMs = 0;
|
||||
o.SrcPeriod = 0;
|
||||
o.ColorAnim = false;
|
||||
o.ScaleCycleEnabled = false;
|
||||
o.RotationEnabled = false;
|
||||
o.SrcAnim = false;
|
||||
|
||||
// Preserve drop-in numbered-save compatibility for the unmodeled secondary cyclic matrix
|
||||
// as well as the modeled channels. The ten native timing dwords form one contiguous range.
|
||||
if (o.NativePersistenceRecord is { Length: >= 0x234 } raw)
|
||||
{
|
||||
raw[0] &= 0xfb;
|
||||
System.Array.Clear(raw, 0x20c, 0x28);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Op 0x238: set its separate global animation-service duration and reset marker.</summary>
|
||||
public void SetAnimClock(long durationTicks)
|
||||
{
|
||||
|
||||
@@ -2556,6 +2556,9 @@ public sealed class VirtualMachine
|
||||
return pc + 1;
|
||||
case "u004223C0": // 0x239 spritesheet cell: (handle)(delay)(duration)(frame count)(columns)(cell)
|
||||
Gfx.SetSrcRect(Read(a[0]), Read(a[3]), Read(a[4]), Read(a[5]), 0); return pc + 1;
|
||||
case "reset-gfx-cyclic-animations": // 0x230: stop all five retained looping channels
|
||||
case "u00421E70":
|
||||
Gfx.ResetCyclicAnimationChannels(Read(a[0])); return pc + 1;
|
||||
case "u00421EA0": // 0x231 looping spritesheet: (handle)(ms per frame)(frame count)(columns)
|
||||
Gfx.SetSrcRect(Read(a[0]), Read(a[2]), Read(a[3]), 0, Read(a[1])); return pc + 1;
|
||||
case "u00421EF0": // 0x232 cyclic packed ARGB; negative alpha/RGB preserve static obj color
|
||||
|
||||
Reference in New Issue
Block a user