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; } } } }
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); }
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(); } } }
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; } } } } } } }
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); }
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)); }
public bool IsItemBuried(WorldAcre acre, Item item) => IsItemBuried(acre, item, Save.SaveInstance.SaveGeneration);
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); }