public override void SerializeImpl(SerializerObject s) { var manager = (R1_PS1BaseManager)s.GameSettings.GetGameManager; if (manager.TypeZDCOffset != null) { TypeZDC = s.DoAt(new Pointer(manager.TypeZDCOffset.Value, Offset.file), () => s.SerializeObjectArray <R1_ZDCEntry>(TypeZDC, manager.TypeZDCCount, name: nameof(TypeZDC))); } if (manager.ZDCDataOffset != null) { ZDCData = s.DoAt(new Pointer(manager.ZDCDataOffset.Value, Offset.file), () => s.SerializeObjectArray <R1_ZDCData>(ZDCData, manager.ZDCDataCount, name: nameof(ZDCData))); } if (manager.EventFlagsOffset != null) { if (s.GameSettings.EngineVersion == EngineVersion.R1_Saturn) { EventFlags = s.DoAt(new Pointer(manager.EventFlagsOffset.Value, Offset.file), () => s.SerializeArray <int>(EventFlags?.Select(x => BitHelpers.ReverseBits((int)x)).ToArray(), manager.EventFlagsCount, name: nameof(EventFlags))).Select(BitHelpers.ReverseBits).Select(x => (R1_EventFlags)x).ToArray(); } else { EventFlags = s.DoAt(new Pointer(manager.EventFlagsOffset.Value, Offset.file), () => s.SerializeArray <R1_EventFlags>(EventFlags, manager.EventFlagsCount, name: nameof(EventFlags))); } } if (manager.WorldInfoOffset != null) { WorldInfo = s.DoAt(new Pointer(manager.WorldInfoOffset.Value, Offset.file), () => s.SerializeObjectArray <R1_WorldMapInfo>(WorldInfo, 24, name: nameof(WorldInfo))); } if (manager.LevelBackgroundIndexTableOffset != null) { if (LevelBackgroundIndexTable == null) { LevelBackgroundIndexTable = new byte[6][]; } s.DoAt(new Pointer(manager.LevelBackgroundIndexTableOffset.Value, Offset.file), () => { for (int i = 0; i < LevelBackgroundIndexTable.Length; i++) { LevelBackgroundIndexTable[i] = s.SerializeArray <byte>(LevelBackgroundIndexTable[i], 30, name: $"{nameof(LevelBackgroundIndexTable)}[{i}]"); } }); } var fileTableInfos = manager.FileTableInfos; if (FileTable == null) { FileTable = new R1_PS1_FileTableEntry[fileTableInfos.Sum(x => x.Count)]; } var index = 0; foreach (var info in fileTableInfos) { s.DoAt(new Pointer(info.Offset, Offset.file), () => { for (int i = 0; i < info.Count; i++) { FileTable[index] = s.SerializeObject <R1_PS1_FileTableEntry>(FileTable[index], name: $"{nameof(FileTable)}_{info.FileType}[{i}]"); index++; } }); } if (s.GameSettings.EngineVersion == EngineVersion.R1_Saturn) { var saturnManager = (R1_Saturn_Manager)manager; Saturn_Palettes = s.DoAt(new Pointer(saturnManager.GetPalOffset, Offset.file), () => s.SerializeObjectArray <RGBA5551Color>(Saturn_Palettes, 25 * 256 * 2, name: nameof(Saturn_Palettes))); if (Saturn_FNDFileTable == null) { Saturn_FNDFileTable = new string[6][]; } s.DoAt(new Pointer(saturnManager.GetFndFileTableOffset, Offset.file), () => { for (int i = 0; i < Saturn_FNDFileTable.Length; i++) { Saturn_FNDFileTable[i] = s.SerializeStringArray(Saturn_FNDFileTable[i], 10, 12, name: $"{nameof(Saturn_FNDFileTable)}[{i}]"); } }); if (Saturn_FNDSPFileTable == null) { Saturn_FNDSPFileTable = new string[6][]; } s.DoAt(new Pointer(saturnManager.GetFndSPFileTableOffset, Offset.file), () => { for (int i = 0; i < Saturn_FNDSPFileTable.Length; i++) { Saturn_FNDSPFileTable[i] = s.SerializeStringArray(Saturn_FNDSPFileTable[i], 5, 12, name: $"{nameof(Saturn_FNDSPFileTable)}[{i}]"); } }); if (Saturn_FNDIndexTable == null) { Saturn_FNDIndexTable = new byte[7][]; } s.DoAt(new Pointer(saturnManager.GetFndIndexTableOffset, Offset.file), () => { for (int i = 0; i < Saturn_FNDIndexTable.Length; i++) { Saturn_FNDIndexTable[i] = s.SerializeArray <byte>(Saturn_FNDIndexTable[i], 25, name: $"{nameof(Saturn_FNDIndexTable)}[{i}]"); } }); } }