using System; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace PKHeX { public partial class SAV_Trainer : Form { private readonly SAV6 SAV = new SAV6(Main.SAV.Data); public SAV_Trainer() { InitializeComponent(); if (!Main.unicode) try { TB_OTName.Font = PKX.getPKXFont(11); } catch (Exception e) { Util.Alert("Font loading failed...", e.ToString()); } Util.TranslateInterface(this, Main.curlanguage); MaisonRecords = new[] { TB_MCSN,TB_MCSS,TB_MBSN,TB_MBSS, TB_MCDN,TB_MCDS,TB_MBDN,TB_MBDS, TB_MCTN,TB_MCTS,TB_MBTN,TB_MBTS, TB_MCRN,TB_MCRS,TB_MBRN,TB_MBRS, TB_MCMN,TB_MCMS,TB_MBMN,TB_MBMS, }; cba = new[] { CHK_Badge1, CHK_Badge2, CHK_Badge3, CHK_Badge4, CHK_Badge5, CHK_Badge6, CHK_Badge7, CHK_Badge8, }; pba = new [] { PB_Badge1, PB_Badge2, PB_Badge3, PB_Badge4, PB_Badge5, PB_Badge6, PB_Badge7, PB_Badge8, }; L_MultiplayerSprite.Enabled = CB_MultiplayerSprite.Enabled = Main.SAV.ORAS; L_Style.Visible = TB_Style.Visible = SAV.XY; if (!SAV.XY) TC_Editor.TabPages.Remove(Tab_Appearance); if (SAV.ORASDEMO) { TC_Editor.TabPages.Remove(Tab_Maison); TC_Editor.TabPages.Remove(Tab_Multiplayer); } editing = true; getComboBoxes(); getTextBoxes(); getBadges(); statdata = new[] { "0x000", "0x000", // Steps taken? "0x004", "0x004", // Minutes Played / Pokemon Encountered? "0x008", "0x008", "0x00C", "0x00C", "0x010", "0x010", "0x014", "0x014", "0x018", "0x018", "0x01C", "Pokémon Captured", "0x020", "0x020", "0x024", "Eggs Hatched", "0x028", "Pokémon Evolved", "0x02C", "0x02C", "0x030", "~People Passed", // I think the following ones are Passerby actions... "0x034", "0x034", "0x038", "0x038", "0x03C", "0x03C", "0x040", "Link Trades", "0x044", "Link Battles", "0x048", "Link Battle Wins", "0x04C", "0x04C", "0x050", "0x050", "0x054", "0x054", "0x058", "0x058", "0x05C", "0x05C", "0x060", "0x060", "0x064", "0x064", "0x068", "0x068", "0x06C", "0x06C", "0x070", "0x070", "0x074", "0x074", "0x078", "0x078", "0x07C", "0x07C", "0x080", "0x080", "0x084", "0x084", "0x088", "BP Earned", "0x08C", "0x08C", "0x090", "0x090", "0x094", "0x094", "0x098", "0x098", "0x09C", "0x09C", "0x0A0", "0x0A0", "0x0A4", "0x0A4", "0x0A8", "0x0A8", "0x0AC", "0x0AC", "0x0B0", "0x0B0", "0x0B4", "0x0B4", "0x0B8", "0x0B8", "0x0BC", "0x0BC", "0x0C0", "0x0C0", "0x0C4", "0x0C4", "0x0C8", "0x0C8", "0x0CC", "0x0CC", "0x0D0", "0x0D0", "0x0D4", "0x0D4", "0x0D8", "0x0D8", "0x0DC", "0x0DC", "0x0E0", "0x0E0", "0x0E4", "0x0E4", "0x0E8", "0x0E8", "0x0EC", "Nice! Received", "0x0F0", "Birthday Wishes", "0x0F4", "Total People Met Online", "0x0F8", "0x0F8", //"0x0FC", "Current Pokemiles", "0x100", "Obtained Pokemiles", "0x104", "0x104", "0x108", "0x108", "0x10C", "Super Training Clears", "0x110", "Judge Evaluations", "0x114", "0x114", "0x118", "0x118", // Link Trades? "0x11C", "Link Battle", // Wins", // ? "0x120", "0x120", // Link Battle Losses? "0x124", "0x124", "0x128", "0x128", "0x12C", "0x12C", "0x130", "0x130", "0x134", "0x134", "0x138", "0x138", "0x13C", "0x13C", "0x140", "Flags Captured", "0x144", "0x144", "0x148", "0x148", "0x14C", "0x14C", "0x150", "0x150", "0x154", "0x154", "0x158", "0x158", "0x15C", "0x15C", "0x160", "0x160", "0x164", "0x164", "0x168", "0x168", "0x16C", "0x16C", "0x170", "0x170", "0x174", "0x174", "0x178", "0x178", "0x17C", "0x17C", "0x180", "0x180", "0x184", "0x184", "0x188", "0x188", "0x18C", "0x18C", "0x190", "0x190", "0x194", "0x194", "0x198", "0x198", "0x19C", "0x19C", "0x1A0", "0x1A0", "0x1A4", "0x1A4", "0x1A8", "0x1A8", "0x1AC", "0x1AC", "0x1B0", "0x1B0", "0x1B4", "0x1B4", "0x1B8", "0x1B8", "0x1BC", "Battle Tests", "0x1C0", "0x1C0", "0x1C4", "0x1C4", "0x1C8", "0x1C8", "0x1CC", "0x1CC", "0x1D0", "0x1D0", "0x1D4", "0x1D4", "0x1D8", "0x1D8", "0x1DC", "0x1DC", "0x1E0", "0x1E0", "0x1E4", "0x1E4", "0x1E8", "0x1E8", "0x1EC", "0x1EC", "0x1F0", "0x1F0", "0x1F4", "0x1F4", "0x1F8", "0x1F8", "0x1FC", "0x1FC", "0x200", "0x200", "0x204", "0x204", "0x208", "0x208", "0x20C", "0x20C", "0x210", "0x210", "0x214", "0x214", "0x218", "0x218", "0x21C", "0x21C", "0x220", "0x220", "0x224", "0x224", "0x228", "0x228", "0x22C", "0x22C", "0x230", "0x230", "0x234", "0x234", "0x238", "0x238", "0x23C", "0x23C", "0x240", "0x240", "0x244", "0x244", "0x248", "0x248", "0x24C", "0x24C", "0x250", "0x250", "0x254", "0x254", "0x258", "0x258", }; // Offset, Title. Horrible implementation, but works. CB_Stats.Items.Clear(); for (int i = 0; i < statdata.Length / 2; i++) CB_Stats.Items.Add(statdata[2 * i + 1]); CB_Stats.SelectedIndex = 0; } private readonly string[] statdata; private bool editing; private readonly ToolTip Tip1 = new ToolTip(), Tip2 = new ToolTip(); private readonly MaskedTextBox[] MaisonRecords; private readonly CheckBox[] cba; private readonly PictureBox[] pba; private void getComboBoxes() { var dsregion_list = new[] { new { Text = "NA/SA", Value = 1 }, new { Text = "EUR", Value = 2 }, new { Text = "JPN", Value = 0 }, new { Text = "CN", Value = 4 }, new { Text = "KOR", Value = 5 }, new { Text = "TW", Value = 6 } }; var language_list = new[] { new { Text = "ENG", Value = 2 }, new { Text = "JPN", Value = 1 }, new { Text = "FRE", Value = 3 }, new { Text = "ITA", Value = 4 }, new { Text = "GER", Value = 5 }, new { Text = "SPA", Value = 7 }, new { Text = "KOR", Value = 8 } }; CB_3DSReg.DisplayMember = "Text"; CB_3DSReg.ValueMember = "Value"; CB_3DSReg.DataSource = dsregion_list; CB_Language.DisplayMember = "Text"; CB_Language.ValueMember = "Value"; CB_Language.DataSource = language_list; CB_Country.DisplayMember = "Text"; CB_Country.ValueMember = "Value"; CB_Region.DisplayMember = "Text"; CB_Region.ValueMember = "Value"; Main.setCountrySubRegion(CB_Country, "countries"); var oras_sprite_list = new[] { //new { Text = "Calem", Value = 00 }, //new { Text = "Serena", Value = 01 }, new { Text = "Sycamore", Value = 02 }, new { Text = "Diantha", Value = 03 }, new { Text = "Wikstrom", Value = 04 }, new { Text = "Malva", Value = 05 }, new { Text = "Drasna", Value = 06 }, new { Text = "Siebold", Value = 07 }, new { Text = "Viola", Value = 08 }, new { Text = "Grant", Value = 09 }, new { Text = "Korrina", Value = 10 }, new { Text = "Ramos", Value = 11 }, new { Text = "Clemont", Value = 12 }, new { Text = "Valerie", Value = 13 }, new { Text = "Olympia", Value = 14 }, new { Text = "Wulfric", Value = 15 }, new { Text = "Youngster (XY)", Value = 16 }, //new { Text = "(None)", Value = 17 }, new { Text = "Lass (XY)", Value = 18 }, new { Text = "Lady (XY)", Value = 19 }, new { Text = "Schoolgirl (XY)", Value = 20 }, new { Text = "Battle Girl (XY)", Value = 21 }, new { Text = "Schoolboy (XY)", Value = 22 }, new { Text = "Rich Boy (XY)", Value = 23 }, new { Text = "Female Ace Trainer (XY)", Value = 24 }, //new { Text = "(None)", Value = 25 }, new { Text = "Female Ranger (XY)", Value = 26 }, new { Text = "Male Ace Trainer (XY)", Value = 27 }, new { Text = "Male Ranger (XY)", Value = 28 }, new { Text = "Madame", Value = 29 }, new { Text = "Monsieur", Value = 30 }, new { Text = "Black Belt (XY)", Value = 31 }, new { Text = "Male Punk (XY)", Value = 32 }, new { Text = "Fairy Tale Girl (XY)", Value = 33 }, new { Text = "Shauna", Value = 34 }, new { Text = "Tierno", Value = 35 }, new { Text = "Trevor", Value = 36 }, new { Text = "Brendan", Value = 37 }, new { Text = "May", Value = 38 }, //new { Text = "(None)", Value = 39 }, new { Text = "Hiker", Value = 40 }, new { Text = "Aroma Lady", Value = 41 }, new { Text = "Male Schoolkid", Value = 42 }, new { Text = "Female Schoolkid", Value = 43 }, new { Text = "Black Belt (ORAS)", Value = 44 }, new { Text = "Battle Girl (ORAS)", Value = 45 }, new { Text = "Pokemaniac (ORAS)", Value = 46 }, new { Text = "Fairy Tale Girl (ORAS)", Value = 47 }, new { Text = "Victor Winstrate", Value = 48 }, new { Text = "Victoria Winstrate", Value = 49 }, new { Text = "Male Ranger (ORAS)", Value = 50 }, new { Text = "Female Ranger (ORAS)", Value = 51 }, new { Text = "Male Swimmer (ORAS)", Value = 52 }, new { Text = "Hex Maniac", Value = 53 }, new { Text = "Male Ace Trainer (ORAS)", Value = 54 }, new { Text = "Female Ace Trainer (ORAS)", Value = 55 }, new { Text = "Street Thug", Value = 56 }, new { Text = "Delinquent", Value = 57 }, new { Text = "Male Expert", Value = 58 }, new { Text = "Female Expert", Value = 59 }, new { Text = "Lady (ORAS)", Value = 60 }, new { Text = "Rich Boy (ORAS)", Value = 61 }, new { Text = "Ninja Boy", Value = 62 }, new { Text = "Beauty (ORAS)", Value = 63 }, new { Text = "Guitarist", Value = 64 }, new { Text = "Lass (ORAS)", Value = 65 }, new { Text = "Male Breeder (ORAS)", Value = 66 }, new { Text = "Female Breeder (ORAS)", Value = 67 }, new { Text = "Camper", Value = 68 }, new { Text = "Picnicker", Value = 69 }, new { Text = "Wally", Value = 70 }, new { Text = "Steven", Value = 71 }, new { Text = "Maxie", Value = 72 }, new { Text = "Archie", Value = 73 }, new { Text = "Pokécenter", Value = 0x80 }, new { Text = "Gift", Value = 0x81 }, }; CB_MultiplayerSprite.DisplayMember = "Text"; CB_MultiplayerSprite.ValueMember = "Value"; CB_MultiplayerSprite.DataSource = oras_sprite_list; L_Vivillon.Text = Main.specieslist[666] + ":"; Main.setForms(666, CB_Vivillon); } private void getBadges() { // Fetch Badges Bitmap[] bma = Main.SAV.ORAS ? new[] { Properties.Resources.badge_01, // ORAS Badges Properties.Resources.badge_02, Properties.Resources.badge_03, Properties.Resources.badge_04, Properties.Resources.badge_05, Properties.Resources.badge_06, Properties.Resources.badge_07, Properties.Resources.badge_08, } : new [] { Properties.Resources.badge_1, // XY Badges Properties.Resources.badge_2, Properties.Resources.badge_3, Properties.Resources.badge_4, Properties.Resources.badge_5, Properties.Resources.badge_6, Properties.Resources.badge_7, Properties.Resources.badge_8, }; for (int i = 0; i < 8; i++) pba[i].Image = Util.ChangeOpacity(bma[i], cba[i].Checked ? 1 : 0.1); } private void getTextBoxes() { int badgeval = SAV.Badges; for (int i = 0; i < 8; i++) cba[i].Checked = (badgeval & 1 << i) != 0; // Get Data string OT_NAME = SAV.OT; CB_Game.SelectedIndex = SAV.Game - 0x18; CB_Gender.SelectedIndex = SAV.Gender; // Display Data TB_OTName.Text = OT_NAME; MT_TID.Text = SAV.TID.ToString("00000"); MT_SID.Text = SAV.SID.ToString("00000"); MT_Money.Text = SAV.Money.ToString(); TB_Saying1.Text = SAV.Saying1; TB_Saying2.Text = SAV.Saying2; TB_Saying3.Text = SAV.Saying3; TB_Saying4.Text = SAV.Saying4; TB_Saying5.Text = SAV.Saying5; CB_Country.SelectedValue = SAV.Country; CB_Region.SelectedValue = SAV.SubRegion; CB_3DSReg.SelectedValue = SAV.ConsoleRegion; CB_Language.SelectedValue = SAV.Language; // Maison Data for (int i = 0; i < MaisonRecords.Length; i++) MaisonRecords[i].Text = SAV.getMaisonStat(i).ToString(); NUD_M.Value = SAV.M; // Sanity Check Map Coordinates if (!GB_Map.Enabled || SAV.X%0.5 != 0 || SAV.Z%0.5 != 0 || SAV.Y%0.5 != 0) GB_Map.Enabled = false; else try { NUD_X.Value = (decimal)SAV.X; NUD_Z.Value = (decimal)SAV.Z; NUD_Y.Value = (decimal)SAV.Y; } catch { GB_Map.Enabled = false; } // Load BP and PokeMiles TB_BP.Text = SAV.BP.ToString(); TB_PM.Text = SAV.getPSSStat(0xFC/4).ToString(); TB_Style.Text = SAV.Style.ToString(); // Load Play Time MT_Hours.Text = Main.SAV.PlayedHours.ToString(); MT_Minutes.Text = Main.SAV.PlayedMinutes.ToString(); MT_Seconds.Text = Main.SAV.PlayedSeconds.ToString(); // Load PSS Sprite CB_MultiplayerSprite.SelectedValue = SAV.Sprite; PB_Sprite.Image = (Image)Properties.Resources.ResourceManager.GetObject("tr_" + SAV.Sprite.ToString("00")); if (SAV.XY) { // Load Clothing Data int hat = SAV.Data[SAV.TrainerCard + 0x31] >> 3; int haircolor = SAV.Data[SAV.TrainerCard + 0x31] & 7; MT_Hat.Text = hat.ToString(); MT_HairColor.Text = haircolor.ToString(); MT_14030.Text = SAV.Data[SAV.TrainerCard + 0x30].ToString(); MT_14031.Text = SAV.Data[SAV.TrainerCard + 0x31].ToString(); MT_14032.Text = SAV.Data[SAV.TrainerCard + 0x32].ToString(); MT_14033.Text = SAV.Data[SAV.TrainerCard + 0x33].ToString(); MT_14034.Text = SAV.Data[SAV.TrainerCard + 0x34].ToString(); MT_14035.Text = SAV.Data[SAV.TrainerCard + 0x35].ToString(); MT_14036.Text = SAV.Data[SAV.TrainerCard + 0x36].ToString(); MT_14037.Text = SAV.Data[SAV.TrainerCard + 0x37].ToString(); MT_14038.Text = SAV.Data[SAV.TrainerCard + 0x38].ToString(); MT_14039.Text = SAV.Data[SAV.TrainerCard + 0x39].ToString(); MT_1403A.Text = SAV.Data[SAV.TrainerCard + 0x3A].ToString(); MT_1403B.Text = SAV.Data[SAV.TrainerCard + 0x3B].ToString(); MT_1403C.Text = SAV.Data[SAV.TrainerCard + 0x3C].ToString(); MT_1403D.Text = SAV.Data[SAV.TrainerCard + 0x3D].ToString(); MT_1403E.Text = SAV.Data[SAV.TrainerCard + 0x3E].ToString(); MT_1403F.Text = SAV.Data[SAV.TrainerCard + 0x3F].ToString(); } CB_Vivillon.SelectedIndex = SAV.Vivillon; CAL_LastSavedDate.Value = new DateTime(SAV.LastSavedYear, SAV.LastSavedMonth, SAV.LastSavedDay); CAL_LastSavedTime.Value = new DateTime(2000, 1, 1, SAV.LastSavedHour, SAV.LastSavedMinute, 0); CAL_AdventureStartDate.Value = new DateTime(2000, 1, 1).AddSeconds(SAV.SecondsToStart); CAL_AdventureStartTime.Value = new DateTime(2000, 1, 1).AddSeconds(SAV.SecondsToStart % 86400); } private void save() { SAV.Game = (byte)(CB_Game.SelectedIndex + 0x18); SAV.Gender = (byte)CB_Gender.SelectedIndex; SAV.TID = (ushort)Util.ToUInt32(MT_TID.Text); SAV.SID = (ushort)Util.ToUInt32(MT_SID.Text); SAV.Money = Util.ToUInt32(MT_Money.Text); SAV.SubRegion = Util.getIndex(CB_Region); SAV.Country = Util.getIndex(CB_Country); SAV.ConsoleRegion = Util.getIndex(CB_3DSReg); SAV.Language = Util.getIndex(CB_Language); SAV.OT = TB_OTName.Text; SAV.Saying1 = TB_Saying1.Text; SAV.Saying2 = TB_Saying2.Text; SAV.Saying3 = TB_Saying3.Text; SAV.Saying4 = TB_Saying4.Text; SAV.Saying5 = TB_Saying5.Text; // Copy Maison Data in for (int i = 0; i < MaisonRecords.Length; i++) SAV.setMaisonStat(i, ushort.Parse(MaisonRecords[i].Text)); // Copy Position if (GB_Map.Enabled) { SAV.M = (int)NUD_M.Value; SAV.X = (float)NUD_X.Value; SAV.Z = (float)NUD_Z.Value; SAV.Y = (float)NUD_Y.Value; } SAV.BP = ushort.Parse(TB_BP.Text); // Set Current PokéMiles SAV.setPSSStat(0xFC / 4, Util.ToUInt32(TB_PM.Text)); // Set Max Obtained Pokémiles SAV.setPSSStat(0x100 / 4, Util.ToUInt32(TB_PM.Text)); SAV.Style = byte.Parse(TB_Style.Text); // Copy Badges int badgeval = 0; for (int i = 0; i < 8; i++) badgeval |= (cba[i].Checked ? 1 : 0) << i; SAV.Badges = badgeval; // Save PlayTime SAV.PlayedHours = ushort.Parse(MT_Hours.Text); SAV.PlayedMinutes = ushort.Parse(MT_Minutes.Text)%60; SAV.PlayedSeconds = ushort.Parse(MT_Seconds.Text)%60; // Sprite SAV.Sprite = Convert.ToByte(CB_MultiplayerSprite.SelectedValue); // Appearance if (SAV.XY) { SAV.Data[SAV.TrainerCard + 0x30] = byte.Parse(MT_14030.Text); SAV.Data[SAV.TrainerCard + 0x31] = (byte)(byte.Parse(MT_HairColor.Text) | (byte.Parse(MT_Hat.Text) << 3)); SAV.Data[SAV.TrainerCard + 0x32] = byte.Parse(MT_14032.Text); SAV.Data[SAV.TrainerCard + 0x33] = byte.Parse(MT_14033.Text); SAV.Data[SAV.TrainerCard + 0x34] = byte.Parse(MT_14034.Text); SAV.Data[SAV.TrainerCard + 0x35] = byte.Parse(MT_14035.Text); SAV.Data[SAV.TrainerCard + 0x36] = byte.Parse(MT_14036.Text); SAV.Data[SAV.TrainerCard + 0x37] = byte.Parse(MT_14037.Text); SAV.Data[SAV.TrainerCard + 0x38] = byte.Parse(MT_14038.Text); SAV.Data[SAV.TrainerCard + 0x39] = byte.Parse(MT_14039.Text); SAV.Data[SAV.TrainerCard + 0x3A] = byte.Parse(MT_1403A.Text); SAV.Data[SAV.TrainerCard + 0x3B] = byte.Parse(MT_1403B.Text); SAV.Data[SAV.TrainerCard + 0x3C] = byte.Parse(MT_1403C.Text); SAV.Data[SAV.TrainerCard + 0x3D] = byte.Parse(MT_1403D.Text); SAV.Data[SAV.TrainerCard + 0x3E] = byte.Parse(MT_1403E.Text); SAV.Data[SAV.TrainerCard + 0x3F] = byte.Parse(MT_1403F.Text); } // Vivillon SAV.Vivillon = CB_Vivillon.SelectedIndex; int seconds = (int)(CAL_AdventureStartDate.Value - new DateTime(2000, 1, 1)).TotalSeconds; seconds -= seconds%86400; seconds += (int)(CAL_AdventureStartTime.Value - new DateTime(2000, 1, 1)).TotalSeconds; SAV.SecondsToStart = seconds; SAV.LastSavedYear = CAL_LastSavedDate.Value.Year; SAV.LastSavedMonth = CAL_LastSavedDate.Value.Month; SAV.LastSavedDay = CAL_LastSavedDate.Value.Day; SAV.LastSavedHour = CAL_LastSavedTime.Value.Hour; SAV.LastSavedMinute = CAL_LastSavedTime.Value.Minute; } private void clickOT(object sender, MouseEventArgs e) { TextBox tb = sender as TextBox ?? TB_OTName; // Special Character Form if (ModifierKeys != Keys.Control) return; if (Application.OpenForms.Cast