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)); }
/// <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)); }
/// <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)); } } }
/// <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)); }