Example #1
0
File: House.cs Project: irxnic/ACSE
        public void Write()
        {
            var saveData = MainForm.SaveFile;
            var offsets  = HouseInfo.GetHouseOffsets(saveData.SaveType);

            // Set House TownID & Name
            if (offsets.OwningPlayerName != -1 && Owner != null && offsets.TownId != -1)
            {
                Data.TownId = saveData.ReadUInt16(saveData.SaveDataStartOffset + MainForm.CurrentSaveInfo.SaveOffsets.TownId, saveData.IsBigEndian); // Might not be UInt16 in all games
            }
            if (offsets.OwningPlayerName != -1 && Owner != null && offsets.TownName != -1)
            {
                Data.TownName = saveData.ReadString(saveData.SaveDataStartOffset + MainForm.CurrentSaveInfo.SaveOffsets.TownName,
                                                    MainForm.CurrentSaveInfo.SaveOffsets.TownNameSize);
            }
            if (offsets.OwningPlayerName != -1 && Owner != null)
            {
                Data.OwningPlayerName = Owner.Data.Name;
            }
            if (offsets.OwningPlayerId != -1 && Owner != null)
            {
                Data.OwningPlayerId = Owner.Data.Identifier;
            }

            var houseOffsetData = typeof(HouseOffsets);
            var houseDataType   = typeof(HouseData);

            foreach (var field in houseOffsetData.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                if (field.GetValue(offsets) == null || field.Name.Contains("Count") ||
                    field.Name.Contains("Size"))
                {
                    continue;
                }
                if (houseDataType.GetField(field.Name) == null)
                {
                    continue;
                }
                if (field.FieldType != typeof(int) || (int)field.GetValue(offsets) == -1)
                {
                    continue;
                }
                var fieldType  = houseDataType.GetField(field.Name).FieldType;
                var dataOffset = Offset + (int)field.GetValue(offsets);
                //MessageBox.Show("Field Name: " + Field.Name + " | Data Offset: " + DataOffset.ToString("X"));
                if (fieldType == typeof(string))
                {
                    saveData.Write(dataOffset, AcString.GetBytes((string)houseDataType.GetField(field.Name).GetValue(Data),
                                                                 (int)houseOffsetData.GetField(field.Name + "Size").GetValue(offsets)));
                }
                else if (fieldType == typeof(byte))
                {
                    saveData.Write(dataOffset, (byte)houseDataType.GetField(field.Name).GetValue(Data));
                }
                else if (fieldType == typeof(byte[]))
                {
                    saveData.Write(dataOffset, (byte[])houseDataType.GetField(field.Name).GetValue(Data));
                }
                else if (fieldType == typeof(ushort))
                {
                    saveData.Write(dataOffset, (ushort)houseDataType.GetField(field.Name).GetValue(Data), saveData.IsBigEndian);
                }
                else if (fieldType == typeof(Item))
                {
                    if (saveData.SaveGeneration == SaveGeneration.N3DS)
                    {
                        saveData.Write(dataOffset, ItemData.EncodeItem((Item)houseDataType.GetField(field.Name).GetValue(Data)), saveData.IsBigEndian);
                    }
                    else
                    {
                        saveData.Write(dataOffset, ((Item)houseDataType.GetField(field.Name).GetValue(Data)).ItemId, saveData.IsBigEndian);
                    }
                }
            }

            foreach (var r in Data.Rooms)
            {
                r.Write();
            }
        }
