using Microsoft.Xna.Framework; using Terraria; namespace SoulHarvest.Common; /// /// Shared, deterministic geometry and timing for the Death Reaper ultimate. /// Combat, persistent world cuts and the final mirror shatter must all consume /// these values so the screen can only break along cuts that actually happened. /// internal static class ReaperDeathUltimateGeometry { internal const int CutCount = 18; internal const int FirstCutTick = 20; internal const int CutInterval = 6; internal const int ShatterTick = 172; internal const int Duration = 190; internal const float CutLength = 5200f; internal const float CutCollisionWidth = 11f; internal const float CutVisualWidth = 60f; internal static int GetCutTick(int cutIndex) => FirstCutTick + cutIndex * CutInterval; internal static Vector2 GetCutAxis(int actionId, int cutIndex) { uint hash = unchecked((uint)(actionId * 747796405 + cutIndex * 2891336453)); hash ^= hash >> 16; hash *= 0x7FEB352Du; hash ^= hash >> 15; float angle = (hash & 0x00FFFFFFu) / 16777215f * MathHelper.Pi - MathHelper.PiOver2; return angle.ToRotationVector2(); } }