コード例 #1
0
        public static MapNpc Serdes(int _, MapNpc existing, MapType mapType, AssetMapping mapping, ISerializer s)
        {
            if (s == null)
            {
                throw new ArgumentNullException(nameof(s));
            }
            var npc = existing ?? new MapNpc();

            byte id = (byte)npc.Id.ToDisk(mapping);

            id = s.UInt8(nameof(Id), id);
            // npc.Sound = (SampleId?)Tweak.Serdes(nameof(Sound), (byte?)npc.Sound, s.UInt8);
            npc.Sound = s.UInt8(nameof(Sound), npc.Sound);

            ushort?eventNumber = MaxToNullConverter.Serdes(nameof(npc.Node), npc.Node?.Id, s.UInt16);

            if (eventNumber != null && npc.Node == null)
            {
                npc.Node = new DummyEventNode(eventNumber.Value);
            }

            switch (mapType)
            {
            case MapType.ThreeD: npc.SpriteOrGroup = AssetId.SerdesU16(nameof(SpriteOrGroup), npc.SpriteOrGroup, AssetType.ObjectGroup, mapping, s); break;

            case MapType.TwoD: npc.SpriteOrGroup = SpriteId.SerdesU16(nameof(SpriteOrGroup), npc.SpriteOrGroup, AssetType.BigNpcGraphics, mapping, s); break;

            case MapType.TwoDOutdoors: npc.SpriteOrGroup = SpriteId.SerdesU16(nameof(SpriteOrGroup), npc.SpriteOrGroup, AssetType.SmallNpcGraphics, mapping, s); break;

            default: throw new ArgumentOutOfRangeException(nameof(mapType), mapType, null);
            }

            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);

            var assetType = (npc.Flags & NpcFlags.IsMonster) != 0 ? AssetType.MonsterGroup : AssetType.Npc;

            npc.Id = AssetId.FromDisk(assetType, id, mapping);

            return(npc);
        }