Example #2
0
File: House.cs Project: irxnic/ACSE
        public House(int index, int offset)
        {
            Index  = index;
            Offset = offset;

            var houseSize = HouseInfo.GetHouseSize(offset, MainForm.SaveFile.SaveType);
            var basement  = false;

            //Console.WriteLine("House Index: " + Index);
            //Console.WriteLine("House Offset: 0x" + Offset.ToString("X"));
            //Console.WriteLine("House Size: " + HouseSize.ToString());
            if (MainForm.SaveFile.SaveGeneration == SaveGeneration.N64 || MainForm.SaveFile.SaveGeneration == SaveGeneration.GCN)
            {
                basement = HouseInfo.HasBasement(offset, MainForm.SaveFile.SaveType);
                //Console.WriteLine("Basement: " + Basement.ToString());
            }

            // Load House Data
            var    offsets            = HouseInfo.GetHouseOffsets(MainForm.SaveFile.SaveType);
            var    saveData           = MainForm.SaveFile;
            var    playerDataType     = typeof(HouseData);
            var    playerSaveInfoType = typeof(HouseOffsets);
            object boxedData          = new HouseData();

            foreach (var field in playerSaveInfoType.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                if (field.GetValue(offsets) == null || field.Name.Contains("Count") ||
                    field.Name.Contains("Size"))
                {
                    continue;
                }
                if (playerDataType.GetField(field.Name) == null)
                {
                    continue;
                }
                if (field.FieldType != typeof(int) || (int)field.GetValue(offsets) == -1)
                {
                    continue;
                }
                var currentField = playerDataType.GetField(field.Name);
                var fieldType    = currentField.FieldType;
                var dataOffset   = offset + (int)field.GetValue(offsets);

                if (field.Name.Equals("Room_Carpet") || field.Name.Equals("Room_Wallpaper") ||
                    field.Name.Equals("Room_Song"))
                {
                    continue;
                }
                if (fieldType == typeof(byte))
                {
                    currentField.SetValue(boxedData, saveData.ReadByte(dataOffset));
                }
                else if (fieldType == typeof(byte[]) && playerSaveInfoType.GetField(field.Name + "Count") != null)
                {
                    currentField.SetValue(boxedData, saveData.ReadByteArray(dataOffset,
                                                                            (int)playerSaveInfoType.GetField(field.Name + "Count").GetValue(offsets)));
                }
                else if (fieldType == typeof(ushort))
                {
                    currentField.SetValue(boxedData, saveData.ReadUInt16(dataOffset, saveData.IsBigEndian));
                }
                else if (fieldType == typeof(ushort[]))
                {
                    currentField.SetValue(boxedData, saveData.ReadUInt16Array(dataOffset,
                                                                              (int)playerSaveInfoType.GetField(field.Name + "Count").GetValue(offsets), saveData.IsBigEndian));
                }
                else if (fieldType == typeof(uint))
                {
                    currentField.SetValue(boxedData, saveData.ReadUInt32(dataOffset, saveData.IsBigEndian));
                }
                else if (fieldType == typeof(string))
                {
                    currentField.SetValue(boxedData, new AcString(saveData.ReadByteArray(dataOffset,
                                                                                         (int)playerSaveInfoType.GetField(field.Name + "Size").GetValue(offsets)), saveData.SaveType).Trim());
                }
                else if (fieldType == typeof(Item))
                {
                    if (saveData.SaveGeneration == SaveGeneration.N3DS)
                    {
                        currentField.SetValue(boxedData, new Item(saveData.ReadUInt32(dataOffset, false)));
                    }
                    else
                    {
                        currentField.SetValue(boxedData, new Item(saveData.ReadUInt16(dataOffset, saveData.IsBigEndian)));
                    }
                }
                else if (fieldType == typeof(NewLeafInt32))
                {
                    var intData = saveData.ReadUInt32Array(dataOffset, 2);
                    currentField.SetValue(boxedData, new NewLeafInt32(intData[0], intData[1]));
                }
                else if (fieldType == typeof(AcDate) && dataOffset > 0)
                {
                    currentField.SetValue(boxedData, new AcDate(saveData.ReadByteArray(dataOffset,
                                                                                       (int)playerSaveInfoType.GetField(field.Name + "Size").GetValue(offsets))));
                }
            }
            Data = (HouseData)boxedData;

            // Load Rooms/Layers
            var       itemDataSize  = MainForm.SaveFile.SaveGeneration == SaveGeneration.N3DS ? 4 : 2;
            const int itemsPerLayer = 256; //Offsets.Layer_Size / ItemDataSize;

            Data.Rooms = new Room[offsets.RoomCount];
            var roomNames = HouseInfo.GetRoomNames(saveData.SaveGeneration);

            for (var i = 0; i < offsets.RoomCount; i++)
            {
                var roomOffset = offset + offsets.RoomStart + i * offsets.RoomSize;
                var room       = new Room
                {
                    Index  = i,
                    Offset = roomOffset,
                    Name   = roomNames[i],
                    Layers = new Layer[offsets.LayerCount]
                };

                if (saveData.SaveGeneration == SaveGeneration.N64 || saveData.SaveGeneration == SaveGeneration.GCN)
                {
                    room.Carpet    = new Item((ushort)(0x2600 | saveData.ReadByte(roomOffset + offsets.RoomCarpet)));
                    room.Wallpaper = new Item((ushort)(0x2700 | saveData.ReadByte(roomOffset + offsets.RoomWallpaper)));
                }
                else
                {
                    room.Carpet    = new Item(saveData.ReadUInt16(roomOffset + offsets.RoomCarpet, saveData.IsBigEndian));
                    room.Wallpaper = new Item(saveData.ReadUInt16(roomOffset + offsets.RoomWallpaper, saveData.IsBigEndian));
                }

                for (var x = 0; x < offsets.LayerCount; x++)
                {
                    var layerOffset = roomOffset + offsets.LayerSize * x;
                    var layer       = new Layer
                    {
                        Offset = layerOffset,
                        Index  = x,
                        Items  = new Furniture[itemsPerLayer],
                        Parent = room
                    };

                    // Load furniture for the layer
                    for (var f = 0; f < itemsPerLayer; f++)
                    {
                        var furnitureOffset = layerOffset + f * itemDataSize;
                        if (itemDataSize == 4)
                        {
                            layer.Items[f] = new Furniture(saveData.ReadUInt32(furnitureOffset));
                        }
                        else
                        {
                            layer.Items[f] = new Furniture(saveData.ReadUInt16(furnitureOffset, saveData.IsBigEndian));
                        }
                    }

                    room.Layers[x] = layer;
                }
                Data.Rooms[i] = room;
            }
        }
