public static MapNpc Serdes(int _, MapNpc existing, ISerializer s) { var npc = existing ?? new MapNpc(); s.Begin(); npc.Id = s.Transform <byte, byte?>(nameof(Id), npc.Id, s.UInt8, Tweak.Instance); // npc.Sound = (SampleId?)Tweak.Serdes(nameof(Sound), (byte?)npc.Sound, s.UInt8); npc.Sound = s.UInt8(nameof(Sound), npc.Sound); ushort?eventNumber = ConvertMaxToNull.Serdes(nameof(npc.Node), npc.Node?.Id, s.UInt16); if (eventNumber != null && npc.Node == null) { npc.Node = new DummyEventNode(eventNumber.Value); } npc.ObjectNumber = s.Transform <ushort, ushort?>(nameof(ObjectNumber), npc.ObjectNumber, s.UInt16, Tweak.Instance) ?? 0; npc.Flags = s.EnumU8(nameof(Flags), npc.Flags); npc.Movement = s.EnumU8(nameof(Movement), npc.Movement); npc.Unk8 = s.UInt8(nameof(Unk8), npc.Unk8); npc.Unk9 = s.UInt8(nameof(Unk9), npc.Unk9); s.End(); return(npc); }
public static MapData3D Serdes(MapData3D existing, ISerializer s, AssetInfo config) { var map = existing ?? new MapData3D((MapDataId)config.Id); s.Begin(); map.Flags = s.EnumU8(nameof(Flags), map.Flags); // 0 int npcCount = NpcCountTransform.Serdes("NpcCount", map.Npcs.Count, s.UInt8); // 1 var _ = s.UInt8("MapType", (byte)map.MapType); // 2 map.SongId = s.TransformEnumU8(nameof(SongId), map.SongId, Tweak <SongId> .Instance); // 3 map.Width = s.UInt8(nameof(Width), map.Width); // 4 map.Height = s.UInt8(nameof(Height), map.Height); // 5 map.LabDataId = s.EnumU8(nameof(LabDataId), map.LabDataId); // 6 map.CombatBackgroundId = s.EnumU8(nameof(CombatBackgroundId), map.CombatBackgroundId); // 7 TODO: Verify this is combat background map.PaletteId = (PaletteId)StoreIncremented.Serdes(nameof(PaletteId), (byte)map.PaletteId, s.UInt8); map.Sound = StoreIncremented.Serdes(nameof(Sound), map.Sound, s.UInt8); for (int i = 0; i < npcCount; i++) { map.Npcs.TryGetValue(i, out var npc); npc = MapNpc.Serdes(i, npc, s); if (npc.Id != null) { map.Npcs[i] = npc; } } s.Check(); map.Contents ??= new byte[map.Width * map.Height]; map.Floors ??= new byte[map.Width * map.Height]; map.Ceilings ??= new byte[map.Width * map.Height]; for (int i = 0; i < map.Width * map.Height; i++) { map.Contents[i] = s.UInt8(null, map.Contents[i]); map.Floors[i] = s.UInt8(null, map.Floors[i]); map.Ceilings[i] = s.UInt8(null, map.Ceilings[i]); } s.Check(); map.SerdesZones(s); if (s.Mode == SerializerMode.Reading && s.IsComplete() || s.Mode != SerializerMode.Reading && map.AutomapGraphics == null) { ApiUtil.Assert(map.Zones.Count == 0); return(map); } map.SerdesEvents(s); map.SerdesNpcWaypoints(s); map.SerdesAutomap(s); map.SerdesChains(s, 64); if (s.Mode == SerializerMode.Reading) { map.Unswizzle(); } s.End(); return(map); }
public static MapData2D Serdes(MapData2D existing, ISerializer s, AssetInfo config) { var startOffset = s.Offset; var map = existing ?? new MapData2D((MapDataId)config.Id); s.Begin(); map.Flags = s.EnumU8(nameof(Flags), map.Flags); // 0 int npcCount = s.Transform("NpcCount", map.Npcs.Count, s.UInt8, NpcCountTransform.Instance); // 1 var _ = s.UInt8("MapType", (byte)map.MapType); // 2 map.SongId = s.TransformEnumU8(nameof(SongId), map.SongId, Tweak <SongId> .Instance); // 3 map.Width = s.UInt8(nameof(Width), map.Width); // 4 map.Height = s.UInt8(nameof(Height), map.Height); // 5 map.TilesetId = (TilesetId)StoreIncremented.Serdes(nameof(TilesetId), (byte)map.TilesetId, s.UInt8); //6 map.CombatBackgroundId = s.EnumU8(nameof(CombatBackgroundId), map.CombatBackgroundId); // 7 map.PaletteId = (PaletteId)StoreIncremented.Serdes(nameof(PaletteId), (byte)map.PaletteId, s.UInt8); map.FrameRate = s.UInt8(nameof(FrameRate), map.FrameRate); //9 for (int i = 0; i < npcCount; i++) { map.Npcs.TryGetValue(i, out var npc); npc = MapNpc.Serdes(i, npc, s); if (npc.ObjectNumber != 0 || npc.Id != null) { map.Npcs[i] = npc; } } s.Check(); map.Underlay ??= new int[map.Width * map.Height]; map.Overlay ??= new int[map.Width * map.Height]; for (int i = 0; i < map.Width * map.Height; i++) { ushort underlay = (ushort)(map.Underlay[i] + 1); ushort overlay = (ushort)(map.Overlay[i] + 1); byte b1 = (byte)(overlay >> 4); byte b2 = (byte)(((overlay & 0xf) << 4) | ((underlay & 0xf00) >> 8)); byte b3 = (byte)(underlay & 0xff); b1 = s.UInt8(null, b1); b2 = s.UInt8(null, b2); b3 = s.UInt8(null, b3); map.Overlay[i] = (b1 << 4) + (b2 >> 4); map.Underlay[i] = ((b2 & 0x0F) << 8) + b3; } s.Check(); ApiUtil.Assert(s.Offset == startOffset + 10 + npcCount * MapNpc.SizeOnDisk + 3 * map.Width * map.Height); map.SerdesZones(s); map.SerdesEvents(s); map.SerdesNpcWaypoints(s); if (map.Events.Any()) { map.SerdesChains(s, 250); } if (s.Mode == SerializerMode.Reading) { map.Unswizzle(); } s.End(); return(map); }