/// <summary> /// Handles the data serialization /// </summary> /// <param name="s">The serializer object</param> public override void SerializeImpl(SerializerObject s) { // Get info var pointerTable = s.GameSettings.EngineVersion != EngineVersion.R1Jaguar_Proto ? PointerTables.JaguarR1_PointerTable(s.GameSettings.EngineVersion, this.Offset.file) : null; var manager = (R1Jaguar_Manager)s.GameSettings.GetGameManager; var levels = manager.GetNumLevels; // Serialize the references for the prototype if (s.GameSettings.EngineVersion == EngineVersion.R1Jaguar_Proto) { s.DoAt(new Pointer(0x8BB6A8, Offset.file), () => { References = s.SerializeObjectArray <R1Jaguar_ReferenceEntry>(References, 1676, onPreSerialize: (x => x.StringBase = new Pointer(0x8C0538, Offset.file)), name: nameof(References)); // Unknown initial 4 bytes, part of the string table UnkReferenceValue = s.Serialize <uint>(UnkReferenceValue, name: nameof(UnkReferenceValue)); }); } // Serialize event definition data if (s.GameSettings.EngineVersion == EngineVersion.R1Jaguar) { if (!s.Context.FileExists("RAM_EventDefinitions")) { // Copied to 0x001f9000 in memory. All pointers to 0x001Fxxxx likely point to an entry in this table s.DoAt(pointerTable[JaguarR1_Pointer.EventDefinitions], () => { byte[] EventDefsDataBytes = s.SerializeArray <byte>(null, manager.EventCount * 0x28, name: nameof(EventDefsDataBytes)); var file = new MemoryMappedByteArrayFile("RAM_EventDefinitions", EventDefsDataBytes, s.Context, 0x001f9000) { Endianness = BinaryFile.Endian.Big }; s.Context.AddFile(file); s.DoAt(file.StartPointer, () => EventDefinitions = s.SerializeObjectArray <R1Jaguar_EventDefinition>(EventDefinitions, manager.EventCount, name: nameof(EventDefinitions))); }); } } else { var offset = s.GameSettings.EngineVersion == EngineVersion.R1Jaguar_Proto ? GetProtoDataPointer(R1Jaguar_Proto_References.MS_rayman) : pointerTable[JaguarR1_Pointer.EventDefinitions]; // Pointers all point to the ROM, not RAM s.DoAt(offset, () => EventDefinitions = s.SerializeObjectArray <R1Jaguar_EventDefinition>(EventDefinitions, manager.EventCount, name: nameof(EventDefinitions))); } if (AdditionalEventDefinitions == null) { if (s.GameSettings.EngineVersion != EngineVersion.R1Jaguar_Proto) { AdditionalEventDefinitions = manager.AdditionalEventDefinitionPointers.Select(p => { return(s.DoAt(new Pointer(p, pointerTable[JaguarR1_Pointer.EventDefinitions].file), () => s.SerializeObject <R1Jaguar_EventDefinition>(default, name: nameof(AdditionalEventDefinitions))));
public static MemoryMappedByteArrayFile AddMemoryMappedByteArrayFile(this Context context, string name, byte[] bytes, uint baseAddress, BinaryFile.Endian endianness = BinaryFile.Endian.Little, bool recreateOnWrite = true) { var file = new MemoryMappedByteArrayFile(name, bytes, context, baseAddress) { Endianness = endianness, RecreateOnWrite = recreateOnWrite }; context.AddFile(file); return(file); }