Example #3
0
        public void Write()
        {
            var SaveData = MainForm.Save_File;
            var Offsets  = HouseInfo.GetHouseOffsets(SaveData.Save_Type);

            // Set House TownID & Name
            if (Offsets.Owning_Player_Name != -1 && Owner != null && Offsets.Town_ID != -1)
            {
                Data.Town_ID = SaveData.ReadUInt16(SaveData.Save_Data_Start_Offset + MainForm.Current_Save_Info.Save_Offsets.Town_ID, SaveData.Is_Big_Endian); // Might not be UInt16 in all games
            }
            if (Offsets.Owning_Player_Name != -1 && Owner != null && Offsets.Town_Name != -1)
            {
                Data.Town_Name = SaveData.ReadString(SaveData.Save_Data_Start_Offset + MainForm.Current_Save_Info.Save_Offsets.Town_Name,
                                                     MainForm.Current_Save_Info.Save_Offsets.Town_NameSize);
            }
            if (Offsets.Owning_Player_Name != -1 && Owner != null)
            {
                Data.Owning_Player_Name = Owner.Data.Name;
            }
            if (Offsets.Owning_Player_ID != -1 && Owner != null)
            {
                Data.Owning_Player_ID = Owner.Data.Identifier;
            }

            Type HouseOffsetData = typeof(HouseOffsets);
            Type HouseDataType   = typeof(HouseData);

            foreach (var Field in HouseOffsetData.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                if (Field.GetValue(Offsets) != null && !Field.Name.Contains("Count") && !Field.Name.Contains("Size"))
                {
                    if (HouseDataType.GetField(Field.Name) != null)
                    {
                        if (Field.FieldType == typeof(int) && (int)Field.GetValue(Offsets) != -1)
                        {
                            Type FieldType  = HouseDataType.GetField(Field.Name).FieldType;
                            int  DataOffset = Offset + (int)Field.GetValue(Offsets);
                            //MessageBox.Show("Field Name: " + Field.Name + " | Data Offset: " + DataOffset.ToString("X"));
                            if (FieldType == typeof(string))
                            {
                                SaveData.Write(DataOffset, ACString.GetBytes((string)HouseDataType.GetField(Field.Name).GetValue(Data),
                                                                             (int)HouseOffsetData.GetField(Field.Name + "Size").GetValue(Offsets)));
                            }
                            else if (FieldType == typeof(byte))
                            {
                                SaveData.Write(DataOffset, (byte)HouseDataType.GetField(Field.Name).GetValue(Data));
                            }
                            else if (FieldType == typeof(byte[]))
                            {
                                SaveData.Write(DataOffset, (byte[])HouseDataType.GetField(Field.Name).GetValue(Data));
                            }
                            else if (FieldType == typeof(ushort))
                            {
                                SaveData.Write(DataOffset, (ushort)HouseDataType.GetField(Field.Name).GetValue(Data), SaveData.Is_Big_Endian);
                            }
                            else if (FieldType == typeof(Item))
                            {
                                if (SaveData.Save_Generation == SaveGeneration.N3DS)
                                {
                                    SaveData.Write(DataOffset, ItemData.EncodeItem((Item)HouseDataType.GetField(Field.Name).GetValue(Data)), SaveData.Is_Big_Endian);
                                }
                                else
                                {
                                    SaveData.Write(DataOffset, ((Item)HouseDataType.GetField(Field.Name).GetValue(Data)).ItemID, SaveData.Is_Big_Endian);
                                }
                            }
                        }
                    }
                }
            }

            foreach (Room r in Data.Rooms)
            {
                r.Write();
            }
        }
