Exemple #1
0
        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);
        }
Exemple #2
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);
        }
Exemple #3
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);
        }