コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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++;
                }
            }
        }