Example #4
0
        public Player(int offset, int idx, Save save)
        {
            _saveData = save;
            Index     = idx;
            Offset    = offset;
            Offsets   = PlayerInfo.GetPlayerInfo(save.SaveType);
            Exists    = _saveData.ReadByte(offset + Offsets.Identifier) != 0 && _saveData.ReadByte(offset + Offsets.Identifier) != 0xFF;
            if (!Exists)
            {
                return;
            }

            var    playerDataType     = typeof(PlayerData);
            var    playerSaveInfoType = typeof(PlayerSaveInfo);
            object boxedData          = new PlayerData();

            foreach (var field in playerSaveInfoType.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                if (field.GetValue(Offsets) != null && !field.Name.Contains("Count") && !field.Name.Contains("Size"))
                {
                    if (playerDataType.GetField(field.Name) != null)
                    {
                        if (field.FieldType != typeof(int) || (int)field.GetValue(Offsets) == -1)
                        {
                            continue;
                        }

                        var currentField = playerDataType.GetField(field.Name);
                        var fieldType    = currentField.FieldType;
                        var dataOffset   = Offset + (int)field.GetValue(Offsets);

                        switch (field.Name)
                        {
                        case "TownPassCardImage" when save.SaveGeneration == SaveGeneration.N3DS:
                            playerDataType.GetField("TownPassCardData").SetValue(boxedData, _saveData.ReadByteArray(dataOffset, 0x1400));
                            currentField.SetValue(boxedData,
                                                  ImageGeneration.GetTpcImage((byte[])playerDataType.GetField("TownPassCardData").GetValue(boxedData)));
                            break;

                        case "Reset" when save.SaveGeneration == SaveGeneration.GCN:
                            currentField.SetValue(boxedData, _saveData.ReadUInt32(dataOffset, _saveData.IsBigEndian) != 0);
                            break;

                        default:
                            if (fieldType == typeof(byte))
                            {
                                currentField.SetValue(boxedData, _saveData.ReadByte(dataOffset));
                            }
                            else if (fieldType == typeof(byte[]) && playerSaveInfoType.GetField(field.Name + "Count") != null)
                            {
                                currentField.SetValue(boxedData, _saveData.ReadByteArray(dataOffset,
                                                                                         (int)playerSaveInfoType.GetField(field.Name + "Count").GetValue(Offsets)));
                            }
                            else if (fieldType == typeof(ushort))
                            {
                                currentField.SetValue(boxedData, _saveData.ReadUInt16(dataOffset, _saveData.IsBigEndian));
                            }
                            else if (fieldType == typeof(ushort[]))
                            {
                                currentField.SetValue(boxedData, _saveData.ReadUInt16Array(dataOffset,
                                                                                           (int)playerSaveInfoType.GetField(field.Name + "Count").GetValue(Offsets), _saveData.IsBigEndian));
                            }
                            else if (fieldType == typeof(uint))
                            {
                                currentField.SetValue(boxedData, _saveData.ReadUInt32(dataOffset, _saveData.IsBigEndian));
                            }
                            else if (fieldType == typeof(string))
                            {
                                currentField.SetValue(boxedData, new AcString(_saveData.ReadByteArray(dataOffset,
                                                                                                      (int)playerSaveInfoType.GetField(field.Name + "Size").GetValue(Offsets)), _saveData.SaveType).Trim());
                            }
                            else if (fieldType == typeof(Inventory))
                            {
                                if (save.SaveGeneration == SaveGeneration.N3DS)
                                {
                                    currentField.SetValue(boxedData, new Inventory(_saveData.ReadUInt32Array(dataOffset,
                                                                                                             (int)playerSaveInfoType.GetField(field.Name + "Count").GetValue(Offsets), false)));
                                }
                                else
                                {
                                    currentField.SetValue(boxedData, new Inventory(_saveData.ReadUInt16Array(dataOffset,
                                                                                                             (int)playerSaveInfoType.GetField(field.Name + "Count").GetValue(Offsets), _saveData.IsBigEndian), save, this));
                                }
                            }
                            else if (fieldType == typeof(Item))
                            {
                                if (save.SaveGeneration == SaveGeneration.N3DS)
                                {
                                    currentField.SetValue(boxedData, new Item(_saveData.ReadUInt32(dataOffset, false)));
                                }
                                else
                                {
                                    currentField.SetValue(boxedData, new Item(_saveData.ReadUInt16(dataOffset, _saveData.IsBigEndian)));
                                }
                            }
                            else if (fieldType == typeof(Item[]))
                            {
                                if (field.Name.Equals("Dressers"))
                                {
                                    switch (_saveData.SaveGeneration)
                                    {
                                    case SaveGeneration.NDS:
                                        dataOffset = 0x15430 + 0xB4 * Index;         // Terrible hack
                                        break;

                                    case SaveGeneration.Wii:
                                        dataOffset = 0x1F3038 + 0x140 * Index;
                                        break;
                                    }
                                }

                                var itemArray = new Item[(int)playerSaveInfoType.GetField(field.Name + "Count").GetValue(Offsets)];
                                for (var i = 0; i < itemArray.Length; i++)
                                {
                                    if (save.SaveGeneration == SaveGeneration.N3DS)
                                    {
                                        itemArray[i] = new Item(_saveData.ReadUInt32(dataOffset + i * 4, false));
                                    }
                                    else
                                    {
                                        itemArray[i] = new Item(_saveData.ReadUInt16(dataOffset + i * 2, _saveData.IsBigEndian));
                                    }
                                }
                                currentField.SetValue(boxedData, itemArray);
                            }
                            else if (fieldType == typeof(NewLeafInt32))
                            {
                                var intData = _saveData.ReadUInt32Array(dataOffset, 2);
                                currentField.SetValue(boxedData, new NewLeafInt32(intData[0], intData[1]));
                            }
                            else if (fieldType == typeof(AcDate) && dataOffset > 0)
                            {
                                currentField.SetValue(boxedData, new AcDate(_saveData.ReadByteArray(dataOffset,
                                                                                                    (int)playerSaveInfoType.GetField(field.Name + "Size").GetValue(Offsets))));
                            }
                            break;
                        }
                    }
                }
            }
            Data = (PlayerData)boxedData;
            switch (save.SaveType)
            {
            case SaveType.WildWorld:
                var condensedData = Data.HairColor;
                Data.HairColor = (byte)(condensedData & 0x0F);
                Data.Tan       = (byte)((condensedData & 0xF0) >> 4); //Has to be 0 - 3
                condensedData  = Data.HairType;
                Data.FaceType  = (byte)(condensedData & 0x0F);
                Data.HairType  = (byte)((condensedData & 0xF0) >> 4);

                if (Data.Tan > 3)
                {
                    Data.Tan = 0;
                }
                if (Data.HairColor > 7)
                {
                    Data.HairColor = 0;
                }
                break;

            case SaveType.CityFolk:
                Data.Tan = (byte)(Data.Tan >> 1);     //Not 100% sure about this, but this is what ACToolkit does
                if (Data.Tan > 7)
                {
                    Data.Tan = 0;
                }
                if (Data.HairType > 0x19)
                {
                    Data.HairType = 0x19;
                }
                Data.FaceType = (byte)(Data.FaceType & 0x0F);
                Data.EyeColor = (byte)(Data.FaceType & 0xF0);     //Not actually eye color, just there to hold the upper nibble
                break;
            }
            if (Offsets.Patterns > -1)
            {
                Data.Patterns = new Pattern[Offsets.PatternCount];
                for (var i = 0; i < Data.Patterns.Length; i++)
                {
                    Data.Patterns[i] = new Pattern(offset + Offsets.Patterns + Offsets.PatternSize * i, i, save);
                }
            }

            if (_saveData.SaveType == SaveType.CityFolk)
            {
                Data.Reset = (_saveData.ReadByte(Offset + 0x8670) & 0x02) == 0x02;
            }
            else if (_saveData.SaveType == SaveType.NewLeaf)
            {
                Data.Reset = (_saveData.ReadByte(Offset + 0x5702) & 0x02) == 0x02;
            }
            else if (_saveData.SaveType == SaveType.WelcomeAmiibo)
            {
                Data.Reset = (_saveData.ReadByte(Offset + 0x570A) & 0x02) == 0x02;
            }

            // Get the Player's House
            House = HouseInfo.GetHouse(this, save.SaveType);
            if (House != null)
            {
                if (House.Data.Bed != null)
                {
                    Data.Bed = House.Data.Bed;
                }
            }

            Console.WriteLine($"Player {Index}'s house = {House}");

            // Mail Test
            if (_saveData.SaveGeneration != SaveGeneration.GCN)
            {
                return;
            }
            {
                for (var i = 0; i < 10; i++)
                {
                    var mail = new GcnPlayerMail(_saveData, this, i);
                    //System.Windows.Forms.MessageBox.Show(Mail.GetFormattedMailString());
                }
            }
        }
