Esempio n. 1
0
        public static LabyrinthData Serdes(int _, LabyrinthData d, AssetMapping mapping, ISerializer s)
        {
            if (s == null)
            {
                throw new ArgumentNullException(nameof(s));
            }
            d ??= new LabyrinthData();
            PerfTracker.StartupEvent("Start loading labyrinth data");
            // s.ByteArray("UnknownBlock6C", () => sheet.UnknownBlock6C, x => sheet.UnknownBlock6C = x, 14);

            d.WallHeight           = s.UInt16(nameof(d.WallHeight), d.WallHeight);                                                       // 0
            d.CameraHeight         = s.UInt16(nameof(d.CameraHeight), d.CameraHeight);                                                   // 2
            d.Unk4                 = s.UInt16(nameof(d.Unk4), d.Unk4);                                                                   // 4
            d.BackgroundId         = SpriteId.SerdesU16(nameof(BackgroundId), d.BackgroundId, AssetType.BackgroundGraphics, mapping, s); // 6
            d.BackgroundYPosition  = s.UInt16(nameof(d.BackgroundYPosition), d.BackgroundYPosition);                                     // 8
            d.FogDistance          = s.UInt16(nameof(d.FogDistance), d.FogDistance);                                                     // A
            d.FogRed               = s.UInt16(nameof(d.FogRed), d.FogRed);                                                               // C
            d.FogGreen             = s.UInt16(nameof(d.FogGreen), d.FogGreen);                                                           // E
            d.FogBlue              = s.UInt16(nameof(d.FogBlue), d.FogBlue);                                                             // 10
            d.Unk12                = s.UInt8(nameof(d.Unk12), d.Unk12);                                                                  // 12
            d.Unk13                = s.UInt8(nameof(d.Unk13), d.Unk13);                                                                  // 13
            d.BackgroundColour     = s.UInt8(nameof(d.BackgroundColour), d.BackgroundColour);                                            // 14
            d.Unk15                = s.UInt8(nameof(d.Unk15), d.Unk15);                                                                  // 15
            d.FogMode              = s.UInt16(nameof(d.FogMode), d.FogMode);                                                             // 16
            d.MaxLight             = s.UInt16(nameof(d.MaxLight), d.MaxLight);                                                           // 18
            d.WallWidth            = s.UInt16(nameof(d.WallWidth), d.WallWidth);                                                         // 1A
            d.BackgroundTileAmount = s.UInt16(nameof(d.BackgroundTileAmount), d.BackgroundTileAmount);                                   // 1C
            d.MaxVisibleTiles      = s.UInt16(nameof(d.MaxVisibleTiles), d.MaxVisibleTiles);                                             // 1E
            d.Unk20                = s.UInt16(nameof(d.Unk20), d.Unk20);                                                                 // 20
            d.Lighting             = s.UInt16(nameof(d.Lighting), d.Lighting);                                                           // 22
            d.Unk24                = s.UInt16(nameof(d.Unk24), d.Unk24);                                                                 // 24
            s.Check();

            ushort objectGroupCount = s.UInt16("ObjectGroupCount", (ushort)d.ObjectGroups.Count); // 26

            s.List(nameof(d.ObjectGroups), d.ObjectGroups, objectGroupCount, ObjectGroup.Serdes);
            s.Check();

            var floorAndCeilingCount = s.UInt16("FloorAndCeilingCount", (ushort)d.FloorAndCeilings.Count); // 28 + objectGroupCount * 42

            s.List(nameof(d.FloorAndCeilings), d.FloorAndCeilings, mapping, floorAndCeilingCount, FloorAndCeiling.Serdes);
            s.Check();

            ushort objectCount = s.UInt16("ObjectCount", (ushort)d.Objects.Count); // 2A + objectGroupCount * 42 + floorAndCeilingCount * A

            s.List(nameof(d.Objects), d.Objects, mapping, objectCount, LabyrinthObject.Serdes);
            s.Check();

            // Populate objectIds on subobjects to improve debugging experience
            foreach (var so in d.ObjectGroups.SelectMany(x => x.SubObjects))
            {
                if (so.ObjectInfoNumber >= d.Objects.Count)
                {
                    continue;
                }
                so.SpriteId = d.Objects[so.ObjectInfoNumber].SpriteId;
            }

            ushort wallCount = s.UInt16("WallCount", (ushort)d.Walls.Count);

            s.List(nameof(d.Walls), d.Walls, mapping, wallCount, Wall.Serdes);
            s.Check();
            PerfTracker.StartupEvent("Finish loading labyrinth data");
            return(d);
        }
