예제 #1
0
        public override void SerializeImpl(SerializerObject s)
        {
            // Serialize alpha data (only on EDU)
            if (s.GameSettings.EngineVersion == EngineVersion.R1_PC_Edu || s.GameSettings.EngineVersion == EngineVersion.R1_PS1_Edu)
            {
                if (EDU_Alpha == null)
                {
                    EDU_Alpha = new byte[160][];
                }

                for (int i = 0; i < EDU_Alpha.Length; i++)
                {
                    EDU_Alpha[i] = s.SerializeArray <byte>(EDU_Alpha[i], 256, name: $"{nameof(EDU_Alpha)}[{i}]");
                }
            }

            LevelsCount    = s.Serialize <ushort>(LevelsCount, name: nameof(LevelsCount));
            Unk2           = s.Serialize <byte>(Unk2, name: nameof(Unk2));
            Unk3           = s.Serialize <byte>(Unk3, name: nameof(Unk3));
            WorldMapVig    = s.SerializeString(WorldMapVig, 9, name: nameof(WorldMapVig));
            LevelSelectVig = s.SerializeString(LevelSelectVig, 9, name: nameof(LevelSelectVig));
            Unk4           = s.SerializeArray <byte>(Unk4, 7, name: nameof(Unk4));
            Unk5           = s.Serialize <byte>(Unk5, name: nameof(Unk5));
            Unk6           = s.Serialize <ushort>(Unk6, name: nameof(Unk6));

            Levels = s.SerializeObjectArray <R1_WorldMapInfo>(Levels, 32, name: nameof(Levels));

            Unk8 = s.Serialize <uint>(Unk8, name: nameof(Unk8));
            Unk9 = s.SerializeArray <byte>(Unk9, 17, name: nameof(Unk9));

            UnkStrings = s.SerializeStringArray(UnkStrings, 319, 9, name: nameof(UnkStrings));

            UnkLevelStructs = s.SerializeObjectArray <R1_PC_WorldMapLevelUnkStruct>(UnkLevelStructs, LevelsCount, name: nameof(UnkLevelStructs));
        }
예제 #2
0
        /// <summary>
        /// Handles the data serialization
        /// </summary>
        /// <param name="s">The serializer object</param>
        public override void SerializeImpl(SerializerObject s)
        {
            Unk1 = s.Serialize <uint>(Unk1, name: nameof(Unk1));

            var unk2Length = 27;

            // The PS1 version hard-codes a different length for this version
            if (s.GameSettings.EngineVersion == EngineVersion.R1_PS1_Edu && s.GameSettings.EduVolume.StartsWith("CS"))
            {
                unk2Length = 29;
            }

            Unk2        = s.SerializeArray <byte>(Unk2, unk2Length, name: nameof(Unk2));
            Unk3        = s.SerializeArray <byte>(Unk3, 3130, name: nameof(Unk3));
            SampleNames = s.SerializeStringArray(SampleNames, 7, 9, name: nameof(SampleNames));

            VignetteItemsCount = s.Serialize <byte>(VignetteItemsCount, name: nameof(VignetteItemsCount));
            Unk5 = s.Serialize <uint>(Unk5, name: nameof(Unk5));
            Unk6 = s.Serialize <uint>(Unk6, name: nameof(Unk6));

            VignetteItems = s.SerializeObjectArray <R1_PCEdu_GeneralFileVignetteItem>(VignetteItems, VignetteItemsCount, name: nameof(VignetteItems));

            CreditsStringItemsCount = s.Serialize <uint>(CreditsStringItemsCount, name: nameof(CreditsStringItemsCount));
            CreditsStringItems      = s.SerializeObjectArray <R1_PC_GeneralFileStringItem>(CreditsStringItems, CreditsStringItemsCount, name: nameof(CreditsStringItems));
        }