Example #5
0
        public House(int Index, int Offset)
        {
            this.Index  = Index;
            this.Offset = Offset;

            int  HouseSize = HouseInfo.GetHouseSize(Offset, MainForm.Save_File.Save_Type);
            bool Basement  = false;

            //Console.WriteLine("House Index: " + Index);
            //Console.WriteLine("House Offset: 0x" + Offset.ToString("X"));
            //Console.WriteLine("House Size: " + HouseSize.ToString());
            if (MainForm.Save_File.Save_Generation == SaveGeneration.N64 || MainForm.Save_File.Save_Generation == SaveGeneration.GCN)
            {
                Basement = HouseInfo.HasBasement(Offset, MainForm.Save_File.Save_Type);
                //Console.WriteLine("Basement: " + Basement.ToString());
            }

            // Load House Data
            var    Offsets            = HouseInfo.GetHouseOffsets(MainForm.Save_File.Save_Type);
            var    SaveData           = MainForm.Save_File;
            Type   PlayerDataType     = typeof(HouseData);
            Type   PlayerSaveInfoType = typeof(HouseOffsets);
            object BoxedData          = new HouseData();

            foreach (var Field in PlayerSaveInfoType.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                if (Field.GetValue(Offsets) != null && !Field.Name.Contains("Count") && !Field.Name.Contains("Size"))
                {
                    if (PlayerDataType.GetField(Field.Name) != null)
                    {
                        if (Field.FieldType == typeof(int) && (int)Field.GetValue(Offsets) != -1)
                        {
                            var  Current_Field = PlayerDataType.GetField(Field.Name);
                            Type FieldType     = Current_Field.FieldType;
                            int  DataOffset    = Offset + (int)Field.GetValue(Offsets);

                            if (!Field.Name.Equals("Room_Carpet") && !Field.Name.Equals("Room_Wallpaper") && !Field.Name.Equals("Room_Song"))
                            {
                                if (FieldType == typeof(byte))
                                {
                                    Current_Field.SetValue(BoxedData, SaveData.ReadByte(DataOffset));
                                }
                                else if (FieldType == typeof(byte[]) && PlayerSaveInfoType.GetField(Field.Name + "Count") != null)
                                {
                                    Current_Field.SetValue(BoxedData, SaveData.ReadByteArray(DataOffset,
                                                                                             (int)PlayerSaveInfoType.GetField(Field.Name + "Count").GetValue(Offsets)));
                                }
                                else if (FieldType == typeof(ushort))
                                {
                                    Current_Field.SetValue(BoxedData, SaveData.ReadUInt16(DataOffset, SaveData.Is_Big_Endian));
                                }
                                else if (FieldType == typeof(ushort[]))
                                {
                                    Current_Field.SetValue(BoxedData, SaveData.ReadUInt16Array(DataOffset,
                                                                                               (int)PlayerSaveInfoType.GetField(Field.Name + "Count").GetValue(Offsets), SaveData.Is_Big_Endian));
                                }
                                else if (FieldType == typeof(uint))
                                {
                                    Current_Field.SetValue(BoxedData, SaveData.ReadUInt32(DataOffset, SaveData.Is_Big_Endian));
                                }
                                else if (FieldType == typeof(string))
                                {
                                    Current_Field.SetValue(BoxedData, new ACString(SaveData.ReadByteArray(DataOffset,
                                                                                                          (int)PlayerSaveInfoType.GetField(Field.Name + "Size").GetValue(Offsets)), SaveData.Save_Type).Trim());
                                }
                                else if (FieldType == typeof(Item))
                                {
                                    if (SaveData.Save_Type == SaveType.New_Leaf || SaveData.Save_Type == SaveType.Welcome_Amiibo)
                                    {
                                        Current_Field.SetValue(BoxedData, new Item(SaveData.ReadUInt32(DataOffset, false)));
                                    }
                                    else
                                    {
                                        Current_Field.SetValue(BoxedData, new Item(SaveData.ReadUInt16(DataOffset, SaveData.Is_Big_Endian)));
                                    }
                                }
                                else if (FieldType == typeof(NL_Int32))
                                {
                                    uint[] Int_Data = SaveData.ReadUInt32Array(DataOffset, 2);
                                    Current_Field.SetValue(BoxedData, new NL_Int32(Int_Data[0], Int_Data[1]));
                                }
                                else if (FieldType == typeof(ACDate) && DataOffset > 0)
                                {
                                    Current_Field.SetValue(BoxedData, new ACDate(SaveData.ReadByteArray(DataOffset,
                                                                                                        (int)PlayerSaveInfoType.GetField(Field.Name + "Size").GetValue(Offsets))));
                                }
                            }
                        }
                    }
                }
            }
            Data = (HouseData)BoxedData;

            // Load Rooms/Layers
            int ItemDataSize  = MainForm.Save_File.Save_Generation == SaveGeneration.N3DS ? 4 : 2;
            int ItemsPerLayer = 256; //Offsets.Layer_Size / ItemDataSize;

            Data.Rooms = new Room[Offsets.Room_Count];
            var RoomNames = HouseInfo.GetRoomNames(SaveData.Save_Generation);

            for (int i = 0; i < Offsets.Room_Count; i++)
            {
                int RoomOffset = Offset + Offsets.Room_Start + i * Offsets.Room_Size;
                var Room       = new Room
                {
                    Index  = i,
                    Offset = RoomOffset,
                    Name   = RoomNames[i],
                    Layers = new Layer[Offsets.Layer_Count]
                };

                if (SaveData.Save_Generation == SaveGeneration.N64 || SaveData.Save_Generation == SaveGeneration.GCN)
                {
                    Room.Carpet    = new Item((ushort)(0x2600 | SaveData.ReadByte(RoomOffset + Offsets.Room_Carpet)));
                    Room.Wallpaper = new Item((ushort)(0x2700 | SaveData.ReadByte(RoomOffset + Offsets.Room_Wallpaper)));
                }
                else
                {
                    Room.Carpet    = new Item(SaveData.ReadUInt16(RoomOffset + Offsets.Room_Carpet, SaveData.Is_Big_Endian));
                    Room.Wallpaper = new Item(SaveData.ReadUInt16(RoomOffset + Offsets.Room_Wallpaper, SaveData.Is_Big_Endian));
                }

                for (int x = 0; x < Offsets.Layer_Count; x++)
                {
                    int LayerOffset = RoomOffset + Offsets.Layer_Size * x;
                    var Layer       = new Layer
                    {
                        Offset = LayerOffset,
                        Index  = x,
                        Items  = new Furniture[ItemsPerLayer],
                        Parent = Room
                    };

                    // Load furniture for the layer
                    for (int f = 0; f < ItemsPerLayer; f++)
                    {
                        int FurnitureOffset = LayerOffset + f * ItemDataSize;
                        if (ItemDataSize == 4)
                        {
                            Layer.Items[f] = new Furniture(SaveData.ReadUInt32(FurnitureOffset));
                        }
                        else
                        {
                            Layer.Items[f] = new Furniture(SaveData.ReadUInt16(FurnitureOffset, SaveData.Is_Big_Endian));
                        }
                    }

                    Room.Layers[x] = Layer;
                }
                Data.Rooms[i] = Room;
            }
        }