mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-19 08:53:28 +00:00
d4ea56cfd6
Remove numerous inter-form dependencies, remove hard-coded offsets, update a few spots to use better programming practices. Should increase the readability of PKHeX's source code.
485 lines
19 KiB
C#
485 lines
19 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Windows.Forms;
|
|
|
|
namespace PKHeX
|
|
{
|
|
public partial class SAV_PokedexORAS : Form
|
|
{
|
|
public SAV_PokedexORAS()
|
|
{
|
|
InitializeComponent();
|
|
Util.TranslateInterface(this, Main.curlanguage);
|
|
sav = (byte[])Main.savefile.Clone();
|
|
|
|
Setup();
|
|
editing = false;
|
|
LB_Species.SelectedIndex = 0;
|
|
TB_Spinda.Text = BitConverter.ToUInt32(sav, Main.SaveGame.Spinda).ToString("X8");
|
|
}
|
|
public byte[] sav;
|
|
public bool[,] specbools = new bool[9, 0x60 * 8];
|
|
public bool[,] langbools = new bool[7, 0x60 * 8];
|
|
bool editing = true;
|
|
private void Setup()
|
|
{
|
|
// Clear Listbox and ComboBox
|
|
LB_Species.Items.Clear();
|
|
CB_Species.Items.Clear();
|
|
|
|
// Fill List
|
|
#region Species
|
|
{
|
|
var species_list = Util.getCBList(Main.specieslist, null);
|
|
species_list.RemoveAt(0); // Remove 0th Entry
|
|
CB_Species.DisplayMember = "Text";
|
|
CB_Species.ValueMember = "Value";
|
|
CB_Species.DataSource = species_list;
|
|
}
|
|
#endregion
|
|
|
|
for (int i = 1; i < Main.specieslist.Length; i++)
|
|
LB_Species.Items.Add(i.ToString("000") + " - " + Main.specieslist[i]);
|
|
|
|
getBools();
|
|
}
|
|
private void changeCBSpecies(object sender, EventArgs e)
|
|
{
|
|
if (editing) return;
|
|
|
|
editing = true;
|
|
int index = (int)CB_Species.SelectedValue;
|
|
LB_Species.SelectedIndex = index - 1; // Since we don't allow index0 in combobox, everything is shifted by 1
|
|
LB_Species.TopIndex = LB_Species.SelectedIndex;
|
|
loadchks();
|
|
editing = false;
|
|
}
|
|
private void changeLBSpecies(object sender, EventArgs e)
|
|
{
|
|
if (editing) return;
|
|
editing = true;
|
|
int index = LB_Species.SelectedIndex + 1;
|
|
CB_Species.SelectedValue = index;
|
|
loadchks();
|
|
editing = false;
|
|
}
|
|
private void loadchks()
|
|
{
|
|
// Load Bools for the data
|
|
int pk;
|
|
try
|
|
{ pk = Util.getIndex(CB_Species); }
|
|
catch { pk = LB_Species.SelectedIndex + 1; }
|
|
|
|
CheckBox[] CP =
|
|
{
|
|
CHK_P1,CHK_P2,CHK_P3,CHK_P4,CHK_P5,CHK_P6,CHK_P7,CHK_P8,CHK_P9,
|
|
};
|
|
CheckBox[] CL =
|
|
{
|
|
CHK_L1,CHK_L2,CHK_L3,CHK_L4,CHK_L5,CHK_L6,CHK_L7,
|
|
};
|
|
// Load Partitions
|
|
for (int i = 0; i < 9; i++)
|
|
CP[i].Checked = specbools[i, pk-1];
|
|
for (int i = 0; i < 7; i++)
|
|
CL[i].Checked = langbools[i, pk-1];
|
|
{
|
|
CHK_P1.Enabled = true;
|
|
|
|
int index = LB_Species.SelectedIndex + 1;
|
|
PKX.PersonalParser.Personal MonData = PKX.PersonalGetter.GetPersonal(index);
|
|
int gt = MonData.GenderRatio;
|
|
|
|
CHK_P2.Enabled = CHK_P4.Enabled = CHK_P6.Enabled = CHK_P8.Enabled = (gt != 254); // Not Female-Only
|
|
CHK_P3.Enabled = CHK_P5.Enabled = CHK_P7.Enabled = CHK_P9.Enabled = (gt != 0) && (gt != 255); // Not Male-Only and Not Genderless
|
|
|
|
for (int i = 0; i < 7; i++)
|
|
CL[i].Enabled = true;
|
|
}
|
|
|
|
// Load Encountered Count
|
|
editing = true;
|
|
MT_Count.Text = BitConverter.ToUInt16(sav, Main.SaveGame.EncounterCount + (pk - 1) * 2).ToString();
|
|
editing = false;
|
|
}
|
|
private void removedropCB(object sender, KeyEventArgs e)
|
|
{
|
|
((ComboBox)sender).DroppedDown = false;
|
|
}
|
|
private void changeLanguageBool(object sender, EventArgs e)
|
|
{
|
|
int species = LB_Species.SelectedIndex + 1;
|
|
langbools[0, (species - 1)] = CHK_L1.Checked;
|
|
langbools[1, (species - 1)] = CHK_L2.Checked;
|
|
langbools[2, (species - 1)] = CHK_L3.Checked;
|
|
langbools[3, (species - 1)] = CHK_L4.Checked;
|
|
langbools[4, (species - 1)] = CHK_L5.Checked;
|
|
langbools[5, (species - 1)] = CHK_L6.Checked;
|
|
langbools[6, (species - 1)] = CHK_L7.Checked;
|
|
}
|
|
private void changePartitionBool(object sender, EventArgs e)
|
|
{
|
|
int species = LB_Species.SelectedIndex + 1;
|
|
specbools[0, (species - 1)] = CHK_P1.Checked;
|
|
specbools[1, (species - 1)] = CHK_P2.Checked;
|
|
specbools[2, (species - 1)] = CHK_P3.Checked;
|
|
specbools[3, (species - 1)] = CHK_P4.Checked;
|
|
specbools[4, (species - 1)] = CHK_P5.Checked;
|
|
specbools[5, (species - 1)] = CHK_P6.Checked;
|
|
specbools[6, (species - 1)] = CHK_P7.Checked;
|
|
specbools[7, (species - 1)] = CHK_P8.Checked;
|
|
specbools[8, (species - 1)] = CHK_P9.Checked;
|
|
}
|
|
|
|
private void B_Cancel_Click(object sender, EventArgs e)
|
|
{
|
|
Close();
|
|
}
|
|
private void B_Save_Click(object sender, EventArgs e)
|
|
{
|
|
saveChanges();
|
|
|
|
// Return back to the parent savefile
|
|
Array.Copy(sav, Main.savefile, sav.Length);
|
|
Close();
|
|
}
|
|
private void saveChanges()
|
|
{
|
|
// Save back the Species Bools
|
|
// Return to Byte Array
|
|
for (int p = 0; p < 9; p++)
|
|
{
|
|
byte[] sdata = new byte[0x60];
|
|
|
|
for (int i = 0; i < 0x60 * 8; i++)
|
|
if (specbools[p, i])
|
|
sdata[i / 8] |= (byte)(1 << i % 8);
|
|
|
|
Array.Copy(sdata, 0, sav, Main.SaveGame.PokeDex + 0x8 + 0x60 * p, 0x60);
|
|
}
|
|
|
|
// Build new bool array for the Languages
|
|
{
|
|
bool[] languagedata = new bool[0x27C * 8];
|
|
for (int i = 0; i < 722; i++)
|
|
for (int l = 0; l < 7; l++)
|
|
languagedata[i * 7 + l] = langbools[l, i];
|
|
|
|
// Return to Byte Array
|
|
byte[] ldata = new byte[languagedata.Length / 8];
|
|
|
|
for (int i = 0; i < languagedata.Length; i++)
|
|
if (languagedata[i])
|
|
ldata[i / 8] |= (byte)(1 << i % 8);
|
|
|
|
Array.Copy(ldata, 0, sav, Main.SaveGame.PokeDexLanguageFlags, 0x27C);
|
|
}
|
|
|
|
// Store Spinda Spot
|
|
uint PID = Util.getHEXval(TB_Spinda);
|
|
Array.Copy(BitConverter.GetBytes(PID), 0, sav, Main.SaveGame.Spinda, 4);
|
|
}
|
|
|
|
private void getBools()
|
|
{
|
|
// Fill Bit arrays
|
|
for (int i = 0; i < 9; i++)
|
|
{
|
|
byte[] data = new byte[0x60];
|
|
int offset = Main.SaveGame.PokeDex + 0x8 + 0x60 * i;
|
|
Array.Copy(sav, offset, data, 0, 0x60);
|
|
BitArray BitRegion = new BitArray(data);
|
|
for (int b = 0; b < (0x60 * 8); b++)
|
|
specbools[i, b] = BitRegion[b];
|
|
}
|
|
|
|
// Fill Language arrays
|
|
byte[] langdata = new byte[0x280];
|
|
Array.Copy(sav, Main.SaveGame.PokeDexLanguageFlags, langdata, 0, 0x280);
|
|
BitArray LangRegion = new BitArray(langdata);
|
|
for (int b = 0; b < (721); b++) // 721 Species
|
|
for (int i = 0; i < 7; i++) // 7 Languages
|
|
langbools[i, b] = LangRegion[7 * b + i];
|
|
}
|
|
|
|
private void B_GiveAll_Click(object sender, EventArgs e)
|
|
{
|
|
if (LB_Species.SelectedIndex > 0x2D0) return;
|
|
if (CHK_L1.Enabled)
|
|
{
|
|
CHK_L1.Checked =
|
|
CHK_L2.Checked =
|
|
CHK_L3.Checked =
|
|
CHK_L4.Checked =
|
|
CHK_L5.Checked =
|
|
CHK_L6.Checked =
|
|
CHK_L7.Checked = ModifierKeys != Keys.Control;
|
|
}
|
|
if (CHK_P1.Enabled)
|
|
{
|
|
CHK_P1.Checked = ModifierKeys != Keys.Control;
|
|
}
|
|
int index = LB_Species.SelectedIndex+1;
|
|
|
|
PKX.PersonalParser.Personal MonData = PKX.PersonalGetter.GetPersonal(index);
|
|
int gt = MonData.GenderRatio;
|
|
|
|
CHK_P2.Checked = CHK_P4.Checked = CHK_P6.Checked = CHK_P8.Checked = ((gt != 254)) && ModifierKeys != Keys.Control;
|
|
CHK_P3.Checked = CHK_P5.Checked = CHK_P7.Checked = CHK_P9.Checked = (gt != 0) && (gt != 255) && ModifierKeys != Keys.Control;
|
|
|
|
changePartitionBool(null, null);
|
|
changeLanguageBool(null, null);
|
|
LB_Species.SelectedIndex++;
|
|
}
|
|
private void B_FillDex_Click(object sender, EventArgs e)
|
|
{
|
|
saveChanges();
|
|
// Copy Full Dex Byte Array
|
|
// Native Byte Writing
|
|
for (int i = 0; i < 0x5A; i++)
|
|
sav[Main.SaveGame.PokeDex + 8 + i] = 0xFF;
|
|
// Write remainder
|
|
sav[Main.SaveGame.PokeDex + 8 + 0x5A] = 0x01;
|
|
|
|
// Midsection Writing
|
|
{
|
|
#region Payload
|
|
uint[] payload =
|
|
{
|
|
0x8FFFFFFF, // 20015068
|
|
0xFFFFFFFF, // 2001506C
|
|
0xFFFFFFFF, // 20015070
|
|
0xF7FAFFFF, // 20015074
|
|
0xFFFFFFFF, // 20015078
|
|
0xFFFFFFFF, // 2001507C
|
|
0xFFFFFFFF, // 20015080
|
|
0xFFFCDFFF, // 20015084
|
|
0xFFFFFFFF, // 20015088
|
|
0xFDFFFFFF, // 2001508C
|
|
0xFFFFFFFF, // 20015090
|
|
0xF7FFFFFF, // 20015094
|
|
0x6FFFFFFF, // 20015098
|
|
0xFF7FFFFF, // 2001509C
|
|
0xDFFFFFFF, // 200150A0
|
|
0xFFFFFF7F, // 200150A4
|
|
0xFFFFFFFF, // 200150A8
|
|
0xFFFFFFE7, // 200150AC
|
|
0xFFFFFFFF, // 200150B0
|
|
0xFFCFFFFF, // 200150B4
|
|
0x8FFFFFFF, // 200150B8
|
|
0xFFFFFFFF, // 200150BC
|
|
0x0001FFFF, // 200150C0
|
|
0x00000000, //
|
|
|
|
0x7FFFFFFF, // 200150C8
|
|
0xFFFFFFFC, // 200150CC
|
|
0xFFFCFFFF, // 200150D0
|
|
0x7E7FF9E7, // 200150D4
|
|
0xFF9C7EF7, // 200150D8
|
|
0xFFFFFFFF, // 200150DC
|
|
0xFFFFFEFF, // 200150E0
|
|
0xF8E3E6FF, // 200150E4
|
|
0xFFFFFFFF, // 200150E8
|
|
0xFEFFFFF7, // 200150EC
|
|
0xFF3CFFFF, // 200150F0
|
|
0x081FFFFF, // 200150F4
|
|
0xDFFFFFFC, // 200150F8
|
|
0xFFE7FFFF, // 200150FC
|
|
0x39FFDFFF, // 20015100
|
|
0xFFFFC090, // 20015104
|
|
0xF9FFFFFF, // 20015108
|
|
0xFFFFFFFF, // 2001510C
|
|
0xFE3FFFFF, // 20015110
|
|
0x1FF39FBF, // 20015114
|
|
0xFFFFFE00, // 20015118
|
|
0xBFFFFFFF, // 2001511C
|
|
0x000007FF, // 10015120
|
|
0x00000000, //
|
|
|
|
0x8FFFFFFF, // 20015128
|
|
0xFFFFFFFF, // 2001512C
|
|
0xFFFFFFFF, // 20015130
|
|
0xF7FAFFFF, // 20015134
|
|
0xFFFFFFFF, // 20015138
|
|
0xFFFFFFFF, // 2001513C
|
|
0xFFFFFFFF, // 20015140
|
|
0xFFFCDFFF, // 20015144
|
|
0xFFFFFFFF, // 20015148
|
|
0xFDFFFFFF, // 2001514C
|
|
0xFFFFFFFF, // 20015150
|
|
0xF7FFFFFF, // 20015154
|
|
0x6FFFFFFF, // 20015158
|
|
0xFF7FFFFF, // 2001515C
|
|
0xDFFFFFFF, // 20015160
|
|
0xFFFFFF7F, // 20015164
|
|
0xFFFFFFFF, // 20015168
|
|
0xFFFFFFE7, // 2001516C
|
|
0xFFFFFFFF, // 20015170
|
|
0xFFCFFFFF, // 20015174
|
|
0x8FFFFFFF, // 20015178
|
|
0xFFFFFFFF, // 2001517C
|
|
0x0001FFFF, // 20015180
|
|
0x00000000, //
|
|
|
|
0x7FFFFFFF, // 20015188
|
|
0xFFFFFFFC, // 2001518C
|
|
0xFFFCFFFF, // 20015190
|
|
0x7E7FF9E7, // 20015194
|
|
0xFF9C7EF7, // 20015198
|
|
0xFFFFFFFF, // 2001519C
|
|
0xFFFFFEFF, // 200151A0
|
|
0xF8E3E6FF, // 200151A4
|
|
0xFFFFFFFF, // 200151A8
|
|
0xFEFFFFF7, // 200151AC
|
|
0xFF3CFFFF, // 200151B0
|
|
0x081FFFFF, // 200151B4
|
|
0xDFFFFFFC, // 200151B8
|
|
0xFFE7FFFF, // 200151BC
|
|
0x39FFDFFF, // 200151C0
|
|
0xFFFFC090, // 200151C4
|
|
0xF9FFFFFF, // 200151C8
|
|
0xFFFFFFFF, // 200151CC
|
|
0xFE3FFFFF, // 200151D0
|
|
0x1FF39FBF, // 200151D4
|
|
0xFFFFFE00, // 200151D8
|
|
0xBFFFFFFF, // 200151DC
|
|
0x000007FF, // 100151E0
|
|
0x00000000, //
|
|
|
|
0x8FFFFFFF, // 200151E8
|
|
0xFFFFFFFF, // 200151EC
|
|
0xFFFFFFFF, // 200151F0
|
|
0xF7FAFFFF, // 200151F4
|
|
0xFFFFFFFF, // 200151F8
|
|
0xFFFFFFFF, // 200151FC
|
|
0xFFFFFFFF, // 20015200
|
|
0xFFFCDFFF, // 20015204
|
|
0xFFFFFFFF, // 20015208
|
|
0xFDFFFFFF, // 2001520C
|
|
0xFFFFFFFF, // 20015210
|
|
0xF7FFFFFF, // 20015214
|
|
0x6FFFFFFF, // 20015218
|
|
0xFF7FFFFF, // 2001521C
|
|
0xDFFFFFFF, // 20015220
|
|
0xFFFFFF7F, // 20015224
|
|
0xFFFFFFFF, // 20015228
|
|
0xFFFFFFE7, // 2001522C
|
|
0xFFFFFFFF, // 20015230
|
|
0xFFCFFFFF, // 20015234
|
|
0x8FFFFFFF, // 20015238
|
|
0xFFFFFFFF, // 2001523C
|
|
0x0001FFFF, // 20015240
|
|
0x00000000, //
|
|
|
|
0x7FFFFFFF, // 20015248
|
|
0xFFFFFFFC, // 2001524C
|
|
0xFFFCFFFF, // 20015250
|
|
0x7E7FF9E7, // 20015254
|
|
0xFF9C7EF7, // 20015258
|
|
0xFFFFFFFF, // 2001525C
|
|
0xFFFFFEFF, // 20015260
|
|
0xF8E3E6FF, // 20015264
|
|
0xFFFFFFFF, // 20015268
|
|
0xFEFFFFF7, // 2001526C
|
|
0xFF3CFFFF, // 20015270
|
|
0x081FFFFF, // 20015274
|
|
0xDFFFFFFC, // 20015278
|
|
0xFFE7FFFF, // 2001527C
|
|
0x39FFDFFF, // 20015280
|
|
0xFFFFC090, // 20015284
|
|
0xF9FFFFFF, // 20015288
|
|
0xFFFFFFFF, // 2001528C
|
|
0xFE3FFFFF, // 20015290
|
|
0x1FF39FBF, // 20015294
|
|
0xFFFFFE00, // 20015298
|
|
0xBFFFFFFF, // 2001529C
|
|
0x000007FF, // 100152A0
|
|
0x00000000, //
|
|
|
|
0x8FFFFFFF, // 200152A8
|
|
0xFFFFFFFF, // 200152AC
|
|
0xFFFFFFFF, // 200152B0
|
|
0xF7FAFFFF, // 200152B4
|
|
0xFFFFFFFF, // 200152B8
|
|
0xFFFFFFFF, // 200152BC
|
|
0xFFFFFFFF, // 200152C0
|
|
0xFFFCDFFF, // 200152C4
|
|
0xFFFFFFFF, // 200152C8
|
|
0xFDFFFFFF, // 200152CC
|
|
0xFFFFFFFF, // 200152D0
|
|
0xF7FFFFFF, // 200152D4
|
|
0x6FFFFFFF, // 200152D8
|
|
0xFF7FFFFF, // 200152DC
|
|
0xDFFFFFFF, // 200152E0
|
|
0xFFFFFF7F, // 200152E4
|
|
0xFFFFFFFF, // 200152E8
|
|
0xFFFFFFE7, // 200152EC
|
|
0xFFFFFFFF, // 200152F0
|
|
0xFFCFFFFF, // 200152F4
|
|
0x8FFFFFFF, // 200152F8
|
|
0xFFFFFFFF, // 200152FC
|
|
0x0001FFFF, // 20015300
|
|
0x00000000, //
|
|
|
|
0x7FFFFFFF, // 20015308
|
|
0xFFFFFFFC, // 2001530C
|
|
0xFFFCFFFF, // 20015310
|
|
0x7E7FF9E7, // 20015314
|
|
0xFF9C7EF7, // 20015318
|
|
0xFFFFFFFF, // 2001531C
|
|
0xFFFFFEFF, // 20015320
|
|
0xF8E3E6FF, // 20015324
|
|
0xFFFFFFFF, // 20015328
|
|
0xFEFFFFF7, // 2001532C
|
|
0xFF3CFFFF, // 20015330
|
|
0x081FFFFF, // 20015334
|
|
0xDFFFFFFC, // 20015338
|
|
0xFFE7FFFF, // 2001533C
|
|
0x39FFDFFF, // 20015340
|
|
0xFFFFC090, // 20015344
|
|
0xF9FFFFFF, // 20015348
|
|
0xFFFFFFFF, // 2001534C
|
|
0xFE3FFFFF, // 20015350
|
|
0x1FF39FBF, // 20015354
|
|
0xFFFFFE00, // 20015358
|
|
0xBFFFFFFF, // 2001535C
|
|
0x000007FF, // 10015360
|
|
0x00000000, //
|
|
};
|
|
#endregion
|
|
for (int i = 0; i < payload.Length; i++)
|
|
Array.Copy(BitConverter.GetBytes(payload[i]), 0, sav, Main.SaveGame.PokeDex + 68 + 4 * i, 4);
|
|
}
|
|
|
|
// Language Writing
|
|
for (int i = 0; i < 0x9D; i++)
|
|
Array.Copy(BitConverter.GetBytes(0xFFFFFFFF), 0, sav, Main.SaveGame.PokeDexLanguageFlags + 4 * i, 4);
|
|
Array.Copy(BitConverter.GetBytes(0x007FFFFF), 0, sav, Main.SaveGame.PokeDexLanguageFlags + 4 * 0x9D, 4);
|
|
|
|
// Encounter Count Writing (999*all species)
|
|
for (int i = 0; i < 0x2D1; i++)
|
|
Array.Copy(BitConverter.GetBytes(999), 0, sav, Main.SaveGame.EncounterCount + i * 2, 2);
|
|
|
|
// Turn off Italian Petlil
|
|
sav[Main.SaveGame.PokeDexLanguageFlags + 0x1DF] &= 0xFE;
|
|
|
|
// Forms Bool Writing
|
|
for (int i = 0; i < 0x9C; i++)
|
|
sav[Main.SaveGame.PokeDex + 0x364 + i] = 0xFF;
|
|
sav[Main.SaveGame.PokeDex + 0x3FF] = 0x8F; // make sure we don't have FF because CGSE may screw up.
|
|
|
|
// Fetch the dex bools
|
|
getBools();
|
|
|
|
// Reload the current entry
|
|
loadchks();
|
|
}
|
|
|
|
private void changeEncounteredCount(object sender, EventArgs e)
|
|
{
|
|
if (!editing)
|
|
Array.Copy(BitConverter.GetBytes(Math.Min(0xFFFF, Util.ToUInt32(MT_Count))), 0, sav, Main.SaveGame.EncounterCount + (Util.getIndex(CB_Species) - 1) * 2, 2);
|
|
}
|
|
}
|
|
}
|