public static Bitmap GetHairImage(SaveGeneration Save_Generation, int Index, int ColorIndex) { Bitmap HairImage = null; string HairFolder = MainForm.Assembly_Location + "\\Resources\\Images\\Hair Styles"; if (Directory.Exists(HairFolder)) { // TODO: Wild World, City Folk if (Save_Generation == SaveGeneration.N3DS) { HairFolder += "\\New Leaf"; } if (Directory.Exists(HairFolder)) { string HairImageFile = HairFolder + "\\" + Index + ".png"; if (File.Exists(HairImageFile)) { try { HairImage = (Bitmap)Image.FromFile(HairImageFile); ReplaceGrayscaleColor(ref HairImage, Color.FromArgb((int)PlayerInfo.NL_Hair_Color_Values[ColorIndex])); } catch { MainForm.Debug_Manager.WriteLine(string.Format("Could not open hair file: {0}", HairImageFile), DebugLevel.Error); } } } } return(HairImage); }
public bool IsItemBuried(Item item, SaveGeneration generation) { if (item == null || !Items.Contains(item)) { return(false); } var itemIdx = Array.IndexOf(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 + (TownIndex * 16 + itemIdx / 16) * 2; return(Save.SaveInstance.ReadUInt16(offset, true, true).GetBit(itemIdx % 16) == 1); case SaveGeneration.NDS: offset = Save.SaveInstance.SaveInfo.SaveOffsets.BuriedData + (Index * 256 + itemIdx) / 8; return(Save.SaveInstance.ReadByte(offset, true).GetBit(itemIdx % 8) == 1); case SaveGeneration.N3DS: return((item.Flag1 & 0x80) == 0x80); } return(false); }
/// <summary> /// Gets an <see cref="Image"/> icon of the current Town Gate. /// </summary> /// <param name="saveGeneration">The <see cref="SaveGeneration"/> of the current <see cref="Save"/>.</param> /// <param name="gateType">The gate type whose image will be retrieved.</param> /// <returns><see cref="Image"/> TownGateIcon OR null if the image does not exist or cannot be accessed.</returns> public static Image GetTownGateImage(SaveGeneration saveGeneration, int gateType) { string path; switch (saveGeneration) { case SaveGeneration.NDS: path = Path.Combine(PathUtility.GetIconsDirectory(), "Wild World", $"{(uint)gateType}.png"); break; case SaveGeneration.Wii: path = Path.Combine(PathUtility.GetIconsDirectory(), "City Folk", $"{(uint) gateType}.png"); break; default: return(null); } if (!File.Exists(path)) { return(null); } try { return(Image.FromFile(path)); } catch { return(null); } }
public static void ExportTown(WorldAcre[] Acres, SaveGeneration Save_Generation, string SaveFileName) { using (var saveDialog = new System.Windows.Forms.SaveFileDialog()) { saveDialog.Filter = "ACSE Town Save (*.ats)|*.ats"; saveDialog.FileName = SaveFileName + " Town Data.ats"; if (saveDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { try { using (var Stream = new FileStream(saveDialog.FileName, FileMode.Create)) { using (var Writer = new BinaryWriter(Stream)) { Writer.Write(new byte[] { 0x41, 0x54, 0x53 }); // "ATS" Identifier Writer.Write((byte)Acres.Length); // Total Acre Count Writer.Write((byte)Save_Generation); // Save Generation Writer.Write(new byte[3] { 0, 0, 0 }); // Padding if (Save_Generation == SaveGeneration.N3DS) { for (int i = 0; i < Acres.Length; i++) { for (int x = 0; x < Acres[i].Acre_Items.Length; x++) { Writer.Write(BitConverter.GetBytes(Acres[i].Acre_Items[x].ToUInt32())); } } } else { for (int i = 0; i < Acres.Length; i++) { for (int x = 0; x < Acres[i].Acre_Items.Length; x++) { Writer.Write(BitConverter.GetBytes(Acres[i].Acre_Items[x].ItemID)); } } } Writer.Flush(); } } } catch { System.Windows.Forms.MessageBox.Show("Town exportation failed!", "Town Export Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); } } } }
public static void ImportTown(ref WorldAcre[] acres, SaveGeneration saveGeneration) { using (var openDialog = new System.Windows.Forms.OpenFileDialog()) { openDialog.Filter = "ACSE Town Save (*.ats)|*.ats"; openDialog.FileName = ""; if (openDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } try { using (var stream = new FileStream(openDialog.FileName, FileMode.Open)) { using (var reader = new BinaryReader(stream)) { if (!System.Text.Encoding.ASCII.GetString(reader.ReadBytes(3)).Equals("ATS") || reader.ReadByte() != acres.Length || (SaveGeneration)reader.ReadByte() != saveGeneration) { return; } reader.BaseStream.Seek(8, SeekOrigin.Begin); if (saveGeneration == SaveGeneration.N3DS) { foreach (var acre in acres) { for (var x = 0; x < acre.AcreItems.Length; x++) { acre.AcreItems[x] = new WorldItem(reader.ReadUInt32(), acre.AcreItems[x].Index); } } } else { foreach (var acre in acres) { for (var x = 0; x < acre.AcreItems.Length; x++) { acre.AcreItems[x] = new WorldItem(reader.ReadUInt16(), acre.AcreItems[x].Index); } } } } } } catch { System.Windows.Forms.MessageBox.Show("Acre importation failed!", "Acre Import Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); } } }
public static IGenerator GetGenerator(SaveGeneration generation) { switch (generation) { case SaveGeneration.GCN: return(new GCNGenerator()); default: return(null); } }
public Save(string File_Path) { if (File.Exists(File_Path)) { if (Save_File != null) { Save_Reader.Close(); Save_File.Close(); } bool Failed_to_Load = false; try { Save_File = new FileStream(File_Path, FileMode.Open); } catch { Failed_to_Load = true; } if (Save_File == null || Failed_to_Load || !Save_File.CanWrite) { MessageBox.Show(string.Format("Error: File {0} is being used by another process. Please close any process using it before editing!", Path.GetFileName(File_Path)), "File Opening Error"); try { Save_File.Close(); } catch { }; return; } Save_Reader = new BinaryReader(Save_File); Original_Save_Data = Save_Reader.ReadBytes((int)Save_File.Length); Working_Save_Data = new byte[Original_Save_Data.Length]; Buffer.BlockCopy(Original_Save_Data, 0, Working_Save_Data, 0, Original_Save_Data.Length); Save_Type = SaveDataManager.GetSaveType(Original_Save_Data); Game_System = SaveDataManager.GetGameSystem(Save_Type); Full_Save_Path = File_Path; Save_Name = Path.GetFileNameWithoutExtension(File_Path); Save_Path = Path.GetDirectoryName(File_Path) + Path.DirectorySeparatorChar; Save_Extension = Path.GetExtension(File_Path); Save_ID = SaveDataManager.GetGameID(Save_Type); Save_Data_Start_Offset = SaveDataManager.GetSaveDataOffset(Save_ID.ToLower(), Save_Extension.Replace(".", "").ToLower()); Save_Info = SaveDataManager.GetSaveInfo(Save_Type); if (Save_Type == SaveType.Doubutsu_no_Mori) { Original_Save_Data = SaveDataManager.ByteSwap(Original_Save_Data); Working_Save_Data = SaveDataManager.ByteSwap(Working_Save_Data); } if (Save_Type == SaveType.Wild_World || Save_Type == SaveType.New_Leaf || Save_Type == SaveType.Welcome_Amiibo) { Is_Big_Endian = false; } Save_Reader.Close(); Save_File.Close(); } else { MessageBox.Show("File doesn't exist!"); } }
private static byte[] GetEmotionSet(SaveGeneration generation) { switch (generation) { case SaveGeneration.N3DS: return(NewLeafEmotions); default: return(null); } }
public static void ExportTown(WorldAcre[] acres, SaveGeneration saveGeneration, string saveFileName) { using (var saveDialog = new System.Windows.Forms.SaveFileDialog()) { saveDialog.Filter = "ACSE Town Save (*.ats)|*.ats"; saveDialog.FileName = saveFileName + " Town Data.ats"; if (saveDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } try { using (var stream = new FileStream(saveDialog.FileName, FileMode.Create)) { using (var writer = new BinaryWriter(stream)) { writer.Write(new byte[] { 0x41, 0x54, 0x53 }); // "ATS" Identifier writer.Write((byte)acres.Length); // Total Acre Count writer.Write((byte)saveGeneration); // Save Generation writer.Write(new byte[] { 0, 0, 0 }); // Padding if (saveGeneration == SaveGeneration.N3DS) { foreach (var acre in acres) { foreach (var item in acre.AcreItems) { writer.Write(BitConverter.GetBytes(item.ToUInt32())); } } } else { foreach (var acre in acres) { foreach (var item in acre.AcreItems) { writer.Write(BitConverter.GetBytes(item.ItemId)); } } } writer.Flush(); } } } catch { System.Windows.Forms.MessageBox.Show("Town exportation failed!", "Town Export Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); } } }
public static byte ToWeatherByte(byte index, SaveGeneration generation) { switch (generation) { case SaveGeneration.N64: case SaveGeneration.GCN: return((byte)((MainForm.SaveFile.ReadByte(MainForm.SaveFile.SaveDataStartOffset + MainForm.SaveFile.SaveInfo.SaveOffsets.Weather) & 0x0F) | (index << 4))); default: return(index); } }
public static byte ToWeatherByte(byte Index, SaveGeneration Generation) { switch (Generation) { case SaveGeneration.N64: case SaveGeneration.GCN: return((byte)((MainForm.Save_File.ReadByte(MainForm.Save_File.Save_Data_Start_Offset + MainForm.Save_File.Save_Info.Save_Offsets.Weather) & 0x0F) | (Index << 4))); default: return(Index); } }
public static string[] GetWeatherTypesForGame(SaveGeneration Generation) { switch (Generation) { case SaveGeneration.N64: case SaveGeneration.GCN: return(AC_Weather); default: return(new string[0]); } }
public static byte GetWeatherIndex(byte Weather, SaveGeneration Generation) { switch (Generation) { case SaveGeneration.N64: case SaveGeneration.GCN: return((byte)(Weather >> 4)); default: return(Weather); } }
public static void ImportTown(ref WorldAcre[] Acres, SaveGeneration Save_Generation) { using (var openDialog = new System.Windows.Forms.OpenFileDialog()) { openDialog.Filter = "ACSE Town Save (*.ats)|*.ats"; openDialog.FileName = ""; if (openDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { try { using (var Stream = new FileStream(openDialog.FileName, FileMode.Open)) { using (var Reader = new BinaryReader(Stream)) { if (System.Text.Encoding.ASCII.GetString(Reader.ReadBytes(3)).Equals("ATS") && Reader.ReadByte() == Acres.Length && (SaveGeneration)Reader.ReadByte() == Save_Generation) { Reader.BaseStream.Seek(8, SeekOrigin.Begin); if (Save_Generation == SaveGeneration.N3DS) { for (int i = 0; i < Acres.Length; i++) { for (int x = 0; x < Acres[i].Acre_Items.Length; x++) { Acres[i].Acre_Items[x] = new WorldItem(Reader.ReadUInt32(), Acres[i].Acre_Items[x].Index); } } } else { for (int i = 0; i < Acres.Length; i++) { for (int x = 0; x < Acres[i].Acre_Items.Length; x++) { Acres[i].Acre_Items[x] = new WorldItem(Reader.ReadUInt16(), Acres[i].Acre_Items[x].Index); } } } } } } } catch { System.Windows.Forms.MessageBox.Show("Acre importation failed!", "Acre Import Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); } } } }
/// <summary> /// Gets an array of the Town Gate descriptions for a <see cref="SaveGeneration"/>. /// </summary> /// <param name="saveGeneration">The <see cref="SaveGeneration"/> of the current <see cref="Save"/>.</param> /// <returns>An array containing the descriptions of the Town Gate types OR null if there are none.</returns> public static string[] GetTownGateTypeNames(SaveGeneration saveGeneration) { switch (saveGeneration) { case SaveGeneration.NDS: return(WildWorldGateNames); case SaveGeneration.Wii: return(CityFolkGateNames); default: return(null); } }
public uint[][] GetPaletteArray(SaveGeneration saveGeneration) { switch (saveGeneration) { default: return(PatternData.AcPaletteData); case SaveGeneration.NDS: return(PatternData.WwPaletteData); case SaveGeneration.Wii: return(PatternData.CfPaletteData); } }
public uint[][] GetPaletteArray(SaveGeneration Save_Generation) { switch (Save_Generation) { case SaveGeneration.GCN: default: return(PatternData.AC_Palette_Data); case SaveGeneration.NDS: return(PatternData.WW_Palette_Data); case SaveGeneration.Wii: return(PatternData.CF_Palette_Data); } }
public static string[] GetHouseSizes(SaveGeneration generation) { switch (generation) { case SaveGeneration.N64: case SaveGeneration.iQue: return(DnMHouseSizes); case SaveGeneration.GCN: return(AcHouseSizes); default: return(new string[0]); } }
public static Image GetFaceImage(SaveGeneration saveGeneration, int index, byte gender) { Image faceImage = null; var facesFolder = MainForm.AssemblyLocation + "\\Resources\\Images\\Faces"; if (!Directory.Exists(facesFolder)) { return(null); } switch (saveGeneration) { case SaveGeneration.N64: case SaveGeneration.GCN: case SaveGeneration.iQue: facesFolder += "\\Animal Crossing"; break; case SaveGeneration.NDS: case SaveGeneration.Wii: facesFolder += "\\Wild World"; break; case SaveGeneration.N3DS: facesFolder += "\\New Leaf\\" + (gender == 1 ? "Female" : "Male"); break; } if (!Directory.Exists(facesFolder)) { return(null); } var faceImageFile = facesFolder + "\\" + index + ".bmp"; if (!File.Exists(faceImageFile)) { return(null); } try { faceImage = Image.FromFile(faceImageFile); } catch { MainForm.DebugManager.WriteLine($"Could not open face file: {faceImageFile}", DebugLevel.Error); } return(faceImage); }
public static string GetShopName(SaveGeneration generation, byte shopSize) { if (generation == SaveGeneration.N3DS) { if (shopSize > 4) { shopSize = 4; } return(NewLeafNookShopNames[shopSize]); } if (shopSize > 3) { shopSize = 3; } return(NookShopNames[shopSize]); }
public bool SetItemBuried(Item item, bool buried, SaveGeneration generation) { if (item == null || !Items.Contains(item)) { return(false); } var itemIdx = Array.IndexOf(Items, item); if (itemIdx < 0 || itemIdx > 255) { return(false); } if (item.Type == ItemType.Empty) { buried = false; // Don't allow "empty" spots to be buried no matter what. } int offset; switch (generation) { case SaveGeneration.N64: case SaveGeneration.GCN: case SaveGeneration.iQue: case SaveGeneration.Wii: offset = Save.SaveInstance.SaveInfo.SaveOffsets.BuriedData + (TownIndex * 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 + (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(item, generation)); }
public static string GetShopName(SaveGeneration Generation, byte ShopSize) { if (Generation == SaveGeneration.N3DS) { if (ShopSize > 4) { ShopSize = 4; } return(NewLeaf_NookShopNames[ShopSize]); } else { if (ShopSize > 3) { ShopSize = 3; } return(NookShopNames[ShopSize]); } }
public static string[] GetRoomNames(SaveGeneration Generation) { switch (Generation) { case SaveGeneration.N64: return(DnM_House_Names); case SaveGeneration.GCN: case SaveGeneration.Wii: return(AC_Room_Names); case SaveGeneration.NDS: default: return(WW_Room_Names); case SaveGeneration.N3DS: return(NL_Room_Names); } }
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 static string[] GetNativeFruitTypes(SaveGeneration saveGeneration) { switch (saveGeneration) { case SaveGeneration.N64: case SaveGeneration.GCN: case SaveGeneration.iQue: return(Gen1Fruits); case SaveGeneration.NDS: return(WildWorldFruits); case SaveGeneration.Wii: return(CityFolkFruits); case SaveGeneration.N3DS: return(NewLeafFruits); default: return(null); } }
public byte GetSize(SaveGeneration generation) { var saveFile = Save.SaveInstance; var shopOffsets = ShopInfo.GetShopOffsets(saveFile.SaveType); if (shopOffsets == null) { return(0); } switch (generation) { case SaveGeneration.N64: case SaveGeneration.GCN: return((byte)((saveFile.ReadByte(saveFile.SaveDataStartOffset + shopOffsets.FurnitureShopUpgrade) >> 6) & 3)); case SaveGeneration.N3DS: return(saveFile.ReadByte(saveFile.SaveDataStartOffset + shopOffsets.FurnitureShopUpgrade)); default: return(0); } }
public static string[] GetRoomNames(SaveGeneration generation) { switch (generation) { case SaveGeneration.N64: case SaveGeneration.iQue: return(DnMHouseNames); case SaveGeneration.GCN: case SaveGeneration.Wii: return(AcRoomNames); case SaveGeneration.NDS: return(WwRoomNames); case SaveGeneration.N3DS: return(NlRoomNames); default: return(new string[0]); } }
public byte GetSize(SaveGeneration Generation) { var SaveFile = MainForm.Save_File; var ShopOffsets = ShopInfo.GetShopOffsets(SaveFile.Save_Type); if (ShopOffsets != null) { switch (Generation) { case SaveGeneration.N64: case SaveGeneration.GCN: return((byte)(SaveFile.ReadByte(SaveFile.Save_Data_Start_Offset + ShopOffsets.FurnitureShopUpgrade) >> 6)); case SaveGeneration.N3DS: return(SaveFile.ReadByte(SaveFile.Save_Data_Start_Offset + ShopOffsets.FurnitureShopUpgrade)); default: return(0); } } return(0); }
public static void ImportAcres(ref WorldAcre[] acres, SaveGeneration saveGeneration) { using (var openDialog = new System.Windows.Forms.OpenFileDialog()) { openDialog.Filter = "ACSE Acre Save (*.aas)|*.aas"; openDialog.FileName = ""; if (openDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } try { using (var stream = new FileStream(openDialog.FileName, FileMode.Open)) { using (var reader = new BinaryReader(stream)) { if (!System.Text.Encoding.ASCII.GetString(reader.ReadBytes(3)).Equals("AAS") || reader.ReadByte() != acres.Length || (SaveGeneration)reader.ReadByte() != saveGeneration) { return; } reader.BaseStream.Seek(8, SeekOrigin.Begin); foreach (var t in acres) { t.AcreId = reader.ReadUInt16(); t.BaseAcreId = (ushort)(t.AcreId & 0xFFFC); } } } } catch { System.Windows.Forms.MessageBox.Show("Acre importation failed!", "Acre Import Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); } } }
public static Image GetFaceImage(SaveGeneration Save_Generation, int Index, byte Gender) { Image FaceImage = null; string FacesFolder = MainForm.Assembly_Location + "\\Resources\\Images\\Faces"; if (Directory.Exists(FacesFolder)) { if (Save_Generation == SaveGeneration.N64 || Save_Generation == SaveGeneration.GCN) { FacesFolder += "\\Animal Crossing"; } else if (Save_Generation == SaveGeneration.NDS || Save_Generation == SaveGeneration.Wii) { FacesFolder += "\\Wild World"; } else if (Save_Generation == SaveGeneration.N3DS) { FacesFolder += "\\New Leaf\\" + (Gender == 1 ? "Female" : "Male"); } if (Directory.Exists(FacesFolder)) { string FaceImageFile = FacesFolder + "\\" + Index + ".bmp"; if (File.Exists(FaceImageFile)) { try { FaceImage = Image.FromFile(FaceImageFile); } catch { MainForm.Debug_Manager.WriteLine(string.Format("Could not open face file: {0}", FaceImageFile), DebugLevel.Error); } } } } return(FaceImage); }