using System.Linq; using Age.Engine.Model; using Xunit; public class AnimInterpolatorTests { private static GfxState VisibleObj(long handle) { var g = new GfxState(); g.SetSurface(1, resId: 5, colorKey: -1); g.BindDraw(handle, 1, 0, 0, 64, 64, 100, 100); // one 64x64 cell, base pos (100,100) return g; } [Fact] public void PingPong_FoldsAtHalfPeriod() { Assert.Equal(0, BlendMath.PingPong(now: 0, start: 0, period: 1000)); Assert.Equal(500, BlendMath.PingPong(now: 500, start: 0, period: 1000)); // peak at half Assert.Equal(0, BlendMath.PingPong(now: 1000, start: 0, period: 1000)); // back to base } [Fact] public void SrcRect_StaticCell_SelectsSubRect() { var g = VisibleObj(0x100); g.SetSrcRect(0x100, frameCount: 4, columns: 4, cell: 2, period: 0); var ro = g.SnapshotVisibleObjects(0).Single(); Assert.Equal(128, ro.SrcX); // cell 2 * 64 Assert.Equal(64, ro.W); } [Fact] public void SrcRect_Animated_AdvancesOneCellPerPeriodAndWraps() { var g = VisibleObj(0x100); g.SetSrcRect(0x100, frameCount: 4, columns: 4, cell: 0, period: 100); g.SnapshotVisibleObjects(0); // seeds start=0 var second = g.SnapshotVisibleObjects(100).Single(); Assert.Equal(64, second.SrcX); var fourth = g.SnapshotVisibleObjects(300).Single(); Assert.Equal(192, fourth.SrcX); var wrapped = g.SnapshotVisibleObjects(400).Single(); Assert.Equal(0, wrapped.SrcX); } [Fact] public void ColorAnim_Mode0Textured_UsesRgbModulationAndIgnoresAlpha() { var g = VisibleObj(0x100); g.SetColorAnim(0x100, period: 1000, target: GfxState.PackColor(0x80, 0xFF0000)); g.SnapshotVisibleObjects(0); // seeds start=0 var baseFrame = g.SnapshotVisibleObjects(0).Single(); var peak = g.SnapshotVisibleObjects(500).Single(); Assert.Equal((255, 0xffffffL, 0, true), (baseFrame.Alpha, baseFrame.Tint, baseFrame.TintStrength, baseFrame.MultiplyTint)); Assert.Equal((255, 0xff0000L, 0, true), (peak.Alpha, peak.Tint, peak.TintStrength, peak.MultiplyTint)); } [Fact] public void ColorAnim_Mode1_UsesSampledAlphaAsOpacity() { var g = VisibleObj(0x100); g.SetStaticObjectColorResolved(0x100, mode: 1, alpha: 255, rgb: 0xffffff); g.SetColorAnim(0x100, period: 1000, target: GfxState.PackColor(0x80, 0xffffff)); g.SnapshotVisibleObjects(0); var peak = g.SnapshotVisibleObjects(500).Single(); Assert.Equal(0x80, peak.Alpha); Assert.Equal(0, peak.TintStrength); Assert.True(peak.MultiplyTint); } [Fact] public void Ae001hMode0AlphaCycle_IsVisuallyInert() { var g = VisibleObj(0x100); g.SetColorAnimResolved(0x100, period: 1200, alpha: 224, rgb: -1); var start = g.SnapshotVisibleObjects(1000).Single(); var peak = g.SnapshotVisibleObjects(1600).Single(); Assert.Equal(0xe0ffffff, g.TryGet(0x100)!.ColorTarget); Assert.Equal((255, 0xffffffL, 0, true), (start.Alpha, start.Tint, start.TintStrength, start.MultiplyTint)); Assert.Equal((start.Alpha, start.Tint, start.TintStrength, start.MultiplyTint), (peak.Alpha, peak.Tint, peak.TintStrength, peak.MultiplyTint)); } }