mirror of
https://github.com/kwsch/PKHeX
synced 2025-02-17 13:58:33 +00:00
Add gen4 Form 'flags'
This commit is contained in:
parent
c382388843
commit
49435dc379
1 changed files with 145 additions and 13 deletions
|
@ -687,30 +687,162 @@ namespace PKHeX
|
|||
int bit = pkm.Species - 1;
|
||||
|
||||
// Set the Species Owned Flag
|
||||
Data[PokeDex + brSize * 0 + bit / 8 + 0x4] |= (byte)(1 << (bit % 8));
|
||||
Data[PokeDex + brSize*0 + bit/8 + 0x4] |= (byte) (1 << (bit%8));
|
||||
|
||||
// Set the Species Seen Flag
|
||||
Data[PokeDex + brSize * 1 + bit / 8 + 0x4] |= (byte)(1 << (bit % 8));
|
||||
Data[PokeDex + brSize*1 + bit/8 + 0x4] |= (byte) (1 << (bit%8));
|
||||
|
||||
int FormOffset = PokeDex + 0x108;
|
||||
int PokeDexLanguageFlags = FormOffset + 0x20 + 494 + 6;
|
||||
|
||||
// Set the Language
|
||||
if (!DP)
|
||||
{
|
||||
int lang = pkm.Language - 1; if (lang > 5) lang = 0; // no KOR
|
||||
if (lang < 0) lang = 1;
|
||||
Data[PokeDexLanguageFlags + pkm.Species] |= (byte)(1 << lang);
|
||||
}
|
||||
int FormOffset1 = PokeDex + 0x108;
|
||||
int PokeDexLanguageFlags = FormOffset1 + 0x20;
|
||||
|
||||
// Formes : Castform & Cherrim do not have entries (Battle Only formes)
|
||||
// Lowest sub-value of formevalue is displayed, else is order of formes displayed.
|
||||
|
||||
// Deoxys forms 1-2 are stored in the last byte of the first bitRegion.
|
||||
// Deoxys forms 3-4 are stored in the last byte of the second bitRegion.
|
||||
if (pkm.Species == 386)
|
||||
{
|
||||
uint val = (uint)(Data[PokeDex + 0x4 + 1*brSize - 1] | Data[PokeDex + 0x4 + 2*brSize - 1] << 8);
|
||||
int[] forms = getDexFormValues(val, 4, 4);
|
||||
checkInsertForm(ref forms, pkm.AltForm);
|
||||
uint newval = setDexFormValues(forms, 4, 4);
|
||||
|
||||
Data[PokeDex + 0x4 + 1*brSize - 1] = (byte)(newval & 0xFF);
|
||||
Data[PokeDex + 0x4 + 2*brSize - 1] = (byte)((newval>>8) & 0xFF);
|
||||
}
|
||||
|
||||
// After the BitRegions is 0x20 bytes for the rest of the formes.
|
||||
// Standard Forme Bytes (DP)
|
||||
// [Shellos-Gastrodon-Burmy-Wormadam],[Unown*0x1C]
|
||||
if (pkm.Species == 422) // Shellos
|
||||
{
|
||||
int[] forms = getDexFormValues(Data[FormOffset1 + 0], 2, 2);
|
||||
checkInsertForm(ref forms, pkm.AltForm);
|
||||
uint newval = setDexFormValues(forms, 2, 2);
|
||||
Data[FormOffset1 + 0] = (byte)newval;
|
||||
}
|
||||
if (pkm.Species == 423) // Gastrodon
|
||||
{
|
||||
int[] forms = getDexFormValues(Data[FormOffset1 + 1], 2, 2);
|
||||
checkInsertForm(ref forms, pkm.AltForm);
|
||||
uint newval = setDexFormValues(forms, 2, 2);
|
||||
Data[FormOffset1 + 1] = (byte)newval;
|
||||
}
|
||||
if (pkm.Species == 412) // Burmy
|
||||
{
|
||||
int[] forms = getDexFormValues(Data[FormOffset1 + 2], 2, 3);
|
||||
checkInsertForm(ref forms, pkm.AltForm);
|
||||
uint newval = setDexFormValues(forms, 2, 3);
|
||||
Data[FormOffset1 + 2] = (byte)newval;
|
||||
}
|
||||
if (pkm.Species == 413) // Wormadam
|
||||
{
|
||||
int[] forms = getDexFormValues(Data[FormOffset1 + 3], 2, 3);
|
||||
checkInsertForm(ref forms, pkm.AltForm);
|
||||
uint newval = setDexFormValues(forms, 2, 3);
|
||||
Data[FormOffset1 + 3] = (byte)newval;
|
||||
}
|
||||
if (pkm.Species == 201) // Unown
|
||||
{
|
||||
for (int i = 0; i < 0x1C; i++)
|
||||
{
|
||||
byte val = Data[FormOffset1 + 4 + i];
|
||||
if (val == pkm.AltForm)
|
||||
break; // already set
|
||||
if (val != 0xFF)
|
||||
continue; // keep searching
|
||||
|
||||
// Extra Forme Bytes (PtHGSS)
|
||||
Data[FormOffset1 + 4 + i] = (byte)pkm.AltForm;
|
||||
break; // form now set
|
||||
}
|
||||
}
|
||||
|
||||
// DP stops here.
|
||||
if (DP)
|
||||
return;
|
||||
|
||||
// Set the Language
|
||||
int lang = pkm.Language - 1;
|
||||
if (lang > 5) lang = 0; // no KOR
|
||||
if (lang < 0) lang = 1;
|
||||
Data[PokeDexLanguageFlags + pkm.Species] |= (byte) (1 << lang);
|
||||
|
||||
int FormOffset2 = PokeDexLanguageFlags + 0x210;
|
||||
// PtHGSS added more forms.
|
||||
// [Rotom*4-highest bits unused],[Shaymin],[Giratina],[Pichu-HGSS ONLY]
|
||||
if (pkm.Species == 479) // Rotom
|
||||
{
|
||||
int[] forms = getDexFormValues(BitConverter.ToUInt32(Data, FormOffset2), 3, 6);
|
||||
checkInsertForm(ref forms, pkm.AltForm);
|
||||
uint newval = setDexFormValues(forms, 3, 6);
|
||||
BitConverter.GetBytes(newval).CopyTo(Data, FormOffset2);
|
||||
}
|
||||
if (pkm.Species == 492) // Shaymin
|
||||
{
|
||||
int[] forms = getDexFormValues(Data[FormOffset2 + 4], 2, 2);
|
||||
uint newval = setDexFormValues(forms, 2, 2);
|
||||
Data[FormOffset1 + 3] = (byte)newval;
|
||||
}
|
||||
if (pkm.Species == 487) // Giratina
|
||||
{
|
||||
int[] forms = getDexFormValues(Data[FormOffset2 + 5], 2, 2);
|
||||
uint newval = setDexFormValues(forms, 2, 2);
|
||||
Data[FormOffset1 + 3] = (byte)newval;
|
||||
}
|
||||
if (pkm.Species == 172 && HGSS) // Pichu
|
||||
{
|
||||
int[] forms = getDexFormValues(Data[FormOffset2 + 6], 2, 3);
|
||||
uint newval = setDexFormValues(forms, 2, 3);
|
||||
Data[FormOffset1 + 3] = (byte)newval;
|
||||
}
|
||||
}
|
||||
private int[] getDexFormValues(uint Value, int BitsPerForm, int readCt)
|
||||
{
|
||||
int[] Forms = new 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)
|
||||
Forms[i] = -1;
|
||||
else
|
||||
Forms[i] = val;
|
||||
}
|
||||
return Forms;
|
||||
}
|
||||
private uint setDexFormValues(int[] Forms, int BitsPerForm, int readCt)
|
||||
{
|
||||
int n1 = 0xFF >> (8 - BitsPerForm);
|
||||
uint Value = 0xFFFFFFFF << (Forms.Length*BitsPerForm);
|
||||
for (int i = 0; i < Forms.Length; i++)
|
||||
{
|
||||
int val = Forms[i];
|
||||
if (val == -1)
|
||||
val = n1;
|
||||
|
||||
Value |= (uint)(val << (BitsPerForm*i));
|
||||
}
|
||||
return Value;
|
||||
}
|
||||
private bool checkInsertForm(ref int[] Forms, int FormNum)
|
||||
{
|
||||
if (Forms.Any(num => num == FormNum))
|
||||
{
|
||||
return false; // already in list
|
||||
}
|
||||
if (Forms.All(num => num == -1))
|
||||
{
|
||||
Forms[0] = FormNum;
|
||||
return true; // none in list, insert at top
|
||||
}
|
||||
|
||||
// insert at first empty
|
||||
int n1 = Array.IndexOf(Forms, -1);
|
||||
if (n1 < 0)
|
||||
return false;
|
||||
|
||||
Forms[n1] = FormNum;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue