/// <summary> /// Loads animation data/frames for the specified level. /// </summary> /// <param name="level">The level to load data for</param> /// <param name="lastFrame">The index of the first frame after the current area's frame data, or FF to leave unspecified. If an FF terminator is encountered in frame data, parsing will stop sooner.</param> /// <returns></returns> private static ChrAnimationLevelData LoadAnimationsForLevel(MetroidRom rom, LevelIndex level, int lastFrame) { ChrAnimationLevelData data = new ChrAnimationLevelData(level); // CHR usage table has been repurposed in MMC3 ROMs (hence accessor names don't match usage) data.SprBank0 = rom.ChrUsage.GetSprPage(level); data.SprBank1 = rom.ChrUsage.GetBgLastPage(level); // First frame index int frameIndex = rom.ChrUsage.GetBgFirstPage(level); bool keepGoing = true; while (keepGoing && frameIndex < lastFrame && frameIndex < 0xFF) { ChrAnimationTable loadedAnimation = LoadOneAnimation(rom, level, ref frameIndex); if (loadedAnimation == null) { if (data.Animations.Count == 0) { loadedAnimation = new ChrAnimationTable(); ChrAnimationFrame frame = new ChrAnimationFrame(); frame.FrameTime = 1; loadedAnimation.Frames.Add(frame); } else { return(data); } } data.Animations.Add(loadedAnimation); } return(data); }
/// <summary> /// Writes frame data to the chr animation table for the specified animations. The CHR usage table is not updated by this method. /// </summary> /// <param name="rom"></param> /// <param name="animationData"></param> /// <param name="frameIndex"></param> internal static void SerializeChrAnimation(MetroidRom rom, ChrAnimationLevelData animationData, ref int frameIndex) { for (int iAnimation = 0; iAnimation < animationData.Animations.Count; iAnimation++) { var animation = animationData.Animations[iAnimation]; animation.SerializedFrameIndex = frameIndex; for (int iFrame = 0; iFrame < animation.Frames.Count; iFrame++) { var frame = animation.Frames[iFrame]; rom.SetAnimationTable_Bank0(frameIndex, frame.Bank0); rom.SetAnimationTable_Bank1(frameIndex, frame.Bank1); rom.SetAnimationTable_Bank2(frameIndex, frame.Bank2); rom.SetAnimationTable_Bank3(frameIndex, frame.Bank3); rom.SetAnimationTable_FrameTime(frameIndex, frame.FrameTime); rom.SetAnimationTable_FrameLast(frameIndex, iFrame == animation.Frames.Count - 1); frameIndex++; } } }