private static TimedList <int, int> CollectSeekFrames([CanBeNull] ScenarioObject scenario, int formationNumber) { var result = new TimedList <int, int>(); if (scenario == null) { return(result); } if (scenario.HasSeekFrameEvents()) { var events = scenario.Scenario.WhereToArray(s => s.Type == ScenarioDataType.DanceAnimationSeekFrame); foreach (var ev in events) { Debug.Assert(ev != null, nameof(ev) + " != null"); if (ev.Idol != formationNumber + 10) { continue; } var frameIndex = (int)Math.Round(ev.AbsoluteTime * FrameRate.Mltd); var targetFrame = ev.SeekFrame; result.AddOrUpdate(frameIndex, targetFrame); } } return(result); }
private static TimedList <int, Vector4[]> CollectFormationChanges([CanBeNull] ScenarioObject scenario, AppealType appealType) { var result = new TimedList <int, Vector4[]>(); if (scenario == null) { return(result); } if (scenario.HasFormationChangeEvents()) { var events = scenario.Scenario.WhereToArray(s => s.Type == ScenarioDataType.FormationChange); foreach (var ev in events) { Debug.Assert(ev != null, nameof(ev) + " != null"); // Layer=0: applied to all appeal variants (including no appeal) // Layer>0: applied to that appeal only if (ev.Layer == 0 || ev.Layer == (int)appealType) { var formations = ev.Formation; Debug.Assert(formations != null && formations.Length > 0); var frameIndex = (int)Math.Round(ev.AbsoluteTime * FrameRate.Mltd); var f = new Vector4[formations.Length]; for (var i = 0; i < formations.Length; i += 1) { var v = formations[i]; f[i] = new Vector4(v.X, v.Y, v.Z, v.W); } result.AddOrUpdate(frameIndex, f); } } } return(result); }