Esempio n. 2
0
        public static void Serialize(LabyrinthData d, ISerializer s, long length)
        {
            PerfTracker.StartupEvent("Start loading labyrinth data");
            var start = s.Offset;

            // s.ByteArray("UnknownBlock6C", () => sheet.UnknownBlock6C, x => sheet.UnknownBlock6C = x, 14);

            s.Dynamic(d, nameof(d.WallHeight));           // 0
            s.Dynamic(d, nameof(d.CameraHeight));         // 2
            s.Dynamic(d, nameof(d.Unk4));                 // 4

            s.UInt16(nameof(d.BackgroundId),
                     () => FormatUtil.Untweak((ushort?)d.BackgroundId),
                     x => d.BackgroundId = (DungeonBackgroundId?)FormatUtil.Tweak(x)); // 6

            s.Dynamic(d, nameof(d.BackgroundYPosition));                               // 8
            s.Dynamic(d, nameof(d.FogDistance));                                       // A
            s.Dynamic(d, nameof(d.FogRed));                                            // C
            s.Dynamic(d, nameof(d.FogGreen));                                          // E
            s.Dynamic(d, nameof(d.FogBlue));                                           // 10
            s.Dynamic(d, nameof(d.Unk12));                                             // 12
            s.Dynamic(d, nameof(d.Unk13));                                             // 13
            s.Dynamic(d, nameof(d.BackgroundColour));                                  // 14
            s.Dynamic(d, nameof(d.Unk15));                                             // 15
            s.Dynamic(d, nameof(d.FogMode));                                           // 16
            s.Dynamic(d, nameof(d.MaxLight));                                          // 18
            s.Dynamic(d, nameof(d.WallWidth));                                         // 1A
            s.Dynamic(d, nameof(d.BackgroundTileAmount));                              // 1C
            s.Dynamic(d, nameof(d.MaxVisibleTiles));                                   // 1E
            s.Dynamic(d, nameof(d.Unk20));                                             // 20
            s.Dynamic(d, nameof(d.Lighting));                                          // 22
            s.Dynamic(d, nameof(d.Unk24));                                             // 24
            s.Check();

            Debug.Assert(s.Offset - start <= length);

            ushort objectGroupCount = (ushort)d.ObjectGroups.Count; // 26

            s.UInt16("ObjectGroupCount", () => (ushort)d.ObjectGroups.Count, x => objectGroupCount = x);
            s.List(d.ObjectGroups, objectGroupCount, ObjectGroup.Serialize, () => new ObjectGroup());
            Debug.Assert(s.Offset - start <= length);

            var floorAndCeilingCount = (ushort)d.FloorAndCeilings.Count; // 28 + objectGroupCount * 42

            s.UInt16("FloorAndCeilingCount", () => floorAndCeilingCount, x => floorAndCeilingCount = x);
            s.List(d.FloorAndCeilings, floorAndCeilingCount, FloorAndCeiling.Serialize, () => new FloorAndCeiling());
            Debug.Assert(s.Offset - start <= length);

            ushort objectCount = (ushort)d.Objects.Count; // 2A + objectGroupCount * 42 + floorAndCeilingCount * A

            s.UInt16("ObjectCount", () => objectCount, x => objectCount = x);
            s.List(d.Objects, objectCount, Object.Serialize, () => new Object());
            Debug.Assert(s.Offset - start <= length);

            // Populate objectIds on subobjects to improve debugging experience
            foreach (var so in d.ObjectGroups.SelectMany(x => x.SubObjects))
            {
                if (so.ObjectInfoNumber >= d.Objects.Count)
                {
                    continue;
                }
                so.ObjectId = d.Objects[so.ObjectInfoNumber].TextureNumber;
            }

            ushort wallCount = (ushort)d.Walls.Count;

            s.UInt16("WallCount", () => wallCount, x => wallCount = x);
            s.List(d.Walls, wallCount, Wall.Serialize, () => new Wall());
            Debug.Assert(s.Offset - start <= length);
            PerfTracker.StartupEvent("Finish loading labyrinth data");
        }