예제 #1
0
        public static SimpleChestEvent Serdes(SimpleChestEvent e, ISerializer s)
        {
            e ??= new SimpleChestEvent();
            s.Begin();
            e.ChestType = s.EnumU8(nameof(ChestType), e.ChestType);
            uint padding = s.UInt32(nameof(padding), 0);

            ApiUtil.Assert(padding == 0);
            e.ItemId = (ItemId)StoreIncremented.Serdes(nameof(e.ItemId), (ushort)e.ItemId, s.UInt16);
            e.Amount = s.UInt16(nameof(Amount), e.Amount);
            s.End();
            return(e);
        }
예제 #2
0
 public static AddPartyMemberEvent Serdes(AddPartyMemberEvent e, ISerializer s)
 {
     e ??= new AddPartyMemberEvent();
     s.Begin();
     e.Unk2          = s.UInt8(nameof(Unk2), e.Unk2);
     e.Unk3          = s.UInt8(nameof(Unk3), e.Unk3);
     e.Unk4          = s.UInt8(nameof(Unk4), e.Unk4);
     e.Unk5          = s.UInt8(nameof(Unk5), e.Unk5);
     e.PartyMemberId = (PartyCharacterId)StoreIncremented.Serdes(nameof(PartyMemberId), (ushort)e.PartyMemberId, s.UInt16);
     e.Unk8          = s.UInt16(nameof(Unk8), e.Unk8);
     s.End();
     return(e);
 }
 public static AddRemoveInventoryItemEvent Serdes(AddRemoveInventoryItemEvent e, ISerializer s)
 {
     e ??= new AddRemoveInventoryItemEvent();
     s.Begin();
     e.Operation = s.EnumU8(nameof(Operation), e.Operation);
     e.Amount    = s.UInt8(nameof(Amount), e.Amount);
     e.Unk4      = s.UInt8(nameof(Unk4), e.Unk4);
     e.Unk5      = s.UInt8(nameof(Unk5), e.Unk5);
     e.ItemId    = (ItemId)StoreIncremented.Serdes(nameof(e.ItemId), (ushort)e.ItemId, s.UInt16);
     e.Unk8      = s.UInt16(nameof(Unk8), e.Unk8);
     s.End();
     return(e);
 }
예제 #4
0
        public static QueryItemEvent Serdes(QueryItemEvent e, ISerializer s, QueryType subType)
        {
            e ??= new QueryItemEvent(subType);
            s.Begin();
            e.Operation = s.EnumU8(nameof(Operation), e.Operation);
            e.Immediate = s.UInt8(nameof(Immediate), e.Immediate);
            e.Unk4      = s.UInt8(nameof(Unk4), e.Unk4);
            e.Unk5      = s.UInt8(nameof(Unk5), e.Unk5);
            e.ItemId    = (ItemId)StoreIncremented.Serdes(nameof(ItemId), (ushort)e.ItemId, s.UInt16);

            ApiUtil.Assert(e.Unk4 == 0);
            ApiUtil.Assert(e.Unk5 == 0);

            s.End();
            return(e);
        }
예제 #5
0
 public static RemovePartyMemberEvent Serdes(RemovePartyMemberEvent e, ISerializer s)
 {
     e ??= new RemovePartyMemberEvent();
     s.Begin();
     e.PartyMemberId = (PartyCharacterId)StoreIncremented.Serdes(nameof(PartyMemberId), (byte)e.PartyMemberId, s.UInt8);
     e.Unk2          = s.UInt8(nameof(Unk2), e.Unk2);
     e.Unk3          = s.UInt8(nameof(Unk3), e.Unk3);
     e.Unk4          = s.UInt8(nameof(Unk4), e.Unk4);
     e.Unk5          = s.UInt8(nameof(Unk5), e.Unk5);
     e.Unk6          = s.UInt16(nameof(Unk6), e.Unk6);
     e.Unk8          = s.UInt16(nameof(Unk8), e.Unk8);
     ApiUtil.Assert(e.Unk4 == 0);
     ApiUtil.Assert(e.Unk5 == 0);
     ApiUtil.Assert(e.Unk8 == 0);
     s.End();
     return(e);
 }
예제 #6
0
 public static SoundEvent Serdes(SoundEvent e, ISerializer s)
 {
     e ??= new SoundEvent();
     s.Begin();
     e.Mode               = s.EnumU8(nameof(Mode), e.Mode);
     e.SoundId            = (SampleId)StoreIncremented.Serdes(nameof(SoundId), (byte)e.SoundId, s.UInt8);
     e.Unk3               = s.UInt8(nameof(Unk3), e.Unk3);
     e.Volume             = s.UInt8(nameof(Volume), e.Volume);
     e.RestartProbability = s.UInt8(nameof(RestartProbability), e.RestartProbability);
     e.FrequencyOverride  = s.UInt16(nameof(FrequencyOverride), e.FrequencyOverride);
     e.Unk8               = s.UInt16(nameof(Unk8), e.Unk8);
     ApiUtil.Assert(e.Unk3 <= 100);
     ApiUtil.Assert(e.Volume <= 150);
     ApiUtil.Assert(e.RestartProbability <= 102);
     ApiUtil.Assert(e.Unk8 == 0);
     s.End();
     return(e);
 }
예제 #7
0
        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);
        }
예제 #8
0
        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);
        }