Esempio n. 1
0
        public static void Place_Structure(WorldAcre acre, int startIndex, List <ushort[]> structureInfo)
        {
            if (startIndex <= -1 || startIndex >= 256)
            {
                return;
            }
            if (MainForm.SaveFile.SaveGeneration != SaveGeneration.GCN)
            {
                return;
            }
            for (var y = 0; y < structureInfo.Count; y++)
            {
                for (var x = 0; x < structureInfo[y].Length; x++)
                {
                    var index = startIndex + y * 16 + x;
                    if (index >= 256)
                    {
                        continue;
                    }
                    switch (structureInfo[y][x])
                    {
                    case 0:     // Just for alignment
                        break;

                    case 1:
                        acre.AcreItems[index] = new WorldItem(0xFFFF, index);
                        break;

                    default:
                        acre.AcreItems[index] = new WorldItem(structureInfo[y][x], index);
                        break;
                    }
                }
            }
        }
Esempio n. 2
0
        public bool IsItemBuried(WorldAcre acre, Item item, SaveGeneration generation)
        {
            if (item == null || !acre.Items.Contains(item))
            {
                return(false);
            }

            var itemIdx = Array.IndexOf(acre.Items, item);

            if (itemIdx < 0 || itemIdx > 255)
            {
                return(false);
            }

            int offset;

            switch (generation)
            {
            case SaveGeneration.N64:
            case SaveGeneration.GCN:
            case SaveGeneration.iQue:
            case SaveGeneration.Wii:
                offset = Save.SaveInstance.SaveInfo.SaveOffsets.BuriedData + (acre.Index * 16 + itemIdx / 16) * 2;
                return(Save.SaveInstance.ReadUInt16(offset, true, true).GetBit(itemIdx % 16) == 1);

            case SaveGeneration.NDS:
                offset = Save.SaveInstance.SaveInfo.SaveOffsets.BuriedData + (acre.Index * 256 + itemIdx) / 8;
                return(Save.SaveInstance.ReadByte(offset, true).GetBit(itemIdx % 8) == 1);

            case SaveGeneration.N3DS:
                return((item.Flag1 & 0x80) == 0x80);
            }

            return(false);
        }
Esempio n. 3
0
        public static void DrawBuriedIcons(Bitmap map, WorldAcre acre, int itemSize)
        {
            using (var bitmapGraphics = Graphics.FromImage(map))
            {
                bitmapGraphics.SmoothingMode     = SmoothingMode.AntiAlias;
                bitmapGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                bitmapGraphics.PixelOffsetMode   = PixelOffsetMode.HighQuality;

                using (Image buriedIcon = Properties.Resources.Buried)
                {
                    for (var i = 0; i < acre.Items.Length; i++)
                    {
                        var item = acre.Items[i];
                        if (!acre.IsItemBuried(item, Save.SaveInstance.SaveGeneration))
                        {
                            continue;
                        }

                        bitmapGraphics.DrawImage(buriedIcon, (i % 16) * itemSize + 1,
                                                 (i / 16) * itemSize + 1, itemSize - 1, itemSize - 1);
                    }

                    bitmapGraphics.Flush();
                }
            }
        }
