diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokedex4.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokedex4.Designer.cs index a201d2d4d..e21be63d5 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokedex4.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokedex4.Designer.cs @@ -67,6 +67,7 @@ private void InitializeComponent() this.LB_Form = new System.Windows.Forms.ListBox(); this.L_Seen = new System.Windows.Forms.Label(); this.L_NotSeen = new System.Windows.Forms.Label(); + this.CB_DexUpgraded = new System.Windows.Forms.ToolStripComboBox(); this.GB_Language.SuspendLayout(); this.modifyMenu.SuspendLayout(); this.SuspendLayout(); @@ -284,11 +285,11 @@ private void InitializeComponent() // // mnuUpgraded // - this.mnuUpgraded.CheckOnClick = true; + this.mnuUpgraded.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.CB_DexUpgraded}); this.mnuUpgraded.Name = "mnuUpgraded"; this.mnuUpgraded.Size = new System.Drawing.Size(148, 22); - this.mnuUpgraded.Text = "National Dex"; - this.mnuUpgraded.Click += new System.EventHandler(this.mnuUpgraded_Click); + this.mnuUpgraded.Text = "Dex Upgrade"; // // CHK_Seen // @@ -431,6 +432,12 @@ private void InitializeComponent() this.L_NotSeen.TabIndex = 58; this.L_NotSeen.Text = "Not Seen"; // + // CB_DexUpgraded + // + this.CB_DexUpgraded.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.CB_DexUpgraded.Name = "CB_DexUpgraded"; + this.CB_DexUpgraded.Size = new System.Drawing.Size(112, 23); + // // SAV_Pokedex4 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -514,5 +521,6 @@ private void InitializeComponent() private System.Windows.Forms.ListBox LB_Form; private System.Windows.Forms.Label L_Seen; private System.Windows.Forms.Label L_NotSeen; + private System.Windows.Forms.ToolStripComboBox CB_DexUpgraded; } } diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokedex4.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokedex4.cs index 239911639..379d13400 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokedex4.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen4/SAV_Pokedex4.cs @@ -11,7 +11,7 @@ public partial class SAV_Pokedex4 : Form public SAV_Pokedex4() { InitializeComponent(); - CL = new[] { CHK_L1, CHK_L2, CHK_L3, CHK_L4, CHK_L5, CHK_L6, }; + CL = new[] { CHK_L1, CHK_L2, CHK_L3, CHK_L5, CHK_L4, CHK_L6, }; // JPN,ENG,FRA,GER,ITA,SPA WinFormsUtil.TranslateInterface(this, Main.curlanguage); editing = true; @@ -26,11 +26,16 @@ public SAV_Pokedex4() for (int i = 1; i < SAV.MaxSpeciesID + 1; i++) LB_Species.Items.Add(i.ToString("000") + " - " + GameInfo.Strings.specieslist[i]); - - mnuUpgraded.Checked = SAV.DexUpgraded; - + editing = false; LB_Species.SelectedIndex = 0; + + string[] dexMode = new string[5] { "not given", "simple mode", "detect forms", "national dex", "other languages" }; + if (SAV.HGSS) dexMode = dexMode.Where((t, i) => i != 2).ToArray(); + for(int i = 0; i < dexMode.Length; i++) + CB_DexUpgraded.Items.Add(dexMode[i]); + if (SAV.DexUpgraded < CB_DexUpgraded.Items.Count) + CB_DexUpgraded.SelectedIndex = SAV.DexUpgraded; } private readonly SAV4 SAV = new SAV4(Main.SAV.Data); @@ -71,32 +76,38 @@ private void removedropCB(object sender, KeyEventArgs e) private const string GENDERLESS = "Genderless"; private const string MALE = "Male"; private const string FEMALE = "Female"; + private static int[] DPLangSpecies = new int[14] { 23, 25, 54, 77, 120, 129, 202, 214, 215, 216, 228, 278, 287, 315 }; private void getEntry() { // Load Bools for the data int bit = species - 1; - byte mask = (byte) (1 << (bit & 7)); + byte mask = (byte)(1 << (bit & 7)); int ofs = SAV.PokeDex + (bit >> 3) + 0x4; - - if (!SAV.DP) + int FormOffset1 = SAV.PokeDex + 4 + brSize * 4 + 4; + int PokeDexLanguageFlags = FormOffset1 + (SAV.HGSS ? 0x3C : 0x20); + int l_ofs = !SAV.DP ? species : (1 + Array.IndexOf(DPLangSpecies, species)); + if (l_ofs > 0) { - int FormOffset1 = SAV.PokeDex + 4 + brSize*4 + 4; - int PokeDexLanguageFlags = FormOffset1 + (SAV.HGSS ? 0x3C : 0x20); - int l_ofs = PokeDexLanguageFlags + species; + l_ofs += PokeDexLanguageFlags; for (int i = 0; i < LangCount; i++) - CL[i].Checked = (SAV.Data[l_ofs] & (byte) (1 << i)) != 0; + { + CL[i].Enabled = true; + CL[i].Checked = (SAV.Data[l_ofs] & (byte)(1 << i)) != 0; + } } + else + for (int i = 0; i < LangCount; i++) CL[i].Enabled = CL[i].Checked = false; - bool bit2 = (SAV.Data[ofs + brSize*2] & mask) != 0; - bool bit3 = (SAV.Data[ofs + brSize*3] & mask) != 0; + bool bit2 = (SAV.Data[ofs + brSize * 2] & mask) != 0; + bool bit3 = (SAV.Data[ofs + brSize * 3] & mask) != 0; - CHK_Seen.Checked = (SAV.Data[ofs + brSize*1] & mask) != 0; - CHK_Caught.Checked = (SAV.Data[ofs + brSize*0] & mask) != 0; + CHK_Seen.Checked = (SAV.Data[ofs + brSize * 1] & mask) != 0; + CHK_Caught.Checked = (SAV.Data[ofs + brSize * 0] & mask) != 0; // Genders LB_Gender.Items.Clear(); LB_NGender.Items.Clear(); - + var active = CHK_Seen.Checked ? LB_Gender : LB_NGender; var inactive = LB_NGender; var other = bit2 ^ bit3 ? active : inactive; @@ -137,65 +148,67 @@ private void getEntry() private void setEntry() { - if (species < 0) + if (species < 0) return; - + int bit = species - 1; byte mask = (byte)(1 << (bit & 7)); int ofs = SAV.PokeDex + (bit >> 3) + 0x4; - + // Check if already Seen if (!CHK_Seen.Checked || LB_Gender.Items.Count == 0) { - SAV.Data[ofs + brSize*0] &= (byte) ~mask; - SAV.Data[ofs + brSize*1] &= (byte) ~mask; - SAV.Data[ofs + brSize*2] &= (byte) ~mask; - SAV.Data[ofs + brSize*3] &= (byte) ~mask; + SAV.Data[ofs + brSize * 0] &= (byte)~mask; + SAV.Data[ofs + brSize * 1] &= (byte)~mask; + SAV.Data[ofs + brSize * 2] &= (byte)~mask; + SAV.Data[ofs + brSize * 3] &= (byte)~mask; } else // Is Seen { // Set the Species Owned Flag if (CHK_Caught.Checked) - SAV.Data[ofs + brSize*0] |= mask; + SAV.Data[ofs + brSize * 0] |= mask; else - SAV.Data[ofs + brSize*0] &= (byte) ~mask; + SAV.Data[ofs + brSize * 0] &= (byte)~mask; - SAV.Data[ofs + brSize*1] |= mask; - switch ((string) LB_Gender.Items[0]) + SAV.Data[ofs + brSize * 1] |= mask; + switch ((string)LB_Gender.Items[0]) { case GENDERLESS: - SAV.Data[ofs + brSize*2] &= (byte) ~mask; - SAV.Data[ofs + brSize*3] &= (byte) ~mask; + SAV.Data[ofs + brSize * 2] &= (byte)~mask; + SAV.Data[ofs + brSize * 3] &= (byte)~mask; break; case FEMALE: - SAV.Data[ofs + brSize*2] |= mask; // set + SAV.Data[ofs + brSize * 2] |= mask; // set if (LB_Gender.Items.Count != 1) // Male present - SAV.Data[ofs + brSize*3] &= (byte) ~mask; // unset + SAV.Data[ofs + brSize * 3] &= (byte)~mask; // unset else - SAV.Data[ofs + brSize*3] |= mask; // set + SAV.Data[ofs + brSize * 3] |= mask; // set break; case MALE: - SAV.Data[ofs + brSize*2] &= (byte) ~mask; // unset + SAV.Data[ofs + brSize * 2] &= (byte)~mask; // unset if (LB_Gender.Items.Count != 1) // Female present - SAV.Data[ofs + brSize*3] |= mask; // set + SAV.Data[ofs + brSize * 3] |= mask; // set else - SAV.Data[ofs + brSize*3] &= (byte) ~mask; // unset + SAV.Data[ofs + brSize * 3] &= (byte)~mask; // unset break; default: throw new ArgumentException("Invalid Gender???"); } } - if (!SAV.DP) + int FormOffset1 = SAV.PokeDex + 4 + 4 * brSize + 4; + int PokeDexLanguageFlags = FormOffset1 + (SAV.HGSS ? 0x3C : 0x20); + int l_ofs = !SAV.DP ? species : (1 + Array.IndexOf(DPLangSpecies, species)); + if (l_ofs > 0) { - int FormOffset1 = SAV.PokeDex + 4 + 4*brSize + 4; - int PokeDexLanguageFlags = FormOffset1 + (SAV.HGSS ? 0x3C : 0x20); + l_ofs += PokeDexLanguageFlags; for (int i = 0; i < LangCount; i++) { if (CL[i].Checked) - SAV.Data[PokeDexLanguageFlags + species] |= (byte) (1 << i); + SAV.Data[l_ofs] |= (byte)(1 << i); else - SAV.Data[PokeDexLanguageFlags + species] &= (byte) ~(1 << i); + SAV.Data[l_ofs] &= (byte)~(1 << i); } } @@ -219,6 +232,8 @@ private void B_Cancel_Click(object sender, EventArgs e) private void B_Save_Click(object sender, EventArgs e) { setEntry(); + int s = CB_DexUpgraded.SelectedIndex; + if (s >= 0) SAV.DexUpgraded = s; // Return back to the parent savefile Array.Copy(SAV.Data, Main.SAV.Data, SAV.Data.Length); @@ -238,7 +253,7 @@ private void B_GiveAll_Click(object sender, EventArgs e) CHK_L6.Checked = ModifierKeys != Keys.Control; } CHK_Caught.Checked = CHK_Seen.Checked = ModifierKeys != Keys.Control; - + if (ModifierKeys == Keys.Control) seenNone(); else @@ -306,7 +321,7 @@ private void modifyAll(object sender, EventArgs e) setEntry(); getEntry(); } - + private void CHK_Seen_CheckedChanged(object sender, EventArgs e) { if (!editing) @@ -428,10 +443,5 @@ private void moveForm(object sender, EventArgs e) lb.Items.Insert(newIndex, item); lb.SelectedIndex = newIndex; } - private void mnuUpgraded_Click(object sender, EventArgs e) - { - SAV.DexUpgraded ^= true; - mnuUpgraded.Checked = SAV.DexUpgraded; - } } } diff --git a/PKHeX/Saves/SAV4.cs b/PKHeX/Saves/SAV4.cs index 808f36c21..d3f1f9914 100644 --- a/PKHeX/Saves/SAV4.cs +++ b/PKHeX/Saves/SAV4.cs @@ -757,7 +757,7 @@ protected override void setDex(PKM pkm) const int brSize = 0x40; int bit = pkm.Species - 1; - byte mask = (byte) (1 << (bit & 7)); + byte mask = (byte)(1 << (bit & 7)); int ofs = PokeDex + (bit >> 3) + 0x4; /* 4 BitRegions with 0x40*8 bits @@ -774,26 +774,26 @@ protected override void setDex(PKM pkm) */ // Set the Species Owned Flag - Data[ofs + brSize*0] |= mask; + Data[ofs + brSize * 0] |= mask; // Check if already Seen - if ((Data[ofs + brSize*1] & mask) == 0) // Not seen + if ((Data[ofs + brSize * 1] & mask) == 0) // Not seen { int gr = pkm.PersonalInfo.Gender; switch (gr) { case 255: // Genderless case 0: // Male Only - Data[ofs + brSize*1] &= mask; - Data[ofs + brSize*2] &= mask; + Data[ofs + brSize * 1] &= mask; + Data[ofs + brSize * 2] &= mask; break; case 254: // Female Only - Data[ofs + brSize*1] |= mask; - Data[ofs + brSize*2] |= mask; + Data[ofs + brSize * 1] |= mask; + Data[ofs + brSize * 2] |= mask; break; default: // Male or Female - bool m = (Data[ofs + brSize*1] & mask) != 0; - bool f = (Data[ofs + brSize*2] & mask) != 0; + bool m = (Data[ofs + brSize * 1] & mask) != 0; + bool f = (Data[ofs + brSize * 2] & mask) != 0; if (!(m || f)) // Add both forms (not a single form == 00 or 11). { int gender = pkm.Gender & 1; @@ -804,7 +804,7 @@ protected override void setDex(PKM pkm) } } - int FormOffset1 = PokeDex + 4 + brSize*4 + 4; + int FormOffset1 = PokeDex + 4 + brSize * 4 + 4; var forms = getForms(pkm.Species); if (forms != null) { @@ -829,8 +829,9 @@ protected override void setDex(PKM pkm) } } - // DP stops here. - if (DP) + int[] DPLangSpecies = new int[14] { 23, 25, 54, 77, 120, 129, 202, 214, 215, 216, 228, 278, 287, 315 }; + int dpl = 1 + Array.IndexOf(DPLangSpecies, pkm.Species); + if (DP && dpl <= 0) return; // Set the Language @@ -838,7 +839,7 @@ protected override void setDex(PKM pkm) if (lang > 5) lang = 0; // no KOR if (lang < 0) lang = 1; int PokeDexLanguageFlags = FormOffset1 + (HGSS ? 0x3C : 0x20); - Data[PokeDexLanguageFlags + pkm.Species] |= (byte) (1 << lang); + Data[PokeDexLanguageFlags + (DP ? dpl : pkm.Species)] |= (byte)(1 << lang); } public override bool getCaught(int species) @@ -873,14 +874,12 @@ public int[] getForms(int species) } int FormOffset1 = PokeDex + 4 + 4*brSize + 4; - if (HGSS) - FormOffset1 += 0x1C; switch (species) { case 422: // Shellos - return getDexFormValues(Data[FormOffset1 + 0], 2, 2); + return getDexFormValues(Data[FormOffset1 + 0], 1, 2); case 423: // Gastrodon - return getDexFormValues(Data[FormOffset1 + 1], 2, 2); + return getDexFormValues(Data[FormOffset1 + 1], 1, 2); case 412: // Burmy return getDexFormValues(Data[FormOffset1 + 2], 2, 3); case 413: // Wormadam @@ -888,7 +887,7 @@ public int[] getForms(int species) case 201: // Unown return getData(FormOffset1 + 4, 0x1C).Select(i => (int)i).ToArray(); } - if (!DP) + if (DP) return null; int PokeDexLanguageFlags = FormOffset1 + (HGSS ? 0x3C : 0x20); @@ -898,9 +897,9 @@ public int[] getForms(int species) case 479: // Rotom return getDexFormValues(BitConverter.ToUInt32(Data, FormOffset2), 3, 6); case 492: // Shaymin - return getDexFormValues(Data[FormOffset2 + 4], 2, 2); + return getDexFormValues(Data[FormOffset2 + 4], 1, 2); case 487: // Giratina - return getDexFormValues(Data[FormOffset2 + 5], 2, 2); + return getDexFormValues(Data[FormOffset2 + 5], 1, 2); case 172: if (!HGSS) return null; @@ -922,15 +921,13 @@ public void setForms(int spec, int[] forms) } int FormOffset1 = PokeDex + 4 + 4*brSize + 4; - if (HGSS) - FormOffset1 += 0x1C; switch (spec) { case 422: // Shellos - Data[FormOffset1 + 0] = (byte)setDexFormValues(forms, 2, 2); + Data[FormOffset1 + 0] = (byte)setDexFormValues(forms, 1, 2); return; case 423: // Gastrodon - Data[FormOffset1 + 1] = (byte)setDexFormValues(forms, 2, 2); + Data[FormOffset1 + 1] = (byte)setDexFormValues(forms, 1, 2); return; case 412: // Burmy Data[FormOffset1 + 2] = (byte)setDexFormValues(forms, 2, 3); @@ -959,10 +956,10 @@ public void setForms(int spec, int[] forms) BitConverter.GetBytes(setDexFormValues(forms, 3, 6)).CopyTo(Data, FormOffset2); return; case 492: // Shaymin - Data[FormOffset2 + 4] = (byte)setDexFormValues(forms, 2, 2); + Data[FormOffset2 + 4] = (byte)setDexFormValues(forms, 1, 2); return; case 487: // Giratina - Data[FormOffset2 + 5] = (byte)setDexFormValues(forms, 2, 2); + Data[FormOffset2 + 5] = (byte)setDexFormValues(forms, 1, 2); return; case 172: // Pichu if (!HGSS) @@ -978,8 +975,8 @@ private static int[] getDexFormValues(uint Value, int BitsPerForm, int readCt) int n1 = 0xFF >> (8 - BitsPerForm); for (int i = 0; i < Forms.Length; i++) { - int val = (int)(Value >> (i*BitsPerForm))&n1; - if (n1 == val) + int val = (int)(Value >> (i * BitsPerForm)) & n1; + if (n1 == val && BitsPerForm > 1) Forms[i] = -1; else Forms[i] = val; @@ -1020,10 +1017,47 @@ private static bool checkInsertForm(ref int[] Forms, int FormNum) Forms[n1] = FormNum; return true; } - public bool DexUpgraded + public int DexUpgraded { - get{ return (Data[0x1415 + GBO] & 1) != 0; } - set{ Data[0x1415 + GBO] = (byte)((Data[0x1415 + GBO] & 0xFE) | (value ? 1 : 0)); } + get + { + switch (Version) + { + case GameVersion.DP: + if ((Data[0x1413 + GBO] & 1) != 0) return 4; + else if ((Data[0x1415 + GBO] & 1) != 0) return 3; + else if ((Data[0x1404 + GBO] & 1) != 0) return 2; + else if ((Data[0x1414 + GBO] & 1) != 0) return 1; + else return 0; + case GameVersion.HGSS: + if ((Data[0x15ED + GBO] & 1) != 0) return 3; + else if ((Data[0x15EF + GBO] & 1) != 0) return 2; + else if ((Data[0x15EE + GBO] & 1) != 0 && (Data[0x10D1 + GBO] & 8) != 0) return 1; + else return 0; + // case GameVersion.Pt: break; + default: return 0; + } + } + set + { + switch (Version) + { + case GameVersion.DP: + Data[0x1413 + GBO] = (byte)((Data[0x1413 + GBO] & 0xFE) | (value == 4 ? 1 : 0)); + Data[0x1415 + GBO] = (byte)((Data[0x1415 + GBO] & 0xFE) | (value >= 3 ? 1 : 0)); + Data[0x1404 + GBO] = (byte)((Data[0x1404 + GBO] & 0xFE) | (value >= 2 ? 1 : 0)); + Data[0x1414 + GBO] = (byte)((Data[0x1414 + GBO] & 0xFE) | (value >= 1 ? 1 : 0)); + break; + case GameVersion.HGSS: + Data[0x15ED + GBO] = (byte)((Data[0x15ED + GBO] & 0xFE) | (value == 3 ? 1 : 0)); + Data[0x15EF + GBO] = (byte)((Data[0x15EF + GBO] & 0xFE) | (value >= 2 ? 1 : 0)); + Data[0x15EE + GBO] = (byte)((Data[0x15EE + GBO] & 0xFE) | (value >= 1 ? 1 : 0)); + Data[0x10D1 + GBO] = (byte)((Data[0x10D1 + GBO] & 0xF7) | (value >= 1 ? 8 : 0)); + break; + // case GameVersion.Pt: break; + default: return; + } + } } } }