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