Esempio n. 4
0
        public static void Place_Structure(WorldAcre Acre, int Start_Index, List <ushort[]> Structure_Info)
        {
            if (Start_Index > -1 && Start_Index < 256)
            {
                if (MainForm.Save_File.Save_Generation == SaveGeneration.GCN)
                {
                    for (int y = 0; y < Structure_Info.Count; y++)
                    {
                        for (int x = 0; x < Structure_Info[y].Length; x++)
                        {
                            int Index = Start_Index + y * 16 + x;
                            if (Index < 256)
                            {
                                switch (Structure_Info[y][x])
                                {
                                case 0:     // Just for alignment
                                    break;

                                case 1:
                                    Acre.Acre_Items[Index] = new WorldItem(0xFFFF, Index);
                                    break;

                                default:
                                    Acre.Acre_Items[Index] = new WorldItem(Structure_Info[y][x], Index);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
Esempio n. 5
0
        public Island(int offset, IEnumerable <Player> players, Save saveFile)
        {
            _saveFile = saveFile;
            _offset   = offset;

            Name = new Utilities.AcString(saveFile.ReadByteArray(offset + IslandName, 6), saveFile.SaveType).Trim();
            Id   = saveFile.ReadUInt16(offset + IslandId, true);

            TownName = new Utilities.AcString(saveFile.ReadByteArray(offset + TownNameOffset, 6), saveFile.SaveType).Trim();
            TownId   = saveFile.ReadUInt16(offset + TownIdOffset, true);

            var identifier = saveFile.ReadUInt16(offset - 0x2214, true);

            foreach (var player in players)
            {
                if (player != null && player.Data.Identifier == identifier)
                {
                    Owner = player;
                }
            }

            BuriedDataArray = saveFile.ReadByteArray(offset + BuriedData, 0x40);

            Acres = new WorldAcre[2];
            for (var acre = 0; acre < 2; acre++)
            {
                Acres[acre] = new WorldAcre(0, acre,
                                            saveFile.ReadUInt16Array(offset + WorldData + acre * 0x200, 0x100, true), null, acre, true);
            }

            Cabana = new House(-1, offset + CottageData, 1, 0);
            Cabana.Data.Rooms[0].Name = "Cabana";

            FlagPattern = new Pattern(offset + FlagData, 0, saveFile);
            Islander    = new Villager(offset + IslanderData, 0, saveFile);
            Purchased   = IsPurchased();

            IslandLeftAcreIndex  = saveFile.ReadByte(offset + IslandLeftAcreData);
            IslandRightAcreIndex = saveFile.ReadByte(offset + IslandRightAcreData);
        }
Esempio n. 6
0
        public bool SetItemBuried(WorldAcre acre, Item item, bool buried, SaveGeneration generation)
        {
            if (item == null || !acre.Items.Contains(item))
            {
                return(false);
            }

            var itemIdx = Array.IndexOf(acre.Items, item);

            if (itemIdx < 0 || itemIdx > 255)
            {
                return(false);
            }

            int offset;

            switch (generation)
            {
            case SaveGeneration.N64:
            case SaveGeneration.GCN:
            case SaveGeneration.iQue:
            case SaveGeneration.Wii:
                offset = Save.SaveInstance.SaveInfo.SaveOffsets.BuriedData + (acre.Index * 16 + itemIdx / 16) * 2;
                Save.SaveInstance.Write(offset,
                                        Save.SaveInstance.ReadUInt16(offset, true, true).SetBit(itemIdx % 16, buried), true, true);
                break;

            case SaveGeneration.NDS:
                offset = Save.SaveInstance.SaveInfo.SaveOffsets.BuriedData + (acre.Index * 256 + itemIdx) / 8;
                Save.SaveInstance.Write(offset,
                                        Save.SaveInstance.ReadByte(offset, true).SetBit(itemIdx % 8, buried), true);
                break;

            case SaveGeneration.N3DS:
                item.Flag1 &= 0x7F;
                break;
            }

            return(IsItemBuried(acre, item, generation));
        }
Esempio n. 7
0
 public bool IsItemBuried(WorldAcre acre, Item item) =>
 IsItemBuried(acre, item, Save.SaveInstance.SaveGeneration);
Esempio n. 8
0
        public static bool[] Check_Perfect_Town_Requirements(WorldAcre[] Acres, bool Make_Perfect = false)
        {
            bool[] Acre_Results = new bool[Acres.Length];
            int    Points       = 0;

            for (int i = 0; i < Acre_Results.Length; i++)
            {
                WorldAcre Acre = Acres[i];
                switch (MainForm.Save_File.Save_Generation)
                {
                case SaveGeneration.N64:
                case SaveGeneration.GCN:
                    //TODO: Implement Special Acre Check (Player Houses, Train Station, Oceanfront Acres, Lake Acres, Wishing Well, & Museum
                    //Special Acre Info: < 9 Trees, 0 Points | 9 - 11, 1 Point | 12 - 14, 2 Points | 15 - 17, 1 Point | > 18, 0 Points
                    int Tree_Count = 0;
                    int Weed_Count = 0;
                    for (int o = 0; o < 256; o++)
                    {
                        WorldItem Item = Acre.Acre_Items[o];
                        if (Item.Name == "Weed")
                        {
                            Weed_Count++;
                            if (Make_Perfect)
                            {
                                Acre.Acre_Items[o] = new WorldItem(0, o);
                            }
                        }
                        else if (ItemData.GetItemType(Item.ItemID, MainForm.Save_File.Save_Type) == "Tree")
                        {
                            Tree_Count++;
                        }
                    }
                    if (Make_Perfect)
                    {
                        if (Tree_Count > 14)
                        {
                            for (int o = 0; o < Tree_Count - 13; o++)
                            {
                                for (int x = 0; x < 256; x++)
                                {
                                    if (ItemData.GetItemType(Acre.Acre_Items[x].ItemID, MainForm.Save_File.Save_Type) == "Tree")
                                    {
                                        Acre.Acre_Items[x] = new WorldItem(0, x);
                                        break;
                                    }
                                }
                            }
                        }
                        else if (Tree_Count < 12)
                        {
                            for (int o = 0; o < 13 - Tree_Count; o++)
                            {
                                for (int x = 0; x < 256; x++)
                                {
                                    // Check to make sure the item directly above, below, and to the left and right isn't already occupied.
                                    if (Acre.Acre_Items[x].ItemID == 0 && (x < 16 || Acre.Acre_Items[x - 16].ItemID == 0) && (x > 239 || Acre.Acre_Items[x + 16].ItemID == 0) &&
                                        (x == 0 || Acre.Acre_Items[x - 1].ItemID == 0) && (x == 255 || Acre.Acre_Items[x + 1].ItemID == 0))
                                    {
                                        Acre.Acre_Items[x] = new WorldItem(0x0804, x);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    Acre_Results[i] = Make_Perfect || ((Tree_Count > 11 && Tree_Count < 15) && Weed_Count < 4);
                    if (Acre_Results[i])
                    {
                        Points++;
                    }
                    break;

                case SaveGeneration.NDS:
                case SaveGeneration.Wii:
                case SaveGeneration.N3DS:
                    throw new NotImplementedException();
                }
            }
            return(Acre_Results);
        }