예제 #3
0
        /// <summary>
        /// Serializes the data
        /// </summary>
        /// <param name="s">The serializer object</param>
        public override void SerializeImpl(SerializerObject s)
        {
            // Serialize PC Header
            base.SerializeImpl(s);

            // Serialize world data
            BG1 = s.Serialize <ushort>(BG1, name: nameof(BG1));
            BG2 = s.Serialize <ushort>(BG2, name: nameof(BG2));
            Plan0NumPcxCount  = s.Serialize <byte>(Plan0NumPcxCount, name: nameof(Plan0NumPcxCount));
            VideoBiosCheckSum = s.Serialize <byte>(VideoBiosCheckSum, name: nameof(VideoBiosCheckSum));
            BiosCheckSum      = s.Serialize <byte>(BiosCheckSum, name: nameof(BiosCheckSum));

            if (s.GameSettings.EngineVersion == EngineVersion.R1_PC || s.GameSettings.EngineVersion == EngineVersion.R1_PocketPC)
            {
                s.DoXOR(0x15, () => Plan0NumPcx = s.SerializeArray <byte>(Plan0NumPcx, Plan0NumPcxCount, name: nameof(Plan0NumPcx)));
            }
            else
            {
                s.DoXOR(0x19, () => Plan0NumPcxFiles = s.SerializeStringArray(Plan0NumPcxFiles, Plan0NumPcxCount, 8, name: nameof(Plan0NumPcxFiles)));
            }

            // Serialize the DES
            DesItemCount = s.Serialize <ushort>(DesItemCount, name: nameof(DesItemCount));

            DesItems = s.SerializeObjectArray <R1_PC_DES>(DesItems, DesItemCount, onPreSerialize: data => data.FileType = R1_PC_DES.Type.World, name: nameof(DesItems));

            // Serialize the ETA
            Eta = s.SerializeArraySize <R1_PC_ETA, byte>(Eta, name: nameof(Eta));
            Eta = s.SerializeObjectArray <R1_PC_ETA>(Eta, Eta.Length, name: nameof(Eta));

            // Kit and EDU have more data...
            if (s.GameSettings.EngineVersion == EngineVersion.R1_PC_Kit || s.GameSettings.EngineVersion == EngineVersion.R1_PC_Edu)
            {
                // Serialize world defines
                WorldDefineChecksum = s.DoChecksum(new Checksum8Calculator(false), () =>
                {
                    s.DoXOR(0x71, () => WorldDefine = s.SerializeObject <R1_PC_WorldDefine>(WorldDefine, name: nameof(WorldDefine)));
                }, ChecksumPlacement.Before, name: nameof(WorldDefineChecksum));

                // Serialize file tables
                if (s.GameSettings.EngineVersion == EngineVersion.R1_PC_Kit)
                {
                    DESFileNames = s.SerializeStringArray(DESFileNames, 100, 13, name: nameof(DESFileNames));
                    ETAFileNames = s.SerializeStringArray(ETAFileNames, 60, 13, name: nameof(ETAFileNames));
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Handles the data serialization
        /// </summary>
        /// <param name="s">The serializer object</param>
        public override void SerializeImpl(SerializerObject s)
        {
            VersionsCount         = s.Serialize <byte>(VersionsCount, name: nameof(VersionsCount));
            RuntimeCurrentVersion = s.Serialize <byte>(RuntimeCurrentVersion, name: nameof(RuntimeCurrentVersion));

            s.DoAt(Offset + 0x02, () => VersionCodes        = s.SerializeStringArray(VersionCodes, VersionsCount, 5, name: nameof(VersionCodes)));
            s.DoAt(Offset + 0x52, () => VersionModes        = s.SerializeStringArray(VersionModes, VersionsCount, 20, name: nameof(VersionModes)));
            s.DoAt(Offset + 0x192, () => VersionMemoryInfos = s.SerializeObjectArray <R1_PC_VersionMemoryInfo>(VersionMemoryInfos, VersionsCount, name: nameof(VersionMemoryInfos)));

            s.DoAt(Offset + (s.GameSettings.EngineVersion == EngineVersion.R1_PC_Kit ? 0x392 : 0x312), () =>
            {
                DefaultPrimaryHeader   = s.SerializeString(DefaultPrimaryHeader, 5, name: nameof(DefaultPrimaryHeader));
                DefaultSecondaryHeader = s.SerializeString(DefaultSecondaryHeader, 5, name: nameof(DefaultSecondaryHeader));
                UnkHeaderValue         = s.Serialize <ushort>(UnkHeaderValue, name: nameof(UnkHeaderValue));
            });

            // Make sure we actually end up at the end of the file.
            s.Goto(Offset + (s.GameSettings.EngineVersion == EngineVersion.R1_PC_Kit ? 0x39E : 0x31E));
        }