Merge pull request #1 from kwsch/master

Update from upstream repo kwsch/PKHeX
This commit is contained in:
wwwwwwzx 2017-03-22 13:28:41 -07:00 committed by GitHub
commit 5b83d5b2d4
3 changed files with 133 additions and 81 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}
}
}