Merge branch 'master'

This commit is contained in:
Evan Dixon
2016-09-11 21:49:20 -05:00
86 changed files with 10216 additions and 2038 deletions

6
.gitignore vendored
View File

@@ -241,3 +241,9 @@ pip-log.txt
# Mr Developer
.mr.developer.cfg
#################
## MonoDevelop
#################
*.userprefs

View File

@@ -175,8 +175,10 @@ private LegalityCheck verifyEVs()
{
var evs = pk6.EVs;
int sum = evs.Sum();
if (pk6.IsEgg && sum > 0)
return new LegalityCheck(Severity.Invalid, "Eggs cannot receive EVs.");
if (sum == 0 && pk6.Stat_Level - pk6.Met_Level > 0)
return new LegalityCheck(Severity.Fishy, "All EVs are zero, but leveled above Met Level");
return new LegalityCheck(Severity.Fishy, "All EVs are zero, but leveled above Met Level.");
if (sum == 508)
return new LegalityCheck(Severity.Fishy, "2 EVs remaining.");
if (sum > 510)
@@ -349,6 +351,8 @@ private LegalityCheck verifyLevel()
return new LegalityCheck(Severity.Invalid, "Met Level does not match Wonder Card level.");
int lvl = pk6.CurrentLevel;
if (lvl > 1 && pk6.IsEgg)
return new LegalityCheck(Severity.Invalid, "Current level for an egg is invalid.");
if (lvl < pk6.Met_Level)
return new LegalityCheck(Severity.Invalid, "Current level is below met level.");
if ((pk6.WasEgg || EncounterMatch == null) && !Legal.getEvolutionValid(pk6) && pk6.Species != 350)
@@ -365,6 +369,28 @@ private LegalityCheck verifyRibbons()
List<string> missingRibbons = new List<string>();
List<string> invalidRibbons = new List<string>();
if (pk6.IsEgg)
{
var RibbonNames = ReflectUtil.getPropertiesStartWithPrefix(pk6.GetType(), "Ribbon");
foreach (object RibbonValue in RibbonNames.Select(RibbonName => ReflectUtil.GetValue(pk6, RibbonName)))
{
if ((RibbonValue as int?) > 0)
return new LegalityCheck(Severity.Invalid, "Eggs should not have ribbons.");
if (RibbonValue as bool? == true)
return new LegalityCheck(Severity.Invalid, "Eggs should not have ribbons.");
}
var DistNames = ReflectUtil.getPropertiesStartWithPrefix(pk6.GetType(), "DistSuperTrain");
if (DistNames.Select(MissionName => ReflectUtil.GetValue(pk6, MissionName)).Any(Flag => Flag as bool? == true))
return new LegalityCheck(Severity.Invalid, "Distribution Super Training missions on Egg.");
var TrainNames = ReflectUtil.getPropertiesStartWithPrefix(pk6.GetType(), "SuperTrain");
if (TrainNames.Select(MissionName => ReflectUtil.GetValue(pk6, MissionName)).Any(Flag => Flag as bool? == true))
return new LegalityCheck(Severity.Fishy, "Super Training missions on Egg.");
return new LegalityCheck();
}
// Check Event Ribbons
bool[] EventRib =
@@ -420,7 +446,13 @@ private LegalityCheck verifyRibbons()
invalidRibbons.Add("Battle Memory"); // Gen3/4 Battle
if (missingRibbons.Count + invalidRibbons.Count == 0)
{
var DistNames = ReflectUtil.getPropertiesStartWithPrefix(pk6.GetType(), "DistSuperTrain");
if (DistNames.Select(MissionName => ReflectUtil.GetValue(pk6, MissionName)).Any(Flag => Flag as bool? == true))
return new LegalityCheck(Severity.Fishy, "Distribution Super Training missions are not released.");
return new LegalityCheck(Severity.Valid, "All ribbons accounted for.");
}
string[] result = new string[2];
if (missingRibbons.Count > 0)
@@ -820,6 +852,14 @@ private LegalityCheck verifyForm()
}
private LegalityCheck verifyMisc()
{
if (pk6.IsEgg)
{
if (new[] { pk6.Move1_PPUps, pk6.Move2_PPUps, pk6.Move3_PPUps, pk6.Move4_PPUps }.Any(ppup => ppup > 0))
return new LegalityCheck(Severity.Invalid, "Cannot apply PP Ups to an Egg.");
if (pk6.CNTs.Any(stat => stat > 0))
return new LegalityCheck(Severity.Invalid, "Cannot increase Contest Stats of an Egg.");
}
if (pk6.Gen6 && Encounter.Valid && EncounterType == typeof(WC6) ^ pk6.FatefulEncounter)
{
if (EncounterType == typeof(EncounterStatic) && pk6.Species == 386) // Deoxys Matched @ Sky Pillar

View File

@@ -840,6 +840,9 @@ public static partial class Legal
};
internal static readonly int[] Ban_Gen3Ball =
{
387, 390, 393, //1 - Turtwig, Chimchar, Piplup
388, 391, 394, //2
389, 392, 395, //3
495, 498, 501, //1 - Snivy, Tepig, Oshawott
496, 499, 502, //2
497, 500, 503, //3
@@ -850,6 +853,9 @@ public static partial class Legal
152, 155, 158, //1 - Chikorita, Cyndaquil, Totodile
153, 156, 159, //2
154, 157, 160, //3
387, 390, 393, //1 - Turtwig, Chimchar, Piplup
388, 391, 394, //2
389, 392, 395, //3
495, 498, 501, //1 - Snivy, Tepig, Oshawott
496, 499, 502, //2
497, 500, 503, //3

28
PKHeX/Legality/Tables1.cs Normal file
View File

@@ -0,0 +1,28 @@
using System.Linq;
namespace PKHeX
{
public static partial class Legal
{
// PKHeX Valid Array Storage
internal static readonly ushort[] Pouch_Items_RBY = Enumerable.Range(0, 7) // 0-6
.Concat(Enumerable.Range(10, 11)) // 10-20
.Concat(Enumerable.Range(29, 15)) // 29-43
.Concat(Enumerable.Range(45, 5)) // 45-49
.Concat(Enumerable.Range(51, 8)) // 51-58
.Concat(Enumerable.Range(60, 24)) // 60-83
.Concat(Enumerable.Range(196, 54)) // 196-249
.Select(i => (ushort)i).ToArray();
internal static readonly int[] MovePP_RBY =
{
0,
35, 25, 10, 15, 20, 20, 15, 15, 15, 35, 30, 05, 10, 30, 30, 35, 35, 20, 15, 20, 20, 10, 20, 30, 05, 25, 15, 15, 15, 25, 20, 05, 35, 15, 20, 20, 20, 15, 30, 35, 20, 20, 30, 25, 40, 20, 15, 20, 20, 20,
30, 25, 15, 30, 25, 05, 15, 10, 05, 20, 20, 20, 05, 35, 20, 25, 20, 20, 20, 15, 20, 10, 10, 40, 25, 10, 35, 30, 15, 20, 40, 10, 15, 30, 15, 20, 10, 15, 10, 05, 10, 10, 25, 10, 20, 40, 30, 30, 20, 20,
15, 10, 40, 15, 20, 30, 20, 20, 10, 40, 40, 30, 30, 30, 20, 30, 10, 10, 20, 05, 10, 30, 20, 20, 20, 05, 15, 10, 20, 15, 15, 35, 20, 15, 10, 20, 30, 15, 40, 20, 15, 10, 05, 10, 30, 10, 15, 20, 15, 40,
40, 10, 05, 15, 10, 10, 10, 15, 30, 30, 10, 10, 20, 10, 10, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00,
00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00,
00, 00, 00, 00, 00, 00
};
}
}

35
PKHeX/Legality/Tables2.cs Normal file
View File

@@ -0,0 +1,35 @@
using System.Linq;
namespace PKHeX
{
public static partial class Legal
{
// PKHeX Valid Array Storage
internal static readonly ushort[] Pouch_Items_GSC = {
3, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 51, 52, 53, 57, 60, 62, 63, 64, 65, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 117, 118, 119, 121, 122, 123, 124, 125, 126, 131, 132, 138, 139, 140, 143, 144, 146, 150, 151, 152, 156, 158, 163, 168, 169, 170, 172, 173, 174, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189
};
internal static readonly ushort[] Pouch_Ball_GSC = {
1, 2, 4, 5, 157, 159, 160, 161, 164, 165, 166, 167
};
internal static readonly ushort[] Pouch_Key_GS = {
7, 54, 55, 58, 59, 61, 66, 67, 68 , 69, 71, 127, 128, 130, 133, 134, 175, 178
};
internal static readonly ushort[] Pouch_Key_C = Pouch_Key_GS.Concat(new ushort[]{70, 115, 116, 129}).ToArray();
internal static readonly ushort[] Pouch_TMHM_GSC = {
191, 192, 193, 194, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249
};
internal static readonly ushort[] HeldItems_GSC = new ushort[1].Concat(Pouch_Items_GSC).Concat(Pouch_Ball_GSC).Concat(Pouch_TMHM_GSC).ToArray();
internal static readonly int[] MovePP_GSC =
{
00,
35, 25, 10, 15, 20, 20, 15, 15, 15, 35, 30, 05, 10, 30, 30, 35, 35, 20, 15, 20, 20, 10, 20, 30, 05, 25, 15, 15, 15, 25, 20, 05, 35, 15, 20, 20, 20, 15, 30, 35, 20, 20, 30, 25, 40, 20, 15, 20, 20, 20,
30, 25, 15, 30, 25, 05, 15, 10, 05, 20, 20, 20, 05, 35, 20, 25, 20, 20, 20, 15, 20, 10, 10, 40, 25, 10, 35, 30, 15, 20, 40, 10, 15, 30, 15, 20, 10, 15, 10, 05, 10, 10, 25, 10, 20, 40, 30, 30, 20, 20,
15, 10, 40, 15, 20, 30, 20, 20, 10, 40, 40, 30, 30, 30, 20, 30, 10, 10, 20, 05, 10, 30, 20, 20, 20, 05, 15, 10, 20, 15, 15, 35, 20, 15, 10, 20, 30, 15, 40, 20, 15, 10, 05, 10, 30, 10, 15, 20, 15, 40,
40, 10, 05, 15, 10, 10, 10, 15, 30, 30, 10, 10, 20, 10, 01, 01, 10, 10, 10, 05, 15, 25, 15, 10, 15, 30, 05, 40, 15, 10, 25, 10, 30, 10, 20, 10, 10, 10, 10, 10, 20, 05, 40, 05, 05, 15, 05, 10, 05, 15,
10, 05, 10, 20, 20, 40, 15, 10, 20, 20, 25, 05, 15, 10, 05, 20, 15, 20, 25, 20, 05, 30, 05, 10, 20, 40, 05, 20, 40, 20, 15, 35, 10, 05, 05, 05, 15, 05, 20, 05, 05, 15, 20, 10, 05, 05, 15, 15, 15, 15,
10, 00, 00, 00, 00
};
}
}

View File

@@ -7,7 +7,7 @@ public static partial class Legal
// PKHeX Valid Array Storage
#region RS
internal static readonly ushort[] Pouch_Items_RS = {
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 93, 94, 95, 96, 97, 98, 103, 104, 106, 107, 108, 109, 110, 111, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 254, 255, 256, 257, 258
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 93, 94, 95, 96, 97, 98, 103, 104, 106, 107, 108, 109, 110, 111, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 254, 255, 256, 257, 258
};
internal static readonly ushort[] Pouch_Key_RS = {
259, 260, 261, 262, 263, 264, 265, 266, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288

File diff suppressed because it is too large Load Diff

View File

@@ -67,8 +67,7 @@ public Main()
};
relearnPB = new[] { PB_WarnRelearn1, PB_WarnRelearn2, PB_WarnRelearn3, PB_WarnRelearn4 };
movePB = new[] { PB_WarnMove1, PB_WarnMove2, PB_WarnMove3, PB_WarnMove4 };
defaultControlWhite = CB_Species.BackColor;
defaultControlText = Label_Species.ForeColor;
Label_Species.ResetForeColor();
// Set up Language Selection
foreach (var cbItem in main_langlist)
@@ -78,7 +77,7 @@ public Main()
new ToolTip().SetToolTip(dragout, "PKM QuickSave");
// Box Drag & Drop
foreach (PictureBox pb in PAN_Box.Controls)
foreach (PictureBox pb in SlotPictureBoxes)
{
pb.AllowDrop = true; // The PictureBoxes have their own drag&drop event handlers (pbBoxSlot)
pb.GiveFeedback += (sender, e) => { e.UseDefaultCursors = false; };
@@ -173,15 +172,14 @@ public Main()
#region Important Variables
public static PKM pkm = new PK6(); // Tab Pokemon Data Storage
public static SaveFile SAV = new SAV6 { Game = (int)GameVersion.AS, OT = "PKHeX", TID = 12345, SID = 54321, Language = 2, Country = 49, SubRegion = 7, ConsoleRegion = 1 }; // Save File
public static Color defaultControlWhite, defaultControlText;
public static string eggname = "";
public static string curlanguage = "en";
public static string[] gendersymbols = { "♂", "♀", "-" };
public static string[] specieslist, movelist, itemlist, abilitylist, types, natures, forms,
memories, genloc, trainingbags, trainingstage, characteristics,
encountertypelist, gamelanguages, balllist, gamelist, pokeblocks, g3items = { };
public static string[] metRSEFRLG_00000 = { };
encountertypelist, gamelanguages, balllist, gamelist, pokeblocks, g3items, g2items, g1items = { };
public static string[] metGSC_00000, metRSEFRLG_00000 = { };
public static string[] metHGSS_00000, metHGSS_02000, metHGSS_03000 = { };
public static string[] metBW2_00000, metBW2_30000, metBW2_40000, metBW2_60000 = { };
public static string[] metXY_00000, metXY_30000, metXY_40000, metXY_60000 = { };
@@ -219,7 +217,7 @@ public Main()
public static string WorkingDirectory => Environment.CurrentDirectory;
public static string DatabasePath => Path.Combine(WorkingDirectory, "db");
private static string WC6DatabasePath => Path.Combine(WorkingDirectory, "wc6");
public static string WC6DatabasePath => Path.Combine(WorkingDirectory, "wc6");
private static string BackupPath => Path.Combine(WorkingDirectory, "bak");
private static string ThreadPath => @"https://projectpokemon.org/forums/showthread.php?36986";
private static string VersionPath => @"https://raw.githubusercontent.com/kwsch/PKHeX/master/PKHeX/Resources/text/version.txt";
@@ -338,6 +336,15 @@ private void mainMenuDatabase(object sender, EventArgs e)
Util.Alert("PKHeX's database was not found.",
$"Please dump all boxes from a save file, then ensure the '{DatabasePath}' folder exists.");
}
private void mainMenuMysteryDM(object sender, EventArgs e)
{
var z = Application.OpenForms.Cast<Form>().FirstOrDefault(form => form.GetType() == typeof(SAV_MysteryGiftDB)) as SAV_MysteryGiftDB;
if (z != null)
{ Util.CenterToForm(z, this); z.BringToFront(); return; }
new SAV_MysteryGiftDB(this).Show();
}
private void mainMenuUnicode(object sender, EventArgs e)
{
unicode = Menu_Unicode.Checked;
@@ -423,9 +430,12 @@ private void clickShowdownImportPK6(object sender, EventArgs e)
if (Set.Species < 0)
{ Util.Alert("Set data not found in clipboard."); return; }
if (DialogResult.Yes != Util.Prompt(MessageBoxButtons.YesNo, "Import this set?", Clipboard.GetText()))
if (DialogResult.Yes != Util.Prompt(MessageBoxButtons.YesNo, "Import this set?", Set.getText()))
{ return; }
if (Set.InvalidLines.Any())
Util.Alert("Invalid lines detected:", string.Join(Environment.NewLine, Set.InvalidLines));
// Set Species & Nickname
CB_Species.SelectedValue = Set.Species;
CHK_Nicknamed.Checked = Set.Nickname != null;
@@ -789,6 +799,8 @@ private void openSAV(byte[] input, string path)
private void loadSAV(SaveFile sav, string path)
{
PKM pk = preparePKM();
// clean fields
populateFields(SAV.BlankPKM);
SAV = sav;
if (path != null) // Actual save file
@@ -797,7 +809,7 @@ private void loadSAV(SaveFile sav, string path)
SAV.FileName = Path.GetExtension(path) == ".bak"
? Path.GetFileName(path).Split(new[] { " [" }, StringSplitOptions.None)[0]
: Path.GetFileName(path);
Text = "PKHeX - " + $"SAV{SAV.Generation}: {Path.GetFileNameWithoutExtension(Util.CleanFileName(SAV.BAKName))}"; // more descriptive
Text = $"PKH{(HaX ? "a" : "e")}X - " + $"SAV{SAV.Generation}: {Path.GetFileNameWithoutExtension(Util.CleanFileName(SAV.BAKName))}"; // more descriptive
// If backup folder exists, save a backup.
string backupName = Path.Combine(BackupPath, Util.CleanFileName(SAV.BAKName));
@@ -810,7 +822,7 @@ private void loadSAV(SaveFile sav, string path)
{
SAV.FilePath = null;
SAV.FileName = "Blank Save File";
Text = "PKHeX - " + $"SAV{SAV.Generation}: {SAV.FileName} [{SAV.OT} ({SAV.Version})]";
Text = $"PKH{(HaX ? "a" : "e")}X - " + $"SAV{SAV.Generation}: {SAV.FileName} [{SAV.OT} ({SAV.Version})]";
GB_SAVtools.Visible = false;
}
@@ -830,13 +842,29 @@ private void loadSAV(SaveFile sav, string path)
}
setPKXBoxes(); // Reload all of the PKX Windows
bool WindowTranslationRequired = false;
// Hide content if not present in game.
GB_SUBE.Visible = SAV.HasSUBE;
PB_Locked.Visible = SAV.HasBattleBox && SAV.BattleBoxLocked;
PAN_Box.Visible = CB_BoxSelect.Visible = B_BoxLeft.Visible = B_BoxRight.Visible = SAV.HasBox;
if (!SAV.HasBox && tabBoxMulti.TabPages.Contains(Tab_Box))
tabBoxMulti.TabPages.Remove(Tab_Box);
else if (SAV.HasBox && !tabBoxMulti.TabPages.Contains(Tab_Box))
{
tabBoxMulti.TabPages.Insert(0, Tab_Box);
WindowTranslationRequired = true;
}
Menu_LoadBoxes.Enabled = Menu_DumpBoxes.Enabled = Menu_Report.Enabled = Menu_Modify.Enabled = B_SaveBoxBin.Enabled = SAV.HasBox;
if (!SAV.HasDaycare && tabBoxMulti.TabPages.Contains(Tab_Other))
tabBoxMulti.TabPages.Remove(Tab_Other);
else if (SAV.HasDaycare && !tabBoxMulti.TabPages.Contains(Tab_Other))
{
tabBoxMulti.TabPages.Insert(tabBoxMulti.TabPages.IndexOf(Tab_PartyBattle) + 1, Tab_Other);
WindowTranslationRequired = true;
}
if (path != null) // Actual save file
{
PAN_BattleBox.Visible = L_BattleBox.Visible = L_ReadOnlyPBB.Visible = SAV.HasBattleBox;
@@ -853,10 +881,10 @@ private void loadSAV(SaveFile sav, string path)
B_OpenOPowers.Visible = SAV.HasOPower;
B_OpenPokedex.Visible = SAV.HasPokeDex;
B_OpenBerryField.Visible = SAV.HasBerryField && SAV.XY;
B_Pokeblocks.Visible = SAV.HasPokeBlock;
B_OpenPokeblocks.Visible = SAV.HasPokeBlock;
B_JPEG.Visible = SAV.HasJPEG;
B_OpenEventFlags.Visible = SAV.HasEvents;
B_LinkInfo.Visible = SAV.HasLink;
B_OpenLinkInfo.Visible = SAV.HasLink;
B_CGearSkin.Visible = SAV.Generation == 5;
}
@@ -864,8 +892,7 @@ private void loadSAV(SaveFile sav, string path)
byte[] extraBytes = new byte[1];
Tip1.RemoveAll(); Tip2.RemoveAll(); Tip3.RemoveAll(); // TSV/PSV
CB_Country.Visible = CB_SubRegion.Visible = CB_3DSReg.Visible =
Label_Country.Visible = Label_SubRegion.Visible = Label_3DSRegion.Visible = SAV.Generation >= 6;
FLP_Country.Visible = FLP_SubRegion.Visible = FLP_3DSRegion.Visible = SAV.Generation >= 6;
Label_EncryptionConstant.Visible = BTN_RerollEC.Visible = TB_EC.Visible = SAV.Generation >= 6;
GB_nOT.Visible = GB_RelearnMoves.Visible = BTN_Medals.Visible = BTN_History.Visible = SAV.Generation >= 6;
PB_Legal.Visible = PB_WarnMove1.Visible = PB_WarnMove2.Visible = PB_WarnMove3.Visible = PB_WarnMove4.Visible = SAV.Generation >= 6;
@@ -873,77 +900,93 @@ private void loadSAV(SaveFile sav, string path)
PB_MarkPentagon.Visible = SAV.Generation == 6;
TB_GameSync.Visible = TB_Secure1.Visible = TB_Secure2.Visible = L_GameSync.Visible = L_Secure1.Visible = L_Secure2.Visible = SAV.Exportable && SAV.Generation == 6;
CB_Form.Visible = Label_Form.Visible = CHK_AsEgg.Visible = GB_EggConditions.Visible =
Label_MetDate.Visible = CAL_MetDate.Visible = PB_Mark5.Visible = PB_Mark6.Visible = SAV.Generation >= 4;
FLP_NSparkle.Visible = L_NSparkle.Visible = CHK_NSparkle.Visible = SAV.Generation == 5;
CB_Form.Visible = Label_Form.Visible = CHK_AsEgg.Visible = GB_EggConditions.Visible = PB_Mark5.Visible = PB_Mark6.Visible = SAV.Generation >= 4;
BTN_Ribbons.Visible = SAV.Generation >= 3;
DEV_Ability.Enabled = DEV_Ability.Visible = SAV.Generation > 3 && HaX;
TB_AbilityNumber.Visible = SAV.Generation >= 6 && DEV_Ability.Enabled;
CB_Ability.Visible = !DEV_Ability.Enabled && SAV.Generation >= 3;
FLP_Nature.Visible = SAV.Generation >= 3;
FLP_Ability.Visible = SAV.Generation >= 3;
FLP_Language.Visible = SAV.Generation >= 3;
GB_ExtraBytes.Visible = GB_ExtraBytes.Enabled = SAV.Generation >= 3;
GB_Markings.Visible = SAV.Generation >= 3;
BTN_Ribbons.Visible = SAV.Generation >= 3;
CB_HPType.Enabled = CB_Form.Enabled = SAV.Generation >= 3;
BTN_RerollPID.Visible = Label_PID.Visible = TB_PID.Visible = Label_SID.Visible = TB_SID.Visible = SAV.Generation >= 3;
GB_ExtraBytes.Visible = SAV.Generation > 1;
GB_Markings.Visible = SAV.Generation > 2;
FLP_FriendshipForm.Visible = SAV.Generation >= 2;
FLP_HeldItem.Visible = SAV.Generation >= 2;
CHK_IsEgg.Visible = Label_Gender.Visible = SAV.Generation >= 2;
FLP_PKRS.Visible = FLP_EggPKRSRight.Visible = SAV.Generation >= 2;
Label_OTGender.Visible = SAV.Generation >= 2;
Label_HeldItem.Visible = CB_HeldItem.Visible = SAV.Generation > 1;
Label_Total.Visible = TB_IVTotal.Visible = TB_EVTotal.Visible = L_Potential.Visible =
Label_HiddenPowerPrefix.Visible = CB_HPType.Visible = SAV.Generation > 1;
Label_CharacteristicPrefix.Visible = L_Characteristic.Visible = SAV.Generation > 1;
Label_ContestStats.Visible = Label_Cool.Visible = Label_Tough.Visible = Label_Smart.Visible =
Label_Sheen.Visible = Label_Beauty.Visible = Label_Cute.Visible = TB_Cool.Visible = TB_Tough.Visible =
TB_Smart.Visible = TB_Sheen.Visible = TB_Beauty.Visible = TB_Cute.Visible = Label_Nature.Visible =
CB_Nature.Visible = Label_Language.Visible = CB_Language.Visible = Label_Ability.Visible =
Label_Friendship.Visible = Label_HatchCounter.Visible = TB_Friendship.Visible = BTN_RerollPID.Visible =
Label_PID.Visible = TB_PID.Visible = Label_SID.Visible = TB_SID.Visible = SAV.Generation >= 3;
if (SAV.Generation == 1)
Label_IsShiny.Visible = false;
// HaX override, needs to be after DEV_Ability enabled assignment.
TB_AbilityNumber.Visible = SAV.Generation >= 6 && DEV_Ability.Enabled;
// Met Tab
CHK_Fateful.Visible = Label_OriginGame.Visible = Label_Ball.Visible = Label_MetLevel.Visible =
CB_MetLocation.Visible = Label_MetLocation.Visible = SAV.Generation > 2 || (SAV.Version == GameVersion.GSC);
CB_GameOrigin.Visible = CB_Ball.Visible = TB_MetLevel.Visible = SAV.Generation > 2;
FLP_MetDate.Visible = SAV.Generation >= 4;
FLP_Fateful.Visible = FLP_Ball.Visible = FLP_OriginGame.Visible = SAV.Generation >= 3;
FLP_MetLocation.Visible = FLP_MetLevel.Visible = SAV.Generation >= 2;
FLP_TimeOfDay.Visible = SAV.Generation == 2;
CHK_Infected.Visible = CHK_Cured.Visible = SAV.Generation >= 3;
// Stats
FLP_StatsTotal.Visible = SAV.Generation >= 3;
FLP_Characteristic.Visible = SAV.Generation >= 3;
FLP_HPType.Visible = SAV.Generation >= 2;
PAN_Contest.Visible = SAV.Generation >= 3;
// Second daycare slot
SlotPictureBoxes[43].Visible = SAV.Generation > 1;
SlotPictureBoxes[43].Visible = SAV.Generation >= 2;
CHK_IsEgg.Visible = Label_Gender.Visible = SAV.Generation > 1;
Label_OTGender.Visible = SAV.Generation > 1;
if (1 <= sav.Generation && sav.Generation <= 2)
if (sav.Generation == 1)
{
Label_SPD.Visible = TB_SPDEV.Visible = TB_SPDIV.Visible = Stat_SPD.Visible = false;
Label_SPA.Text = "Spc";
TB_HPIV.ReadOnly = true;
FLP_SpD.Visible = false;
Label_SPA.Visible = false;
Label_SPC.Visible = true;
TB_HPIV.Enabled = false;
MaskedTextBox[] evControls = { TB_SPAEV, TB_HPEV, TB_ATKEV, TB_DEFEV, TB_SPEEV, TB_SPDEV };
foreach (var ctrl in evControls)
{
ctrl.Mask = "00000";
ctrl.Size = new Size(37, 20);
ctrl.Size = Stat_HP.Size;
}
}
else if (sav.Generation == 2)
{
FLP_SpD.Visible = true;
Label_SPA.Visible = true;
Label_SPC.Visible = false;
TB_SPDEV.Enabled = TB_SPDIV.Enabled = false;
TB_HPIV.Enabled = false;
MaskedTextBox[] evControls = { TB_SPAEV, TB_HPEV, TB_ATKEV, TB_DEFEV, TB_SPEEV, TB_SPDEV };
foreach (var ctrl in evControls)
{
ctrl.Mask = "00000";
ctrl.Size = Stat_HP.Size;
}
Control[] statControls = {Stat_HP, Stat_ATK, Stat_DEF, Stat_SPA, Stat_SPD, Stat_SPE};
foreach (Control ctrl in statControls)
ctrl.Location = new Point(173, ctrl.Location.Y);
Label_Stats.Location = new Point(168, Label_Stats.Location.Y);
}
else
{
Label_SPD.Visible = TB_SPDEV.Visible = TB_SPDIV.Visible = Stat_SPD.Visible = true;
Label_SPA.Text = "SpA";
TB_HPIV.ReadOnly = false;
FLP_SpD.Visible = true;
Label_SPA.Visible = true;
Label_SPC.Visible = false;
TB_SPDEV.Enabled = TB_SPDIV.Enabled = true;
TB_HPIV.Enabled = true;
MaskedTextBox[] evControls = { TB_SPAEV, TB_HPEV, TB_ATKEV, TB_DEFEV, TB_SPEEV, TB_SPDEV };
foreach (var ctrl in evControls)
{
ctrl.Mask = "000";
ctrl.Size = new Size(31, 20);
ctrl.Size = TB_ExtraByte.Size;
}
Control[] statControls = { Stat_HP, Stat_ATK, Stat_DEF, Stat_SPA, Stat_SPD, Stat_SPE };
foreach (Control ctrl in statControls)
ctrl.Location = new Point(167, ctrl.Location.Y);
Label_Stats.Location = new Point(162, Label_Stats.Location.Y);
}
// Recenter PKM SubEditors
FLP_PKMEditors.Location = new Point((tabMain.TabPages[4].Width - FLP_PKMEditors.Width) / 2, FLP_PKMEditors.Location.Y);
FLP_PKMEditors.Location = new Point((Tab_OTMisc.Width - FLP_PKMEditors.Width) / 2, FLP_PKMEditors.Location.Y);
switch (SAV.Generation)
{
@@ -952,6 +995,11 @@ private void loadSAV(SaveFile sav, string path)
getPKMfromFields = preparePK1;
extraBytes = new byte[] {};
break;
case 2:
getFieldsfromPKM = populateFieldsPK2;
getPKMfromFields = preparePK2;
extraBytes = new byte[] { };
break;
case 3:
getFieldsfromPKM = populateFieldsPK3;
getPKMfromFields = preparePK3;
@@ -979,9 +1027,10 @@ private void loadSAV(SaveFile sav, string path)
break;
}
bool init = fieldsInitialized;
fieldsInitialized = false;
fieldsInitialized = fieldsLoaded = false;
pkm = (pkm.Format != SAV.Generation || SAV.Generation < 3) ? SAV.BlankPKM : pk;
populateFilteredDataSources();
populateFields((pkm.Format != SAV.Generation || SAV.Generation == 1) ? SAV.BlankPKM : pk);
populateFields(pkm);
fieldsInitialized |= init;
// SAV Specific Limits
@@ -989,12 +1038,21 @@ private void loadSAV(SaveFile sav, string path)
TB_OTt2.MaxLength = SAV.OTLength;
TB_Nickname.MaxLength = SAV.NickLength;
// Hide Unused Tabs
if (SAV.Generation == 1 && tabMain.TabPages.Contains(Tab_Met))
tabMain.TabPages.Remove(Tab_Met);
else if (SAV.Generation != 1 && !tabMain.TabPages.Contains(Tab_Met))
{
tabMain.TabPages.Insert(1, Tab_Met);
WindowTranslationRequired = true;
}
// Common HaX Interface
CHK_HackedStats.Enabled = CHK_HackedStats.Visible = MT_Level.Enabled = MT_Level.Visible = MT_Form.Enabled = MT_Form.Visible = HaX;
TB_Level.Visible = !HaX;
// Load Extra Byte List
if (GB_ExtraBytes.Visible)
if (GB_ExtraBytes.Enabled)
{
CB_ExtraBytes.Items.Clear();
foreach (byte b in extraBytes)
@@ -1002,9 +1060,16 @@ private void loadSAV(SaveFile sav, string path)
CB_ExtraBytes.SelectedIndex = 0;
}
// pk2 save files do not have an Origin Game stored. Prompt the met location list to update.
if (SAV.Generation == 2)
updateOriginGame(null, null);
// Refresh PK#->PK6 conversion info
PKMConverter.updateConfig(SAV.SubRegion, SAV.Country, SAV.ConsoleRegion, SAV.OT, SAV.Gender);
if (WindowTranslationRequired) // force update -- re-added controls may be untranslated
Util.TranslateInterface(this, curlanguage);
// Indicate audibly the save is loaded
SystemSounds.Beep.Play();
}
@@ -1022,7 +1087,7 @@ private static void refreshWC6DB()
for (int i = 0; i < wc6full.Length; i += WC6.SizeFull)
{
byte[] data = new byte[WC6.SizeFull];
Array.Copy(wc6bin, i, data, 0, WC6.SizeFull);
Array.Copy(wc6full, i, data, 0, WC6.SizeFull);
wc6db.Add(new WC6(data));
}
@@ -1046,7 +1111,7 @@ private void changeMainLanguage(object sender, EventArgs e)
InitializeLanguage();
Util.TranslateInterface(this, lang_val[CB_MainLanguage.SelectedIndex]); // Translate the UI to language.
// Recenter PKM SubEditors
FLP_PKMEditors.Location = new Point((tabMain.TabPages[4].Width - FLP_PKMEditors.Width)/2, FLP_PKMEditors.Location.Y);
FLP_PKMEditors.Location = new Point((Tab_OTMisc.Width - FLP_PKMEditors.Width)/2, FLP_PKMEditors.Location.Y);
populateFields(pk); // put data back in form
fieldsInitialized |= alreadyInit;
@@ -1059,12 +1124,16 @@ private void InitializeStrings()
if (CB_MainLanguage.SelectedIndex < 8)
curlanguage = lang_val[CB_MainLanguage.SelectedIndex];
string l = curlanguage;
// Past Generation strings
g3items = Util.getStringList("ItemsG3", "en");
metRSEFRLG_00000 = Util.getStringList("rsefrlg_00000", "en");
g3items = Util.getStringListFallback("ItemsG3", l, "en");
g2items = Util.getStringListFallback("ItemsG2", l, "en");
g1items = Util.getStringListFallback("ItemsG1", l, "en");
metRSEFRLG_00000 = Util.getStringListFallback("rsefrlg_00000", l, "en");
metGSC_00000 = Util.getStringListFallback("gsc_00000", l, "en");
// Current Generation strings
string l = curlanguage;
natures = Util.getStringList("natures", l);
types = Util.getStringList("types", l);
abilitylist = Util.getAbilitiesList(l);
@@ -1092,7 +1161,14 @@ private void InitializeStrings()
puffs = Util.getStringList("puff", l);
}
// Gen4 Mail names not stored in future games. No clever solution like for HM's, so improvise.
for (int i = 137; i <= 148; i++)
itemlist[i] = $"Mail #{i-137+1} (G4)";
// Fix Item Names (Duplicate entries)
int len = itemlist[425].Length;
itemlist[426] = itemlist[425].Substring(0, len-1) + (char)(itemlist[425][len-1]+1) + " (G4)";
itemlist[427] = itemlist[425].Substring(0, len-1) + (char)(itemlist[425][len-1]+2) + " (G4)";
itemlist[456] += " (HG/SS)"; // S.S. Ticket
itemlist[736] += " (OR/AS)"; // S.S. Ticket
itemlist[463] += " (DPPt)"; // Storage Key
@@ -1226,9 +1302,9 @@ private void InitializeLanguage()
#region Met Locations
// Gen 2
{
var met_list = Util.getCBList(metRSEFRLG_00000, Enumerable.Range(0, 0x5F).ToArray());
met_list = Util.getOffsetCBList(met_list, metRSEFRLG_00000, 00000, new[] { 253, 254, 255 });
metGen2 = null;
var met_list = Util.getCBList(metGSC_00000, Enumerable.Range(0, 0x5F).ToArray());
met_list = Util.getOffsetCBList(met_list, metGSC_00000, 00000, new[] { 0x7E, 0x7F });
metGen2 = met_list;
}
// Gen 3
{
@@ -1284,6 +1360,8 @@ private void populateFilteredDataSources()
string[] items = itemlist;
if (SAV.Generation == 3)
items = g3items;
if (SAV.Generation == 2)
items = g2items;
ItemDataSource = Util.getCBList(items, (HaX ? Enumerable.Range(0, SAV.MaxItemID) : SAV.HeldItems.Select(i => (int)i)).ToArray());
CB_HeldItem.DataSource = new BindingSource(ItemDataSource.Where(i => i.Value <= SAV.MaxItemID).ToList(), null);
@@ -1307,9 +1385,10 @@ private void populateFilteredDataSources()
public void populateFields(PKM pk, bool focus = true)
{
if (pk == null) { Util.Error("Attempted to load a null file."); return; }
if (pk.Format > SAV.Generation)
{ Util.Alert("Can't load future generation files."); return; }
if ((pk.Format >= 3 && pk.Format > SAV.Generation) // pk3-7, can't go backwards
|| (pk.Format <= 2 && SAV.Generation > 2 && SAV.Generation < 7)) // pk1-2, can't go 3-6
{ Util.Alert($"Can't load Gen{pk.Format} to Gen{SAV.Generation} games."); return; }
bool oldInit = fieldsInitialized;
fieldsInitialized = fieldsLoaded = false;
@@ -1329,7 +1408,8 @@ public void populateFields(PKM pk, bool focus = true)
Util.Alert("Converted File.");
}
getFieldsfromPKM();
try { getFieldsfromPKM(); }
catch { fieldsInitialized = oldInit; throw; }
CB_EncounterType.Visible = Label_EncounterType.Visible = pkm.Gen4;
fieldsInitialized = oldInit;
@@ -1353,6 +1433,9 @@ public void populateFields(PKM pk, bool focus = true)
}
fieldsLoaded = true;
Label_HatchCounter.Visible = CHK_IsEgg.Checked && SAV.Generation > 1;
Label_Friendship.Visible = !CHK_IsEgg.Checked && SAV.Generation > 1;
// Set the Preview Box
dragout.Image = pk.Sprite;
updateLegality();
@@ -1382,6 +1465,11 @@ private void setForms()
bool hasForms = SAV.Personal[species].HasFormes || new[] { 201, 664, 665, 414 }.Contains(species);
CB_Form.Enabled = CB_Form.Visible = Label_Form.Visible = hasForms;
if (SAV.Generation == 2)
CB_Form.Enabled = false;
if (HaX)
Label_Form.Visible = true;
if (!hasForms)
return;
@@ -1399,7 +1487,7 @@ private void setAbilityList()
formnum = CB_Form.SelectedIndex;
int[] abils = SAV.Personal.getAbilities(species, formnum);
if (abils[1] == 0)
if (abils[1] == 0 && SAV.Generation != 3)
abils[1] = abils[0];
string[] abilIdentifier = {" (1)", " (2)", " (H)"};
List<string> ability_list = abils.Where(a => a != 0).Select((t, i) => abilitylist[t] + abilIdentifier[i]).ToList();
@@ -1423,7 +1511,7 @@ private void setIsShiny(object sender)
bool isShiny = pkm.IsShiny;
// Set the Controls
BTN_Shinytize.Visible = BTN_Shinytize.Enabled = !isShiny && SAV.Generation > 2;
BTN_Shinytize.Visible = BTN_Shinytize.Enabled = !isShiny && SAV.Generation > 1;
Label_IsShiny.Visible = isShiny && SAV.Generation > 1;
// Refresh Markings (for Shiny Star if applicable)
@@ -1539,32 +1627,40 @@ private void clickStatLabel(object sender, MouseEventArgs e)
if (!(ModifierKeys == Keys.Control || ModifierKeys == Keys.Alt))
return;
if (sender == Label_SPC)
sender = Label_SPA;
int index = Array.IndexOf(new[] { Label_HP, Label_ATK, Label_DEF, Label_SPA, Label_SPD, Label_SPE }, sender);
if (ModifierKeys == Keys.Alt) // EV
{
var arrayEV = new[] {TB_HPEV, TB_ATKEV, TB_DEFEV, TB_SPAEV, TB_SPDEV, TB_SPEEV};
arrayEV[index].Text = (e.Button == MouseButtons.Left
? Math.Min(Math.Max(510 - Util.ToInt32(TB_EVTotal.Text) + Util.ToInt32(arrayEV[index].Text), 0), 252)
: 0).ToString();
var mt = new[] {TB_HPEV, TB_ATKEV, TB_DEFEV, TB_SPAEV, TB_SPDEV, TB_SPEEV}[index];
if (e.Button == MouseButtons.Left) // max
mt.Text = SAV.Generation >= 3
? Math.Min(Math.Max(510 - Util.ToInt32(TB_EVTotal.Text) + Util.ToInt32(mt.Text), 0), 252).ToString()
: ushort.MaxValue.ToString();
else // min
mt.Text = 0.ToString();
}
else
new[] {TB_HPIV, TB_ATKIV, TB_DEFIV, TB_SPAIV, TB_SPDIV, TB_SPEIV}[index].Text =
(e.Button == MouseButtons.Left ? 31 : 0).ToString();
(e.Button == MouseButtons.Left ? SAV.MaxIV : 0).ToString();
}
private void clickIV(object sender, EventArgs e)
{
if (ModifierKeys == Keys.Control)
((MaskedTextBox) sender).Text = 31.ToString();
((MaskedTextBox) sender).Text = SAV.MaxIV.ToString();
else if (ModifierKeys == Keys.Alt)
((MaskedTextBox) sender).Text = 0.ToString();
}
private void clickEV(object sender, EventArgs e)
{
MaskedTextBox mt = (MaskedTextBox)sender;
if (ModifierKeys == Keys.Control) // EV
((MaskedTextBox) sender).Text = Math.Min(Math.Max(510 - Util.ToInt32(TB_EVTotal.Text) + Util.ToInt32((sender as MaskedTextBox).Text), 0), 252).ToString();
mt.Text = SAV.Generation >= 3
? Math.Min(Math.Max(510 - Util.ToInt32(TB_EVTotal.Text) + Util.ToInt32(mt.Text), 0), 252).ToString()
: ushort.MaxValue.ToString();
else if (ModifierKeys == Keys.Alt)
((MaskedTextBox) sender).Text = 0.ToString();
mt.Text = 0.ToString();
}
private void clickOT(object sender, EventArgs e)
{
@@ -1719,7 +1815,18 @@ private void updateIVs(object sender, EventArgs e)
if (SAV.Generation < 3)
{
TB_HPIV.Text = pkm.IV_HP.ToString("00");
TB_HPIV.Text = pkm.IV_HP.ToString();
TB_SPDIV.Text = TB_SPAIV.Text;
if (SAV.Generation == 2)
{
Label_Gender.Text = gendersymbols[pkm.Gender];
Label_Gender.ForeColor = pkm.Gender == 2
? Label_Species.ForeColor
: (pkm.Gender == 1 ? Color.Red : Color.Blue);
CB_Form.SelectedIndex = pkm.AltForm;
setIsShiny(null);
getQuickFiller(dragout);
}
}
CB_HPType.SelectedValue = pkm.HPType;
@@ -1756,6 +1863,9 @@ private void updateEVs(object sender, EventArgs e)
else if (sender == TB_SPAEV) pkm.EV_SPA = Util.ToInt32(TB_SPAEV.Text);
else if (sender == TB_SPDEV) pkm.EV_SPD = Util.ToInt32(TB_SPDEV.Text);
if (SAV.Generation < 3)
TB_SPDEV.Text = TB_SPAEV.Text;
int evtotal = pkm.EVs.Sum();
if (evtotal > 510) // Background turns Red
@@ -2058,8 +2168,11 @@ private void updateSpecies(object sender, EventArgs e)
updateLegality();
}
private IEnumerable<ComboItem> getLocationList(GameVersion Version, int SaveFormat, bool egg)
private static List<ComboItem> getLocationList(GameVersion Version, int SaveFormat, bool egg)
{
if (SaveFormat == 2)
return metGen2;
if (egg)
{
if (Version < GameVersion.W && SaveFormat >= 5)
@@ -2076,33 +2189,33 @@ private IEnumerable<ComboItem> getLocationList(GameVersion Version, int SaveForm
case GameVersion.R:
case GameVersion.S:
if (SaveFormat == 3)
return metGen3.OrderByDescending(loc => loc.Value <= 87); // Ferry
return metGen3.OrderByDescending(loc => loc.Value <= 87).ToList(); // Ferry
break;
case GameVersion.E:
if (SaveFormat == 3)
return metGen3.OrderByDescending(loc => loc.Value <= 87 || (loc.Value >= 196 && loc.Value <= 212)); // Trainer Hill
return metGen3.OrderByDescending(loc => loc.Value <= 87 || (loc.Value >= 196 && loc.Value <= 212)).ToList(); // Trainer Hill
break;
case GameVersion.FR:
case GameVersion.LG:
if (SaveFormat == 3)
return metGen3.OrderByDescending(loc => loc.Value > 87 && loc.Value < 197); // Celadon Dept.
return metGen3.OrderByDescending(loc => loc.Value > 87 && loc.Value < 197).ToList(); // Celadon Dept.
break;
case GameVersion.D:
case GameVersion.P:
if (SaveFormat == 4 || (SaveFormat >= 5 && egg))
return metGen4.Take(4).Concat(metGen6.Skip(4).OrderByDescending(loc => loc.Value <= 111)); // Battle Park
return metGen4.Take(4).Concat(metGen4.Skip(4).OrderByDescending(loc => loc.Value <= 111)).ToList(); // Battle Park
break;
case GameVersion.Pt:
if (SaveFormat == 4 || (SaveFormat >= 5 && egg))
return metGen4.Take(4).Concat(metGen6.Skip(4).OrderByDescending(loc => loc.Value <= 125)); // Rock Peak Ruins
return metGen4.Take(4).Concat(metGen4.Skip(4).OrderByDescending(loc => loc.Value <= 125)).ToList(); // Rock Peak Ruins
break;
case GameVersion.HG:
case GameVersion.SS:
if (SaveFormat == 4 || (SaveFormat >= 5 && egg))
return metGen4.Take(4).Concat(metGen6.Skip(4).OrderByDescending(loc => loc.Value > 125 && loc.Value < 234)); // Celadon Dept.
return metGen4.Take(4).Concat(metGen4.Skip(4).OrderByDescending(loc => loc.Value > 125 && loc.Value < 234)).ToList(); // Celadon Dept.
break;
case GameVersion.B:
@@ -2111,27 +2224,27 @@ private IEnumerable<ComboItem> getLocationList(GameVersion Version, int SaveForm
case GameVersion.B2:
case GameVersion.W2:
return metGen5.Take(3).Concat(metGen5.Skip(3).OrderByDescending(loc => loc.Value <= 116)); // Abyssal Ruins
return metGen5.Take(3).Concat(metGen5.Skip(3).OrderByDescending(loc => loc.Value <= 116)).ToList(); // Abyssal Ruins
case GameVersion.X:
case GameVersion.Y:
return metGen6.Take(3).Concat(metGen6.Skip(3).OrderByDescending(loc => loc.Value <= 168)); // Unknown Dungeon
return metGen6.Take(3).Concat(metGen6.Skip(3).OrderByDescending(loc => loc.Value <= 168)).ToList(); // Unknown Dungeon
case GameVersion.OR:
case GameVersion.AS:
return metGen6.Take(3).Concat(metGen6.Skip(3).OrderByDescending(loc => loc.Value > 168 && loc.Value <= 354)); // Secret Base
return metGen6.Take(3).Concat(metGen6.Skip(3).OrderByDescending(loc => loc.Value > 168 && loc.Value <= 354)).ToList(); // Secret Base
}
// Currently on a future game, return corresponding list for generation
if (Version <= GameVersion.CXD && SaveFormat == 4)
return metGen4.Where(loc => loc.Value == 0x37) // Pal Park to front
.Concat(metGen4.Take(4))
.Concat(metGen4.Skip(4).Where(loc => loc.Value != 0x37));
.Concat(metGen4.Skip(4).Where(loc => loc.Value != 0x37)).ToList();
if (Version < GameVersion.X && SaveFormat >= 5) // PokéTransfer to front
return metGen5.Where(loc => loc.Value == 30001)
.Concat(metGen5.Take(3))
.Concat(metGen5.Skip(3).Where(loc => loc.Value != 30001));
.Concat(metGen5.Skip(3).Where(loc => loc.Value != 30001)).ToList();
return metGen6;
}
@@ -2204,7 +2317,7 @@ private void updateNatureModification(object sender, EventArgs e)
Label[] labarray = { Label_ATK, Label_DEF, Label_SPE, Label_SPA, Label_SPD };
// Reset Label Colors
foreach (Label label in labarray)
label.ForeColor = defaultControlText;
label.ResetForeColor();
// Set Colored StatLabels only if Nature isn't Neutral
NatureTip.SetToolTip(CB_Nature,
@@ -2234,9 +2347,14 @@ private void updateNickname(object sender, EventArgs e)
if (SAV.Generation < 5) // All caps GenIV and previous
nick = nick.ToUpper();
if (SAV.Generation < 3)
nick = nick.Replace(" ", "");
TB_Nickname.Text = nick;
if (SAV.Generation == 1)
((PK1)pkm).setNotNicknamed();
((PK1)pkm).setNotNicknamed();
if (SAV.Generation == 2)
((PK2)pkm).setNotNicknamed();
}
}
private void updateNicknameClick(object sender, MouseEventArgs e)
@@ -2268,6 +2386,8 @@ private void updateIsEgg(object sender, EventArgs e)
{
CHK_Nicknamed.Checked = false;
TB_Friendship.Text = "1";
if (SAV.Generation == 2)
pkm.IsEgg = true;
// If we are an egg, it won't have a met location.
CHK_AsEgg.Checked = true;
@@ -2281,6 +2401,9 @@ private void updateIsEgg(object sender, EventArgs e)
if (!CHK_Nicknamed.Checked)
updateNickname(null, null);
if (SAV.Generation == 2)
pkm.IsEgg = false;
TB_Friendship.Text = SAV.Personal[Util.getIndex(CB_Species)].BaseFriendship.ToString();
if (CB_EggLocation.SelectedIndex == 0)
@@ -2292,7 +2415,7 @@ private void updateIsEgg(object sender, EventArgs e)
}
// Display hatch counter if it is an egg, Display Friendship if it is not.
Label_HatchCounter.Visible = CHK_IsEgg.Checked && SAV.Generation > 1;
Label_Friendship.Visible = !CHK_IsEgg.Checked && SAV.Generation > 2;
Label_Friendship.Visible = !CHK_IsEgg.Checked && SAV.Generation > 1;
// Update image to (not) show egg.
@@ -2321,7 +2444,16 @@ private void updateShinyPID(object sender, EventArgs e)
pkm.AltForm = CB_Form.SelectedIndex;
pkm.Version = Util.getIndex(CB_GameOrigin);
pkm.setShinyPID();
if (pkm.Format > 2)
pkm.setShinyPID();
else
{
TB_ATKIV.Text = "15";
TB_DEFIV.Text = "10";
TB_SPEIV.Text = "10";
TB_SPAIV.Text = "10";
updateIVs(null, null);
}
TB_PID.Text = pkm.PID.ToString("X8");
if (pkm.GenNumber < 6 && TB_EC.Visible)
@@ -2378,9 +2510,12 @@ private void validateComboBox(object sender)
cb.SelectionLength = 0;
if (cb.Text == "")
{ cb.SelectedIndex = 0; return; }
cb.BackColor = cb.SelectedValue == null ? Color.DarkSalmon : defaultControlWhite;
if (cb.SelectedValue == null)
cb.BackColor = Color.DarkSalmon;
else
cb.ResetBackColor();
}
private void validateComboBox(object sender, EventArgs e)
private void validateComboBox(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!(sender is ComboBox))
return;
@@ -2394,7 +2529,7 @@ private void validateComboBox2(object sender, EventArgs e)
{
if (!fieldsInitialized)
return;
validateComboBox(sender, e);
validateComboBox(sender, null);
if (fieldsLoaded)
{
if (sender == CB_Ability && SAV.Generation >= 6)
@@ -2490,7 +2625,7 @@ private void updateStats()
Label[] labarray = { Label_ATK, Label_DEF, Label_SPE, Label_SPA, Label_SPD };
// Reset Label Colors
foreach (Label label in labarray)
label.ForeColor = defaultControlText;
label.ResetForeColor();
// Set Colored StatLabels only if Nature isn't Neutral
if (incr == decr) return;
@@ -2548,38 +2683,30 @@ public bool verifiedPKM()
if (ModifierKeys == (Keys.Control | Keys.Shift | Keys.Alt))
return true; // Override
// Make sure the PKX Fields are filled out properly (color check)
#region ComboBoxes to verify they are set.
ComboBox[] cba = {
CB_Species, CB_Nature, CB_HeldItem, CB_Ability, // Main Tab
CB_MetLocation, CB_EggLocation, CB_Ball, // Met Tab
CB_Move1, CB_Move2, CB_Move3, CB_Move4, // Moves
CB_RelearnMove1, CB_RelearnMove2, CB_RelearnMove3, CB_RelearnMove4 // Moves
};
for (int i = 0; i < cba.Length; i++)
{
int back = cba[i].BackColor.ToArgb();
if (!cba[i].Visible || back == SystemColors.Control.ToArgb() || back == 0 ||
!(back != -1 & back != defaultControlWhite.ToArgb())) continue;
if (i < 6) // Main Tab
tabMain.SelectedIndex = 0;
else if (i < 9) // Met Tab
tabMain.SelectedIndex = 1;
else // Moves
tabMain.SelectedIndex = 3;
goto invalid;
}
#endregion
// Further logic checking
if (SAV.Generation >= 3 && Convert.ToUInt32(TB_EVTotal.Text) > 510 && !CHK_HackedStats.Checked)
{ tabMain.SelectedIndex = 2; goto invalid; }
// If no errors detected...
if (Util.getIndex(CB_Species) != 0) return true;
// Else
tabMain.SelectedIndex = 0;
// else...
invalid:
{ SystemSounds.Exclamation.Play(); return false; }
ComboBox cb = cba.FirstOrDefault(c => c.BackColor == Color.DarkSalmon);
if (cb != null)
{
Control c = cb.Parent;
while (!(c is TabPage))
c = c.Parent;
tabMain.SelectedTab = c as TabPage;
}
else if (SAV.Generation >= 3 && Convert.ToUInt32(TB_EVTotal.Text) > 510 && !CHK_HackedStats.Checked)
tabMain.SelectedTab = Tab_Stats;
else if (Util.getIndex(CB_Species) == 0)
tabMain.SelectedTab = Tab_Main;
else
return true;
SystemSounds.Exclamation.Play();
return false;
}
public static string[] verifyPKMtoSAV(PKM pk)
{
@@ -2773,7 +2900,7 @@ private void clickBoxSort(object sender, EventArgs e)
return;
SAV.resetBoxes();
CB_BoxSelect.SelectedIndex = 0;
setPKXBoxes();
Util.Alert("Boxes cleared!");
}
else if (ModifierKeys == Keys.Alt)
@@ -2791,7 +2918,7 @@ private void clickBoxSort(object sender, EventArgs e)
return;
SAV.sortBoxes();
CB_BoxSelect.SelectedIndex = 0;
setPKXBoxes();
Util.Alert("Boxes sorted!");
}
else if (ModifierKeys == Keys.Control)
@@ -2922,7 +3049,7 @@ private void clickDelete(object sender, EventArgs e)
{ SAV.setStoredSlot(SAV.BlankPKM, getPKXOffset(slot)); }
else return;
SlotPictureBoxes[slot].Image = null;
getQuickFiller(SlotPictureBoxes[slot], SAV.BlankPKM);
getSlotColor(slot, Properties.Resources.slotDel);
}
private void clickClone(object sender, EventArgs e)
@@ -2959,7 +3086,7 @@ private void clickLegality(object sender, EventArgs e)
{ SystemSounds.Asterisk.Play(); return; }
if (typeof (PK6) != pk.GetType())
{
Util.Alert($"Checking legality of {pk.GetType()} files is not supported.");
Util.Alert($"Checking legality of {pk.GetType().Name} files is not supported.");
return;
}
showLegality(pk as PK6, slot < 0, ModifierKeys == Keys.Control);
@@ -3056,6 +3183,8 @@ private void updateIsNicknamed(object sender, EventArgs e)
if (SAV.Generation < 5) // All caps GenIV and previous
nick = nick.ToUpper();
if (SAV.Generation < 3)
nick = nick.Replace(" ", "");
if (TB_Nickname.Text != nick)
{
CHK_Nicknamed.Checked = true;
@@ -3307,7 +3436,7 @@ private void dumpBoxesToDB(string path, bool individualBoxFolders)
Directory.CreateDirectory(Path.Combine(path, boxfolder));
}
if (!File.Exists(Path.Combine(Path.Combine(path, boxfolder), fileName)))
File.WriteAllBytes(Path.Combine(Path.Combine(path, boxfolder), fileName), pk.Data.Take(SAV.SIZE_STORED).ToArray());
File.WriteAllBytes(Path.Combine(Path.Combine(path, boxfolder), fileName), pk.DecryptedBoxData);
}
}
private void loadBoxesFromDB(string path)
@@ -3462,7 +3591,7 @@ private void B_OpenPokedex_Click(object sender, EventArgs e)
new SAV_PokedexORAS().ShowDialog();
else if (SAV.XY)
new SAV_PokedexXY().ShowDialog();
else if (SAV.RBY)
else if (SAV.RBY || SAV.GSC)
new SAV_SimplePokedex().ShowDialog();
}
private void B_OUTPasserby_Click(object sender, EventArgs e)
@@ -3629,7 +3758,7 @@ private void pbBoxSlot_MouseMove(object sender, MouseEventArgs e)
getQuickFiller(pb, SAV.getStoredSlot(DragInfo.slotSourceOffset));
pb.BackgroundImage = null;
if (DragInfo.slotDestinationBoxNumber == DragInfo.slotSourceBoxNumber)
if (DragInfo.slotDestinationBoxNumber == DragInfo.slotSourceBoxNumber && DragInfo.slotDestinationSlotNumber > -1)
SlotPictureBoxes[DragInfo.slotDestinationSlotNumber].Image = img;
if (result == DragDropEffects.Copy) // viewed in tabs, apply 'view' highlight

File diff suppressed because it is too large Load Diff

View File

@@ -77,7 +77,10 @@ private PKM preparePK1()
pk1.EV_SPE = Util.ToInt32(TB_SPEEV.Text);
pk1.EV_SPC = Util.ToInt32(TB_SPAEV.Text);
pk1.Nickname = TB_Nickname.Text;
if (CHK_Nicknamed.Checked)
pk1.Nickname = TB_Nickname.Text;
else
pk1.setNotNicknamed();
pk1.Move1 = Util.getIndex(CB_Move1);
pk1.Move2 = Util.getIndex(CB_Move2);
pk1.Move3 = Util.getIndex(CB_Move3);

146
PKHeX/MainWindow/MainPK2.cs Normal file
View File

@@ -0,0 +1,146 @@
using System;
using System.Drawing;
namespace PKHeX
{
public partial class Main
{
private void populateFieldsPK2()
{
PK2 pk2 = pkm as PK2;
if (pk2 == null)
return;
// Do first
pk2.Stat_Level = PKX.getLevel(pk2.Species, pk2.EXP);
if (pk2.Stat_Level == 100)
pk2.EXP = PKX.getEXP(pk2.Stat_Level, pk2.Species);
CB_Species.SelectedValue = pk2.Species;
TB_Level.Text = pk2.Stat_Level.ToString();
TB_EXP.Text = pk2.EXP.ToString();
CB_HeldItem.SelectedValue = pk2.HeldItem;
CB_Form.SelectedIndex = pk2.AltForm;
CHK_IsEgg.Checked = pk2.IsEgg;
TB_Friendship.Text = pk2.CurrentFriendship.ToString();
TB_MetLevel.Text = pk2.Met_Level.ToString();
CB_MetLocation.SelectedValue = pk2.Met_Location;
CB_MetTimeOfDay.SelectedIndex = pk2.Met_TimeOfDay;
// Load rest
TB_TID.Text = pk2.TID.ToString("00000");
CHK_Nicknamed.Checked = pk2.IsNicknamed;
TB_Nickname.Text = pk2.Nickname;
TB_OT.Text = pk2.OT_Name;
GB_OT.BackgroundImage = null;
Label_OTGender.Text = gendersymbols[pk2.OT_Gender];
Label_OTGender.ForeColor = pk2.OT_Gender == 1 ? Color.Red : Color.Blue;
// Reset Label and ComboBox visibility, as well as non-data checked status.
Label_PKRS.Visible = false;
Label_PKRSdays.Visible = false;
TB_HPIV.Text = pk2.IV_HP.ToString();
TB_ATKIV.Text = pk2.IV_ATK.ToString();
TB_DEFIV.Text = pk2.IV_DEF.ToString();
TB_SPEIV.Text = pk2.IV_SPE.ToString();
TB_SPAIV.Text = pk2.IV_SPA.ToString();
TB_HPEV.Text = pk2.EV_HP.ToString();
TB_ATKEV.Text = pk2.EV_ATK.ToString();
TB_DEFEV.Text = pk2.EV_DEF.ToString();
TB_SPEEV.Text = pk2.EV_SPE.ToString();
TB_SPAEV.Text = pk2.EV_SPA.ToString();
CB_Move1.SelectedValue = pk2.Move1;
CB_Move2.SelectedValue = pk2.Move2;
CB_Move3.SelectedValue = pk2.Move3;
CB_Move4.SelectedValue = pk2.Move4;
CB_PPu1.SelectedIndex = pk2.Move1_PPUps;
CB_PPu2.SelectedIndex = pk2.Move2_PPUps;
CB_PPu3.SelectedIndex = pk2.Move3_PPUps;
CB_PPu4.SelectedIndex = pk2.Move4_PPUps;
TB_PP1.Text = pk2.Move1_PP.ToString();
TB_PP2.Text = pk2.Move2_PP.ToString();
TB_PP3.Text = pk2.Move3_PP.ToString();
TB_PP4.Text = pk2.Move4_PP.ToString();
CB_Language.SelectedIndex = pk2.Japanese ? 0 : 1;
updateStats();
setIsShiny(null);
Label_Gender.Text = gendersymbols[pk2.Gender];
Label_Gender.ForeColor = pk2.Gender == 2 ? Label_Species.ForeColor : (pk2.Gender == 1 ? Color.Red : Color.Blue);
TB_EXP.Text = pk2.EXP.ToString();
}
private PKM preparePK2()
{
PK2 pk2 = pkm as PK2;
if (pk2 == null)
return null;
pk2.Species = Util.getIndex(CB_Species);
pk2.TID = Util.ToInt32(TB_TID.Text);
pk2.EXP = Util.ToUInt32(TB_EXP.Text);
pk2.HeldItem = Util.getIndex(CB_HeldItem);
pk2.IsEgg = CHK_IsEgg.Checked;
pk2.CurrentFriendship = Util.ToInt32(TB_Friendship.Text);
pk2.Met_Level = Util.ToInt32(TB_MetLevel.Text);
pk2.Met_Location = Util.getIndex(CB_MetLocation);
pk2.Met_TimeOfDay = CB_MetTimeOfDay.SelectedIndex;
pk2.EV_HP = Util.ToInt32(TB_HPEV.Text);
pk2.EV_ATK = Util.ToInt32(TB_ATKEV.Text);
pk2.EV_DEF = Util.ToInt32(TB_DEFEV.Text);
pk2.EV_SPE = Util.ToInt32(TB_SPEEV.Text);
pk2.EV_SPC = Util.ToInt32(TB_SPAEV.Text);
if (CHK_Nicknamed.Checked)
pk2.Nickname = TB_Nickname.Text;
else
pk2.setNotNicknamed();
pk2.Move1 = Util.getIndex(CB_Move1);
pk2.Move2 = Util.getIndex(CB_Move2);
pk2.Move3 = Util.getIndex(CB_Move3);
pk2.Move4 = Util.getIndex(CB_Move4);
pk2.Move1_PP = Util.getIndex(CB_Move1) > 0 ? Util.ToInt32(TB_PP1.Text) : 0;
pk2.Move2_PP = Util.getIndex(CB_Move2) > 0 ? Util.ToInt32(TB_PP2.Text) : 0;
pk2.Move3_PP = Util.getIndex(CB_Move3) > 0 ? Util.ToInt32(TB_PP3.Text) : 0;
pk2.Move4_PP = Util.getIndex(CB_Move4) > 0 ? Util.ToInt32(TB_PP4.Text) : 0;
pk2.Move1_PPUps = Util.getIndex(CB_Move1) > 0 ? CB_PPu1.SelectedIndex : 0;
pk2.Move2_PPUps = Util.getIndex(CB_Move2) > 0 ? CB_PPu2.SelectedIndex : 0;
pk2.Move3_PPUps = Util.getIndex(CB_Move3) > 0 ? CB_PPu3.SelectedIndex : 0;
pk2.Move4_PPUps = Util.getIndex(CB_Move4) > 0 ? CB_PPu4.SelectedIndex : 0;
pk2.IV_HP = Util.ToInt32(TB_HPIV.Text);
pk2.IV_ATK = Util.ToInt32(TB_ATKIV.Text);
pk2.IV_DEF = Util.ToInt32(TB_DEFIV.Text);
pk2.IV_SPE = Util.ToInt32(TB_SPEIV.Text);
pk2.IV_SPA = Util.ToInt32(TB_SPAIV.Text);
pk2.OT_Name = TB_OT.Text;
// Toss in Party Stats
Array.Resize(ref pk2.Data, pk2.SIZE_PARTY);
pk2.Stat_Level = Util.ToInt32(TB_Level.Text);
pk2.Stat_HPCurrent = Util.ToInt32(Stat_HP.Text);
pk2.Stat_HPMax = Util.ToInt32(Stat_HP.Text);
pk2.Stat_ATK = Util.ToInt32(Stat_ATK.Text);
pk2.Stat_DEF = Util.ToInt32(Stat_DEF.Text);
pk2.Stat_SPE = Util.ToInt32(Stat_SPE.Text);
pk2.Stat_SPA = Util.ToInt32(Stat_SPA.Text);
pk2.Stat_SPD = Util.ToInt32(Stat_SPD.Text);
if (HaX)
{
pk2.Stat_Level = (byte)Math.Min(Convert.ToInt32(MT_Level.Text), byte.MaxValue);
}
// Fix Moves if a slot is empty
pk2.FixMoves();
return pk2;
}
}
}

View File

@@ -137,8 +137,6 @@ private void populateFieldsPK4()
if (abil < 0)
CB_Ability.SelectedIndex = 0;
else if (abil == 2)
CB_Ability.SelectedIndex = 2;
else if (abils[0] == abils[1] || abils[1] == 0)
CB_Ability.SelectedIndex = pk4.PIDAbility;
else

View File

@@ -136,6 +136,7 @@ private void populateFieldsPK5()
TB_EXP.Text = pk5.EXP.ToString();
Label_Gender.Text = gendersymbols[pk5.Gender];
Label_Gender.ForeColor = pk5.Gender == 2 ? Label_Species.ForeColor : (pk5.Gender == 1 ? Color.Red : Color.Blue);
CHK_NSparkle.Checked = pk5.NPokémon;
if (HaX)
DEV_Ability.SelectedValue = pk5.Ability;
@@ -240,6 +241,8 @@ private PKM preparePK5()
pk5.Version = Util.getIndex(CB_GameOrigin);
pk5.Language = Util.getIndex(CB_Language);
pk5.NPokémon = CHK_NSparkle.Checked;
// Toss in Party Stats
Array.Resize(ref pk5.Data, pk5.SIZE_PARTY);
pk5.Stat_Level = Util.ToInt32(TB_Level.Text);

BIN
PKHeX/Misc/personal_gs Normal file

Binary file not shown.

View File

@@ -42,8 +42,10 @@ internal static MysteryGift getMysteryGift(byte[] data)
}
public abstract string Extension { get; }
public string FileName => getCardHeader() + "." + Extension;
public virtual byte[] Data { get; set; }
public abstract PKM convertToPKM(SaveFile SAV);
public abstract int Format { get; }
public MysteryGift Clone()
{
@@ -64,6 +66,18 @@ public MysteryGift Clone()
public virtual int Quantity { get { return 1; } set { } }
public bool Empty => Data.SequenceEqual(new byte[Data.Length]);
public string getCardHeader() => (CardID > 0 ? $"Card #: {CardID.ToString("0000")}" : "N/A") + $" - {CardTitle.Replace('\u3000',' ').Trim()}" + Environment.NewLine;
public string getCardHeader() => (CardID > 0 ? $"Card #: {CardID.ToString("0000")}" : "N/A") + $" - {CardTitle.Replace('\u3000',' ').Trim()}";
// Search Properties
public virtual int Species { get { return -1; } set { } }
public virtual int[] Moves => new int[0];
public virtual bool IsShiny => false;
public virtual bool IsEgg { get { return false; } set { } }
public virtual int HeldItem { get { return -1; } set { } }
public bool Gen7 => Format == 7;
public bool Gen6 => Format == 6;
public bool Gen5 => Format == 5;
public bool Gen4 => Format == 4;
public bool Gen3 => Format == 3;
}
}

View File

@@ -6,7 +6,8 @@ namespace PKHeX
public sealed class PGF : MysteryGift
{
internal const int Size = 0xCC;
public override string Extension => ".pgf";
public override string Extension => "pgf";
public override int Format => 5;
public PGF(byte[] data = null)
{
@@ -41,12 +42,13 @@ public PGF(byte[] data = null)
public bool RIB1_7 { get { return (RIB1 & (1 << 7)) == 1 << 7; } set { RIB1 = (byte)(RIB1 & ~(1 << 7) | (value ? 1 << 7 : 0)); } } // Empty
public int Pokéball { get { return Data[0x0E]; } set { Data[0x0E] = (byte)value; } }
public int HeldItem { get { return BitConverter.ToUInt16(Data, 0x10); } set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x10); } }
public override int HeldItem { get { return BitConverter.ToUInt16(Data, 0x10); } set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x10); } }
public int Move1 { get { return BitConverter.ToUInt16(Data, 0x12); } set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x12); } }
public int Move2 { get { return BitConverter.ToUInt16(Data, 0x14); } set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x14); } }
public int Move3 { get { return BitConverter.ToUInt16(Data, 0x16); } set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x16); } }
public int Move4 { get { return BitConverter.ToUInt16(Data, 0x18); } set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x18); } }
public int Species { get { return BitConverter.ToUInt16(Data, 0x1A); } set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1A); } }
public override int Species { get { return BitConverter.ToUInt16(Data, 0x1A); }
}
public int Form { get { return Data[0x1C]; } set { Data[0x1C] = (byte)value; } }
public int Language { get { return Data[0x1D]; } set { Data[0x1D] = (byte)value; } }
public string Nickname
@@ -79,7 +81,7 @@ public string Nickname
set { Encoding.Unicode.GetBytes(value.PadRight(0x08, (char)0xFFFF)).CopyTo(Data, 0x4A); } }
public int OTGender { get { return Data[0x5A]; } set { Data[0x5A] = (byte)value; } }
public int Level { get { return Data[0x5B]; } set { Data[0x5C] = (byte)value; } }
public bool IsEgg { get { return Data[0x5C] == 1; } set { Data[0x5C] = (byte)(value ? 1 : 0); } }
public override bool IsEgg { get { return Data[0x5C] == 1; } set { Data[0x5C] = (byte)(value ? 1 : 0); } }
// Unused 0x5D 0x5E 0x5F
public override string CardTitle
{
@@ -142,16 +144,9 @@ public override int CardID
public int[] IVs => new[] { IV_HP, IV_ATK, IV_DEF, IV_SPE, IV_SPA, IV_SPD };
public bool IsNicknamed => Nickname.Length > 0;
public int[] Moves
public override int[] Moves
{
get { return new[] { Move1, Move2, Move3, Move4 }; }
set
{
if (value.Length > 0) Move1 = value[0];
if (value.Length > 1) Move2 = value[1];
if (value.Length > 2) Move3 = value[2];
if (value.Length > 3) Move4 = value[3];
}
}
public override bool IsPokémon { get { return CardType == 1; } set { if (value) CardType = 1; } }
public override bool IsItem { get { return CardType == 2; } set { if (value) CardType = 2; } }

View File

@@ -11,7 +11,8 @@ namespace PKHeX
public sealed class PCD : MysteryGift
{
internal const int Size = 0x358; // 856
public override string Extension => ".pcd";
public override string Extension => "pcd";
public override int Format => 4;
public PCD(byte[] data = null)
{
@@ -50,6 +51,12 @@ public override string CardTitle
}
}
public override int Species => Gift.PK.Species;
public override int[] Moves => Gift.PK.Moves;
public override bool IsShiny => Gift.PK.IsShiny;
public override bool IsEgg => Gift.PK.IsEgg;
public override int HeldItem => Gift.PK.HeldItem;
public override PKM convertToPKM(SaveFile SAV)
{
return Gift.convertToPKM(SAV);
@@ -58,7 +65,8 @@ public override PKM convertToPKM(SaveFile SAV)
public class PGT : MysteryGift
{
internal const int Size = 0x104; // 260
public override string Extension => ".pgt";
public override string Extension => "pgt";
public override int Format => 4;
private enum GiftType
{
@@ -103,7 +111,7 @@ private void refreshData(byte[] data)
public byte Slot { get { return Data[2]; } set { Data[2] = value; } }
public byte Detail { get { return Data[3]; } set { Data[3] = value; } }
public override int Item { get { return BitConverter.ToUInt16(Data, 0x4); } set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x4); } }
private PK4 PK;
public PK4 PK;
private byte[] Unknown;
private byte[] RAW;
@@ -118,11 +126,16 @@ public override byte[] Data
private GiftType PGTGiftType { get { return (GiftType)Data[0]; } set {Data[0] = (byte)value; } }
public bool IsHatched => PGTGiftType == GiftType.Pokémon;
public bool IsEgg => PGTGiftType == GiftType.PokémonEgg;
public override bool IsEgg => PGTGiftType == GiftType.PokémonEgg;
public bool IsManaphyEgg => PGTGiftType == GiftType.ManaphyEgg;
public override bool IsItem { get { return PGTGiftType == GiftType.Item; } set { if (value) CardType = (int)GiftType.Item; } }
public override bool IsPokémon { get { return PGTGiftType == GiftType.Pokémon || PGTGiftType == GiftType.PokémonEgg || PGTGiftType == GiftType.ManaphyEgg; } set { } }
public override int Species => PK.Species;
public override int[] Moves => PK.Moves;
public override bool IsShiny => PK.IsShiny;
public override int HeldItem => PK.HeldItem;
public override PKM convertToPKM(SaveFile SAV)
{
if (!IsPokémon)

View File

@@ -9,7 +9,8 @@ public sealed class WC6 : MysteryGift
internal const int Size = 0x108;
internal const int SizeFull = 0x310;
internal const uint EonTicketConst = 0x225D73C2;
public override string Extension => ".wc6";
public override string Extension => "wc6";
public override int Format => 6;
public WC6(byte[] data = null)
{
@@ -94,6 +95,7 @@ public WC6(byte[] data = null)
// Pokémon Properties
public override bool IsPokémon { get { return CardType == 0; } set { if (value) CardType = 0; } }
public override bool IsShiny { get { return PIDType == 2; } }
public int TID {
get { return BitConverter.ToUInt16(Data, 0x68); }
set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x68); } }
@@ -109,7 +111,7 @@ public WC6(byte[] data = null)
public int Pokéball {
get { return Data[0x76]; }
set { Data[0x76] = (byte)value; } }
public int HeldItem {
public override int HeldItem {
get { return BitConverter.ToUInt16(Data, 0x78); }
set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x78); } }
public int Move1 {
@@ -124,7 +126,7 @@ public WC6(byte[] data = null)
public int Move4 {
get { return BitConverter.ToUInt16(Data, 0x80); }
set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x80); } }
public int Species {
public override int Species {
get { return BitConverter.ToUInt16(Data, 0x82); }
set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x82); } }
public int Form {
@@ -174,7 +176,7 @@ public WC6(byte[] data = null)
get { return Util.TrimFromZero(Encoding.Unicode.GetString(Data, 0xB6, 0x1A)); }
set { Encoding.Unicode.GetBytes(value.PadRight(value.Length + 1, '\0')).CopyTo(Data, 0xB6); } }
public int Level { get { return Data[0xD0]; } set { Data[0xD0] = (byte)value; } }
public bool IsEgg { get { return Data[0xD1] == 1; } set { Data[0xD1] = (byte)(value ? 1 : 0); } }
public override bool IsEgg { get { return Data[0xD1] == 1; } set { Data[0xD1] = (byte)(value ? 1 : 0); } }
public uint PID {
get { return BitConverter.ToUInt32(Data, 0xD4); }
set { BitConverter.GetBytes(value).CopyTo(Data, 0xD4); } }
@@ -218,16 +220,9 @@ public WC6(byte[] data = null)
public int[] IVs => new[] { IV_HP, IV_ATK, IV_DEF, IV_SPE, IV_SPA, IV_SPD };
public bool IsNicknamed => Nickname.Length > 0;
public int[] Moves
public override int[] Moves
{
get { return new[] {Move1, Move2, Move3, Move4}; }
set
{
if (value.Length > 0) Move1 = value[0];
if (value.Length > 1) Move2 = value[1];
if (value.Length > 2) Move3 = value[2];
if (value.Length > 3) Move4 = value[3];
}
}
public int[] RelearnMoves
{

View File

@@ -72,9 +72,14 @@
<Compile Include="Legality\Checks.cs" />
<Compile Include="Legality\Core.cs" />
<Compile Include="Legality\Data.cs" />
<Compile Include="Legality\Tables2.cs" />
<Compile Include="Legality\Tables1.cs" />
<Compile Include="Legality\Tables3.cs" />
<Compile Include="Legality\Tables5.cs" />
<Compile Include="Legality\Tables4.cs" />
<Compile Include="MainWindow\MainPK2.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainWindow\MainPK1.cs">
<SubType>Form</SubType>
</Compile>
@@ -101,6 +106,7 @@
<Compile Include="PersonalInfo\PersonalInfo.cs" />
<Compile Include="PersonalInfo\PersonalInfoB2W2.cs" />
<Compile Include="PersonalInfo\PersonalInfoBW.cs" />
<Compile Include="PersonalInfo\PersonalInfoG2.cs" />
<Compile Include="PersonalInfo\PersonalInfoG1.cs" />
<Compile Include="PersonalInfo\PersonalInfoG3.cs" />
<Compile Include="PersonalInfo\PersonalInfoG4.cs" />
@@ -108,6 +114,7 @@
<Compile Include="PersonalInfo\PersonalInfoXY.cs" />
<Compile Include="PersonalInfo\PersonalTable.cs" />
<Compile Include="PKM\PK1.cs" />
<Compile Include="PKM\PK2.cs" />
<Compile Include="PKM\PKM.cs" />
<Compile Include="PKM\PKMConverter.cs" />
<Compile Include="PKM\ShowdownSet.cs" />
@@ -127,6 +134,7 @@
<Compile Include="Saves\BlockInfo.cs" />
<Compile Include="Saves\BoxWallpaper.cs" />
<Compile Include="Saves\Inventory.cs" />
<Compile Include="Saves\SAV2.cs" />
<Compile Include="Saves\SAV1.cs" />
<Compile Include="Saves\SAV3.cs" />
<Compile Include="Saves\SAV4.cs" />
@@ -215,6 +223,12 @@
<Compile Include="Subforms\Save Editors\SAV_SimplePokedex.Designer.cs">
<DependentUpon>SAV_SimplePokedex.cs</DependentUpon>
</Compile>
<Compile Include="Subforms\SAV_MysteryGiftDB.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Subforms\SAV_MysteryGiftDB.Designer.cs">
<DependentUpon>SAV_MysteryGiftDB.cs</DependentUpon>
</Compile>
<Compile Include="Subforms\SAV_Database.cs">
<SubType>Form</SubType>
</Compile>
@@ -375,6 +389,9 @@
<EmbeddedResource Include="Subforms\Save Editors\SAV_SimplePokedex.resx">
<DependentUpon>SAV_SimplePokedex.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Subforms\SAV_MysteryGiftDB.resx">
<DependentUpon>SAV_MysteryGiftDB.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Subforms\SAV_Database.resx">
<DependentUpon>SAV_Database.cs</DependentUpon>
</EmbeddedResource>
@@ -433,6 +450,7 @@
<SubType>Designer</SubType>
</EmbeddedResource>
<None Include="app.config" />
<None Include="Misc\personal_gs" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
@@ -442,6 +460,16 @@
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<None Include="Resources\text\gen3\text_gsc_00000_es.txt" />
<None Include="Resources\text\gen3\text_ItemsG1_es.txt" />
<None Include="Resources\text\gen3\text_ItemsG2_es.txt" />
<None Include="Resources\text\gen3\text_ItemsG3_es.txt" />
<None Include="Resources\text\gen3\text_rsefrlg_00000_es.txt" />
<None Include="Resources\text\gen3\text_gsc_00000_zh.txt" />
<None Include="Resources\text\gen3\text_ItemsG1_zh.txt" />
<None Include="Resources\text\gen3\text_ItemsG2_zh.txt" />
<None Include="Resources\text\gen3\text_ItemsG3_zh.txt" />
<None Include="Resources\text\gen3\text_rsefrlg_00000_zh.txt" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.0,Profile=Client">
@@ -482,9 +510,11 @@
<None Include="Resources\byte\lvlmove_xy.pkl" />
<None Include="Resources\byte\personal_b2w2" />
<None Include="Resources\byte\personal_bw" />
<None Include="Resources\byte\personal_c" />
<None Include="Resources\byte\personal_dp" />
<None Include="Resources\byte\personal_e" />
<None Include="Resources\byte\personal_fr" />
<None Include="Resources\byte\personal_gs" />
<None Include="Resources\byte\personal_hgss" />
<None Include="Resources\byte\personal_lg" />
<None Include="Resources\byte\personal_pt" />
@@ -2751,6 +2781,17 @@
<ItemGroup>
<None Include="Resources\text\version.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\text\gen3\text_gsc_00000_en.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\text\gen3\text_ItemsG1_en.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\img\Program\gift.png" />
<Content Include="Resources\text\gen3\text_ItemsG2_en.txt" />
<None Include="Resources\img\Pokemon Sprites\172_1.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -1,8 +0,0 @@
<Properties StartupItem="PKHeX.csproj">
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|x86" />
<MonoDevelop.Ide.Workbench />
<MonoDevelop.Ide.DebuggingService.Breakpoints>
<BreakpointStore />
</MonoDevelop.Ide.DebuggingService.Breakpoints>
<MonoDevelop.Ide.DebuggingService.PinnedWatches />
</Properties>

View File

@@ -100,9 +100,11 @@ public override bool IsNicknamed
get
{
string spName = PKX.getSpeciesName(Species, Japanese ? 1 : 2).ToUpper();
return !nick.SequenceEqual(
spName = spName.Replace(" ", ""); // Gen I/II didn't have a space for Mr. Mime
return !nick.SequenceEqual(
PKX.setG1Str(spName, Japanese)
.Concat(Enumerable.Repeat((byte) 0x50, StringLength - spName.Length - 1)));
.Concat(Enumerable.Repeat((byte) 0x50, StringLength - spName.Length - 1))
.Select(b => (byte)(b == 0xF2 ? 0xE8 : b)));
}
set { }
}
@@ -110,7 +112,11 @@ public override bool IsNicknamed
public void setNotNicknamed()
{
string spName = PKX.getSpeciesName(Species, Japanese ? 1 : 2).ToUpper();
nick = PKX.setG1Str(spName, Japanese).Concat(Enumerable.Repeat((byte)0x50, StringLength - spName.Length - 1)).ToArray();
spName = spName.Replace(" ", ""); // Gen I/II didn't have a space for Mr. Mime
nick = PKX.setG1Str(spName, Japanese)
.Concat(Enumerable.Repeat((byte)0x50, StringLength - spName.Length - 1))
.Select(b => (byte)(b == 0xF2 ? 0xE8 : b)) // Decimal point<->period fix
.ToArray();
}
@@ -120,8 +126,8 @@ public override int Species
get { return PKX.getG1Species(Data[0]); }
set
{
// Before updating catch rate, check if Special Yellow Version Pikachu
if (!(PKX.getG1Species(Data[0]) == 25 && value == 25 && Catch_Rate == 163))
// Before updating catch rate, check if non-standard
if (Catch_Rate == PersonalTable.RBY[Species].CatchRate)
Catch_Rate = PersonalTable.RBY[value].CatchRate;
Data[0] = (byte)PKX.setG1Species(value);
Type_A = PersonalTable.RBY[value].Types[0];
@@ -250,20 +256,59 @@ public override bool CanHoldItem(ushort[] ValidArray)
public override int CNT_Tough { get { return 0; } set { } }
public override int CNT_Sheen { get { return 0; } set { } }
#endregion
public PK2 convertToPK2()
{
PK2 pk2 = new PK2(null, Identifier, Japanese);
pk2.Species = Species;
Array.Copy(Data, 0x7, pk2.Data, 0x1, 0x1A);
// https://github.com/pret/pokecrystal/blob/master/engine/link.asm#L1132
if (!Legal.HeldItems_GSC.Contains((ushort)pk2.HeldItem))
switch (pk2.HeldItem)
{
case 0x19:
pk2.HeldItem = 0x92; // Leftovers
break;
case 0x2D:
pk2.HeldItem = 0x53; // Bitter Berry
break;
case 0x32:
pk2.HeldItem = 0xAE; // Leftovers
break;
case 0x5A:
case 0x64:
case 0x78:
case 0x87:
case 0xBE:
case 0xC3:
case 0xDC:
case 0xFA:
case 0xFF:
pk2.HeldItem = 0xAD; // Berry
break;
}
pk2.CurrentFriendship = PersonalTable.C[Species].BaseFriendship;
// Pokerus = 0
// Caught Data = 0
pk2.Stat_Level = PKX.getLevel(Species, EXP);
Array.Copy(otname, 0, pk2.otname, 0, otname.Length);
Array.Copy(nick, 0, pk2.nick, 0, nick.Length);
return pk2;
}
}
public class PokemonList1
{
internal const int CAPACITY_DAYCARE = 1;
internal const int CAPACITY_PARTY = 6;
internal const int CAPACITY_STORED = 20;
internal const int CAPACITY_STORED_JP = 30;
private const int CAPACITY_DAYCARE = 1;
private const int CAPACITY_PARTY = 6;
private const int CAPACITY_STORED = 20;
private const int CAPACITY_STORED_JP = 30;
private readonly bool Japanese;
private int StringLength => Japanese ? PK1.STRLEN_J : PK1.STRLEN_U;
internal static readonly byte[] EMPTY_LIST = { 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50 };
public enum CapacityType
{
Daycare = CAPACITY_DAYCARE,
@@ -340,11 +385,6 @@ public byte Count
set { Data[0] = value > Capacity ? Capacity : value; }
}
public int GetCapacity()
{
return Capacity;
}
public readonly PK1[] Pokemon;
public PK1 this[int i]

490
PKHeX/PKM/PK2.cs Normal file
View File

@@ -0,0 +1,490 @@
using System;
using System.Linq;
namespace PKHeX
{
public class PK2 : PKM
{
// Internal use only
protected internal byte[] otname;
protected internal byte[] nick;
public byte[] OT_Name_Raw => (byte[])otname.Clone();
public byte[] Nickname_Raw => (byte[])nick.Clone();
public sealed override int SIZE_PARTY => PKX.SIZE_2PARTY;
public override int SIZE_STORED => PKX.SIZE_2STORED;
internal const int STRLEN_J = 6;
internal const int STRLEN_U = 11;
private int StringLength => Japanese ? STRLEN_J : STRLEN_U;
public override int Format => 2;
public bool Japanese => otname.Length == STRLEN_J;
public override string FileName => $"{Species.ToString("000")} - {Nickname} - {OT_Name}.{Extension}";
public PK2(byte[] decryptedData = null, string ident = null, bool jp = false)
{
Data = (byte[])(decryptedData ?? new byte[SIZE_PARTY]).Clone();
Identifier = ident;
if (Data.Length != SIZE_PARTY)
Array.Resize(ref Data, SIZE_PARTY);
int strLen = jp ? STRLEN_J : STRLEN_U;
otname = Enumerable.Repeat((byte) 0x50, strLen).ToArray();
nick = Enumerable.Repeat((byte) 0x50, strLen).ToArray();
IsEgg = false; // Egg data stored in Pokemon List.
}
public override PKM Clone()
{
PK2 new_pk2 = new PK2(Data, Identifier, Japanese);
Array.Copy(otname, 0, new_pk2.otname, 0, otname.Length);
Array.Copy(nick, 0, new_pk2.nick, 0, nick.Length);
new_pk2.IsEgg = IsEgg;
return new_pk2;
}
public override string Nickname
{
get { return PKX.getG1Str(nick, Japanese); }
set
{
byte[] strdata = PKX.setG1Str(value, Japanese);
if (strdata.Length > StringLength)
throw new ArgumentOutOfRangeException($"Nickname {value} too long for given PK2");
if (nick.Any(b => b == 0) && nick[StringLength - 1] == 0x50 && Array.FindIndex(nick, b => b == 0) == strdata.Length - 1) // Handle JP Mew event with grace
{
int firstInd = Array.FindIndex(nick, b => b == 0);
for (int i = firstInd; i < StringLength - 1; i++)
if (nick[i] != 0)
break;
strdata = strdata.Take(strdata.Length - 1).ToArray();
}
strdata.CopyTo(nick, 0);
}
}
public override string OT_Name
{
get { return PKX.getG1Str(otname, Japanese); }
set
{
byte[] strdata = PKX.setG1Str(value, Japanese);
if (strdata.Length > StringLength)
throw new ArgumentOutOfRangeException($"OT Name {value} too long for given PK1");
if (otname.Any(b => b == 0) && otname[StringLength - 1] == 0x50 && Array.FindIndex(otname, b => b == 0) == strdata.Length - 1) // Handle JP Mew event with grace
{
int firstInd = Array.FindIndex(otname, b => b == 0);
for (int i = firstInd; i < StringLength - 1; i++)
if (otname[i] != 0)
break;
strdata = strdata.Take(strdata.Length - 1).ToArray();
}
strdata.CopyTo(otname, 0);
}
}
public override byte[] Encrypt()
{
// Oh god this is such total abuse of what this method is meant to do
// Please forgive me
return new PokemonList2(this).GetBytes();
}
// Please forgive me.
public override byte[] EncryptedPartyData => Encrypt().ToArray();
public override byte[] EncryptedBoxData => Encrypt().ToArray();
public override byte[] DecryptedBoxData => Encrypt().ToArray();
public override byte[] DecryptedPartyData => Encrypt().ToArray();
public override bool IsNicknamed
{
get
{
string spName = PKX.getSpeciesName(Species, Japanese ? 1 : 2).ToUpper();
spName = spName.Replace(" ", ""); // Gen I/II didn't have a space for Mr. Mime
return !nick.SequenceEqual(
PKX.setG1Str(spName, Japanese)
.Concat(Enumerable.Repeat((byte) 0x50, StringLength - spName.Length - 1))
.Select(b => (byte)(b == 0xF2 ? 0xE8 : b)));
}
set { }
}
public void setNotNicknamed()
{
string spName = PKX.getSpeciesName(Species, Japanese ? 1 : 2).ToUpper();
spName = spName.Replace(" ", ""); // Gen I/II didn't have a space for Mr. Mime
nick = PKX.setG1Str(spName, Japanese)
.Concat(Enumerable.Repeat((byte)0x50, StringLength - spName.Length - 1))
.Select(b => (byte)(b == 0xF2 ? 0xE8 : b)) // Decimal point<->period fix
.ToArray();
}
#region Stored Attributes
public override int Species
{
get { return Data[0]; }
set
{
Data[0] = (byte)value;
}
}
public override int HeldItem { get { return Data[0x1]; } set { Data[0x1] = (byte)value; } }
public override int Move1 { get { return Data[2]; } set { Data[2] = (byte) value; } }
public override int Move2 { get { return Data[3]; } set { Data[3] = (byte)value; } }
public override int Move3 { get { return Data[4]; } set { Data[4] = (byte)value; } }
public override int Move4 { get { return Data[5]; } set { Data[5] = (byte)value; } }
public override int TID { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 6)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 6); } }
public override uint EXP
{
get { return (Util.SwapEndianness(BitConverter.ToUInt32(Data, 8)) >> 8) & 0x00FFFFFF; }
set { Array.Copy(BitConverter.GetBytes(Util.SwapEndianness((value << 8) & 0xFFFFFF00)), 0, Data, 8, 3); }
}
public override int EV_HP { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0xB)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0xB); } }
public override int EV_ATK { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0xD)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0xD); } }
public override int EV_DEF { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0xF)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0xF); } }
public override int EV_SPE { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x11)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0x11); } }
public int EV_SPC { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x13)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0x13); } }
public override int EV_SPA { get { return EV_SPC; } set { EV_SPC = value; } }
public override int EV_SPD { get { return EV_SPC; } set { } }
public ushort DV16 { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x15)); } set { BitConverter.GetBytes(Util.SwapEndianness(value)).CopyTo(Data, 0x15); } }
public override int IV_HP { get { return ((IV_ATK & 1) << 3) | ((IV_DEF & 1) << 2) | ((IV_SPE & 1) << 1) | ((IV_SPC & 1) << 0); } set { } }
public override int IV_ATK { get { return (DV16 >> 12) & 0xF; } set { DV16 = (ushort)((DV16 & ~(0xF << 12)) | (ushort)((value > 0xF ? 0xF : value) << 12)); } }
public override int IV_DEF { get { return (DV16 >> 8) & 0xF; } set { DV16 = (ushort)((DV16 & ~(0xF << 8)) | (ushort)((value > 0xF ? 0xF : value) << 8)); } }
public override int IV_SPE { get { return (DV16 >> 4) & 0xF; } set { DV16 = (ushort)((DV16 & ~(0xF << 4)) | (ushort)((value > 0xF ? 0xF : value) << 4)); } }
public int IV_SPC { get { return (DV16 >> 0) & 0xF; } set { DV16 = (ushort)((DV16 & ~(0xF << 0)) | (ushort)((value > 0xF ? 0xF : value) << 0)); } }
public override int IV_SPA { get { return IV_SPC; } set { IV_SPC = value; } }
public override int IV_SPD { get { return IV_SPC; } set { } }
public override int Move1_PP { get { return Data[0x17] & 0x3F; } set { Data[0x17] = (byte)((Data[0x17] & 0xC0) | (value & 0x3F)); } }
public override int Move2_PP { get { return Data[0x18] & 0x3F; } set { Data[0x18] = (byte)((Data[0x18] & 0xC0) | (value & 0x3F)); } }
public override int Move3_PP { get { return Data[0x19] & 0x3F; } set { Data[0x19] = (byte)((Data[0x19] & 0xC0) | (value & 0x3F)); } }
public override int Move4_PP { get { return Data[0x1A] & 0x3F; } set { Data[0x1A] = (byte)((Data[0x1A] & 0xC0) | (value & 0x3F)); } }
public override int Move1_PPUps { get { return (Data[0x17] & 0xC0) >> 6; } set { Data[0x17] = (byte)((Data[0x17] & 0x3F) | ((value & 0x3) << 6)); } }
public override int Move2_PPUps { get { return (Data[0x18] & 0xC0) >> 6; } set { Data[0x18] = (byte)((Data[0x18] & 0x3F) | ((value & 0x3) << 6)); } }
public override int Move3_PPUps { get { return (Data[0x19] & 0xC0) >> 6; } set { Data[0x19] = (byte)((Data[0x19] & 0x3F) | ((value & 0x3) << 6)); } }
public override int Move4_PPUps { get { return (Data[0x1A] & 0xC0) >> 6; } set { Data[0x1A] = (byte)((Data[0x1A] & 0x3F) | ((value & 0x3) << 6)); } }
public override int CurrentFriendship { get { return Data[0x1B]; } set { Data[0x1B] = (byte) value; } }
private byte PKRS { get { return Data[0x1C]; } set { Data[0x1C] = value; } }
public override int PKRS_Days { get { return PKRS & 0xF; } set { PKRS = (byte)(PKRS & ~0xF | value); } }
public override int PKRS_Strain { get { return PKRS >> 4; } set { PKRS = (byte)(PKRS & 0xF | value << 4); } }
// Crystal only Caught Data
private int CaughtData { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x1D)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0x1D); } }
public int Met_TimeOfDay { get { return (CaughtData >> 14) & 0x3; } set { CaughtData = (CaughtData & 0x3FFF) | ((value & 0x3) << 14); } }
public override int Met_Level { get { return (CaughtData >> 8) & 0x3F; } set { CaughtData = (CaughtData & 0xC0FF) | ((value & 0x3F) << 8); } }
public override int OT_Gender { get { return (CaughtData >> 7) & 1; } set { CaughtData = (CaughtData & 0xFFEF) | ((value & 1) << 7); } }
public override int Met_Location { get { return CaughtData & 0x7F; } set { CaughtData = (CaughtData & 0xFF80) | (value & 0x7F); } }
public override int Stat_Level
{
get { return Data[0x1F]; }
set { Data[0x1F] = (byte)value; }
}
#endregion
#region Party Attributes
public int Status_Condition { get { return Data[0x20]; } set { Data[0x20] = (byte)value; } }
public override int Stat_HPCurrent { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x22)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0x22); } }
public override int Stat_HPMax { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x24)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0x24); } }
public override int Stat_ATK { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x26)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0x26); } }
public override int Stat_DEF { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x28)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0x28); } }
public override int Stat_SPE { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x2A)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0x2A); } }
public override int Stat_SPA { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x2C)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0x2C); } }
public override int Stat_SPD { get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x2E)); } set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data, 0x2E); } }
#endregion
public override ushort[] getStats(PersonalInfo p)
{
ushort[] Stats = new ushort[6];
for (int i = 0; i < Stats.Length; i++)
{
ushort L = (ushort)Stat_Level;
ushort B = (ushort)p.Stats[i];
ushort I = (ushort)IVs[i];
ushort E = // Fixed formula via http://www.smogon.com/ingame/guides/rby_gsc_stats
(ushort)Math.Floor(Math.Min(255, Math.Floor(Math.Sqrt(Math.Max(0, EVs[i] - 1)) + 1)) / 4.0);
Stats[i] = (ushort)Math.Floor((2 * (B + I) + E) * L / 100.0 + 5);
}
Stats[0] += (ushort)(5 + Stat_Level); // HP
return Stats;
}
public override bool getGenderIsValid()
{
int gv = PersonalTable.C[Species].Gender;
if (gv == 255)
return Gender == 2;
if (gv == 254)
return Gender == 1;
if (gv == 0)
return Gender == 0;
switch (gv)
{
case 31:
return IV_ATK >= 2 ? Gender == 0 : Gender == 1;
case 63:
return IV_ATK >= 5 ? Gender == 0 : Gender == 1;
case 127:
return IV_ATK >= 7 ? Gender == 0 : Gender == 1;
case 191:
return IV_ATK >= 12 ? Gender == 0 : Gender == 1;
}
return false;
}
public override bool IsEgg { get; set; }
public override int Gender
{
get
{
int gv = PersonalTable.C[Species].Gender;
if (gv == 255)
return 2;
if (gv == 254)
return 1;
if (gv == 0)
return 0;
switch (gv)
{
case 31:
return IV_ATK >= 2 ? 0 : 1;
case 63:
return IV_ATK >= 5 ? 0 : 1;
case 127:
return IV_ATK >= 7 ? 0 : 1;
case 191:
return IV_ATK >= 12 ? 0 : 1;
}
Console.WriteLine("Unknown Gender value: " + gv);
return 0;
}
set { }
}
public bool hasMetData => CaughtData != 0;
public override bool CanHoldItem(ushort[] ValidArray)
{
return ValidArray.Contains((ushort)HeldItem);
}
#region Future, Unused Attributes
public override uint EncryptionConstant { get { return 0; } set { } }
public override uint PID { get { return 0; } set { } }
public override int Nature { get { return 0; } set { } }
public override int AltForm
{
get
{
if (Species != 201) // Unown
return 0;
else
{
uint formeVal = 0;
formeVal |= (uint)((IV_ATK & 0x6) << 5);
formeVal |= (uint)((IV_DEF & 0x6) << 3);
formeVal |= (uint)((IV_SPE & 0x6) << 1);
formeVal |= (uint)((IV_SPC & 0x6) >> 1);
return (int)(formeVal / 10);
}
}
set{ }
}
public override int HPType
{
get { return 4 * (IV_ATK % 4) + (IV_DEF % 4); }
set
{
}
}
public override bool IsShiny => IV_DEF == 10 && IV_SPE == 10 && IV_SPC == 10 && (new[] { 2, 3, 6, 7, 10, 11, 14, 15 }).Contains(IV_ATK);
public override ushort Sanity { get { return 0; } set { } }
public override bool ChecksumValid => true;
public override ushort Checksum { get { return 0; } set { } }
public override int Language { get { return 0; } set { } }
public override bool FatefulEncounter { get { return false; } set { } }
public override int TSV => 0x0000;
public override int PSV => 0xFFFF;
public override int Characteristic => -1;
public override byte MarkByte { get { return 0; } protected set { } }
public override int Ability { get { return 0; } set { } }
public override int CurrentHandler { get { return 0; } set { } }
public override int Egg_Location { get { return 0; } set { } }
public override int OT_Friendship { get { return 0; } set { } }
public override int Ball { get { return 0; } set { } }
public override int Version { get { return 0; } set { } }
public override int SID { get { return 0; } set { } }
public override int CNT_Cool { get { return 0; } set { } }
public override int CNT_Beauty { get { return 0; } set { } }
public override int CNT_Cute { get { return 0; } set { } }
public override int CNT_Smart { get { return 0; } set { } }
public override int CNT_Tough { get { return 0; } set { } }
public override int CNT_Sheen { get { return 0; } set { } }
#endregion
public PK1 convertToPK1()
{
PK1 pk1 = new PK1(null, Identifier, Japanese);
Array.Copy(Data, 0x1, pk1.Data, 0x7, 0x1A);
pk1.Species = Species; // This will take care of Typing :)
pk1.Stat_HPCurrent = Stat_HPCurrent;
pk1.Stat_Level = Stat_Level;
// Status = 0
Array.Copy(otname, 0, pk1.otname, 0, otname.Length);
Array.Copy(nick, 0, pk1.nick, 0, nick.Length);
int[] newMoves = pk1.Moves;
for (int i = 0; i < 4; i++)
if (newMoves[i] > 165) // not present in Gen 1
newMoves[i] = 0;
pk1.Moves = newMoves;
pk1.FixMoves();
return pk1;
}
}
public class PokemonList2
{
private const int CAPACITY_DAYCARE = 1;
private const int CAPACITY_PARTY = 6;
private const int CAPACITY_STORED = 20;
private const int CAPACITY_STORED_JP = 30;
private readonly bool Japanese;
private int StringLength => Japanese ? PK2.STRLEN_J : PK2.STRLEN_U;
public enum CapacityType
{
Daycare = CAPACITY_DAYCARE,
Party = CAPACITY_PARTY,
Stored = CAPACITY_STORED,
StoredJP = CAPACITY_STORED_JP,
Single
}
public static int getEntrySize(CapacityType c)
{
return c == CapacityType.Single || c == CapacityType.Party
? PKX.SIZE_2PARTY
: PKX.SIZE_2STORED;
}
public static byte getCapacity(CapacityType c)
{
return c == CapacityType.Single ? (byte)1 : (byte)c;
}
private byte[] getEmptyList(CapacityType c, bool is_JP = false)
{
int cap = getCapacity(c);
return new[] { (byte)0 }.Concat(Enumerable.Repeat((byte)0xFF, cap + 1)).Concat(Enumerable.Repeat((byte)0, getEntrySize(c) * cap)).Concat(Enumerable.Repeat((byte)0x50, (is_JP ? PK2.STRLEN_J : PK2.STRLEN_U) * 2 * cap)).ToArray();
}
public PokemonList2(byte[] d, CapacityType c = CapacityType.Single, bool jp = false)
{
Japanese = jp;
Data = d ?? getEmptyList(c, Japanese);
Capacity = getCapacity(c);
Entry_Size = getEntrySize(c);
if (Data.Length != DataSize)
{
Array.Resize(ref Data, DataSize);
}
Pokemon = new PK2[Capacity];
for (int i = 0; i < Capacity; i++)
{
int base_ofs = 2 + Capacity;
byte[] dat = Data.Skip(base_ofs + Entry_Size * i).Take(Entry_Size).ToArray();
Pokemon[i] = new PK2(dat, null, jp)
{
IsEgg = Data[1 + i] == 0xFD,
otname = Data.Skip(base_ofs + Capacity*Entry_Size + StringLength*i).Take(StringLength).ToArray(),
nick = Data.Skip(base_ofs + Capacity*Entry_Size + StringLength*Capacity + StringLength*i)
.Take(StringLength).ToArray()
};
}
}
public PokemonList2(CapacityType c = CapacityType.Single, bool jp = false)
: this(null, c, jp)
{
Count = 1;
}
public PokemonList2(PK2 pk)
: this(CapacityType.Single, pk.Japanese)
{
this[0] = pk;
Count = 1;
}
private readonly byte[] Data;
private readonly byte Capacity;
private readonly int Entry_Size;
public byte Count
{
get { return Data[0]; }
set { Data[0] = value > Capacity ? Capacity : value; }
}
public readonly PK2[] Pokemon;
public PK2 this[int i]
{
get
{
if (i > Capacity || i < 0) throw new IndexOutOfRangeException($"Invalid PokemonList Access: {i}");
return Pokemon[i];
}
set
{
if (value == null) return;
Pokemon[i] = (PK2)value.Clone();
}
}
private void Update()
{
if (Pokemon.Any(pk => pk.Species == 0))
Count = (byte)Array.FindIndex(Pokemon, pk => pk.Species == 0);
else
Count = Capacity;
for (int i = 0; i < Count; i++)
{
Data[1 + i] = Pokemon[i].IsEgg ? (byte)0xFD : (byte)Pokemon[i].Species;
Array.Copy(Pokemon[i].Data, 0, Data, 2 + Capacity + Entry_Size * i, Entry_Size);
Array.Copy(Pokemon[i].OT_Name_Raw, 0, Data, 2 + Capacity + Capacity * Entry_Size + StringLength * i, StringLength);
Array.Copy(Pokemon[i].Nickname_Raw, 0, Data, 2 + Capacity + Capacity * Entry_Size + StringLength * Capacity + StringLength * i, StringLength);
}
Data[1 + Count] = byte.MaxValue;
}
public byte[] GetBytes()
{
Update();
return Data;
}
private int DataSize => Capacity * (Entry_Size + 1 + 2 * StringLength) + 2;
public static int GetDataLength(CapacityType c, bool jp = false)
{
return getCapacity(c) * (getEntrySize(c) + 1 + 2 * (jp ? PK2.STRLEN_J : PK2.STRLEN_U)) + 2;
}
}
}

View File

@@ -81,7 +81,7 @@ public PK4(byte[] decryptedData = null, string ident = null)
public bool RibbonRecord { get { return (RIB2 & (1 << 2)) == 1 << 2; } set { RIB2 = (byte)(RIB2 & ~(1 << 2) | (value ? 1 << 2 : 0)); } }
public bool RibbonEvent { get { return (RIB2 & (1 << 3)) == 1 << 3; } set { RIB2 = (byte)(RIB2 & ~(1 << 3) | (value ? 1 << 3 : 0)); } }
public bool RibbonLegend { get { return (RIB2 & (1 << 4)) == 1 << 4; } set { RIB2 = (byte)(RIB2 & ~(1 << 4) | (value ? 1 << 4 : 0)); } }
public bool RibbonWorldChampion { get { return (RIB2 & (1 << 5)) == 1 << 5; } set { RIB2 = (byte)(RIB2 & ~(1 << 5) | (value ? 1 << 5 : 0)); } }
public bool RibbonChampionWorld { get { return (RIB2 & (1 << 5)) == 1 << 5; } set { RIB2 = (byte)(RIB2 & ~(1 << 5) | (value ? 1 << 5 : 0)); } }
public bool RibbonBirthday { get { return (RIB2 & (1 << 6)) == 1 << 6; } set { RIB2 = (byte)(RIB2 & ~(1 << 6) | (value ? 1 << 6 : 0)); } }
public bool RibbonSpecial { get { return (RIB2 & (1 << 7)) == 1 << 7; } set { RIB2 = (byte)(RIB2 & ~(1 << 7) | (value ? 1 << 7 : 0)); } }
public bool RibbonSouvenir { get { return (RIB3 & (1 << 0)) == 1 << 0; } set { RIB3 = (byte)(RIB3 & ~(1 << 0) | (value ? 1 << 0 : 0)); } }
@@ -323,19 +323,26 @@ public override int Met_Location
public override int PKRS_Strain { get { return PKRS >> 4; } set { PKRS = (byte)(PKRS & 0xF | (value << 4)); } }
public override int Ball
{
get { return Data[HGSS ? 0x86 : 0x83]; }
get
{
// Pokemon obtained in HGSS have the HGSS ball set (@0x86)
// However, this info is not set when receiving a wondercard!
// The PGT contains a preformatted PK4 file, which is slightly modified.
// No HGSS balls were used, and no HGSS ball info is set.
// Sneaky way = return the higher of the two values.
return Math.Max(Data[0x86], Data[0x83]);
}
set
{
if (HGSS)
{
Data[0x83] = (byte)(value <= 0x10 ? value : 4); // Ball to display in DP (cap at Cherish)
// Ball to display in DPPt
Data[0x83] = (byte)(value <= 0x10 ? value : 4); // Cap at Cherish Ball
// HGSS Exclusive Balls -- If the user wants to screw things up, let them. Any legality checking could catch hax.
if (value > 0x10 || (HGSS && !FatefulEncounter))
Data[0x86] = (byte)(value <= 0x18 ? value : 4); // Cap at Comp Ball
}
else
{
Data[0x83] = (byte)(value <= 0x10 ? value : 4); // Cap at Cherish Ball
Data[0x86] = 0; // Unused
}
}
}
public override int Met_Level { get { return Data[0x84] & ~0x80; } set { Data[0x84] = (byte)((Data[0x84] & 0x80) | value); } }

View File

@@ -226,7 +226,7 @@ public byte[] Write()
public abstract int CurrentHandler { get; set; }
// Derived
public bool IsShiny => TSV == PSV;
public virtual bool IsShiny => TSV == PSV;
public bool Gen6 => Version >= 24 && Version <= 29;
public bool XY => Version == (int)GameVersion.X || Version == (int)GameVersion.Y;
public bool AO => Version == (int)GameVersion.AS || Version == (int)GameVersion.OR;
@@ -335,7 +335,7 @@ public int[] CNTs
get { return new[] { CNT_Cool, CNT_Beauty, CNT_Cute, CNT_Smart, CNT_Tough, CNT_Sheen }; }
set { if (value?.Length != 6) return; CNT_Cool = value[0]; CNT_Beauty = value[1]; CNT_Cute = value[2]; CNT_Smart = value[3]; CNT_Tough = value[4]; CNT_Sheen = value[5]; }
}
public int HPType
public virtual int HPType
{
get { return 15 * ((IV_HP & 1) + 2 * (IV_ATK & 1) + 4 * (IV_DEF & 1) + 8 * (IV_SPE & 1) + 16 * (IV_SPA & 1) + 32 * (IV_SPD & 1)) / 63; }
set
@@ -447,6 +447,8 @@ private int getBasePP(int move)
int[] pptable;
switch (Format)
{
case 1: pptable = Legal.MovePP_RBY; break;
case 2: pptable = Legal.MovePP_GSC; break;
case 3: pptable = Legal.MovePP_RS; break;
case 4: pptable = Legal.MovePP_DP; break;
case 5: pptable = Legal.MovePP_BW; break;

View File

@@ -34,6 +34,9 @@ public static int getPKMDataFormat(byte[] data)
case PKX.SIZE_1JLIST:
case PKX.SIZE_1ULIST:
return 1;
case PKX.SIZE_2ULIST:
case PKX.SIZE_2JLIST:
return 2;
case PKX.SIZE_3PARTY:
case PKX.SIZE_3STORED:
return 3;
@@ -74,10 +77,15 @@ public static PKM getPKMfromBytes(byte[] data, string ident = null)
switch (getPKMDataFormat(data))
{
case 1:
var PL = new PokemonList1(data, PokemonList1.CapacityType.Single, data.Length == PKX.SIZE_1JLIST);
var PL1 = new PokemonList1(data, PokemonList1.CapacityType.Single, data.Length == PKX.SIZE_1JLIST);
if (ident != null)
PL[0].Identifier = ident;
return PL[0];
PL1[0].Identifier = ident;
return PL1[0];
case 2:
var PL2 = new PokemonList2(data, PokemonList2.CapacityType.Single, data.Length == PKX.SIZE_2JLIST);
if (ident != null)
PL2[0].Identifier = ident;
return PL2[0];
case 3:
return new PK3(data, ident);
case 4:
@@ -92,16 +100,36 @@ public static PKM getPKMfromBytes(byte[] data, string ident = null)
}
internal static PKM convertToFormat(PKM pk, int Format, out string comment)
{
if (pk == null)
if (pk == null || pk.Species == 0)
{
comment = "Null input. Aborting.";
return null;
}
string currentFormat = pk.Format.ToString();
PKM pkm = pk.Clone();
if (pk.Format == Format)
{
comment = "No need to convert, current format matches requested format.";
return pk;
}
if (pk.Format <= 2 && Format <= 2) // 1<->2, already checked not equal
{
switch (Format)
{
case 1:
if (pk.Species > 151)
{ comment = $"Cannot convert a {PKX.getSpeciesName(pk.Species, ((PK2)pk).Japanese ? 1 : 2)} to pk{Format}"; return null; }
pkm = ((PK2)pk).convertToPK1();
break;
case 2:
pkm = ((PK1)pk).convertToPK2();
break;
}
comment = $"Converted from pk{pk.Format} to pk{Format}";
return pkm;
}
if (pk.Format > Format)
{
comment = "Cannot convert a PKM backwards." + Environment.NewLine
@@ -120,8 +148,6 @@ internal static PKM convertToFormat(PKM pk, int Format, out string comment)
+ "Please wait for Sun/Moon to release and documentation to occur.";
return null;
}
string currentFormat = pk.Format.ToString();
PKM pkm = pk.Clone();
if (pkm.IsEgg) // force hatch
{
pkm.IsEgg = false;

View File

@@ -15,6 +15,11 @@ public static class PKX
internal const int SIZE_1PARTY = 44;
internal const int SIZE_1STORED = 33;
internal const int SIZE_2ULIST = 73;
internal const int SIZE_2JLIST = 63;
internal const int SIZE_2PARTY = 48;
internal const int SIZE_2STORED = 32;
internal const int SIZE_3PARTY = 100;
internal const int SIZE_3STORED = 80;
internal const int SIZE_3BLOCK = 12;
@@ -38,7 +43,15 @@ public static class PKX
/// <returns>A boolean indicating whether or not the length is valid for a Pokemon file.</returns>
public static bool getIsPKM(long len)
{
return new[] {SIZE_1JLIST, SIZE_1ULIST, SIZE_3STORED, SIZE_3PARTY, SIZE_4STORED, SIZE_4PARTY, SIZE_5PARTY, SIZE_6STORED, SIZE_6PARTY}.Contains((int)len);
return new[]
{
SIZE_1JLIST, SIZE_1ULIST,
SIZE_2ULIST, SIZE_2JLIST,
SIZE_3STORED, SIZE_3PARTY,
SIZE_4STORED, SIZE_4PARTY,
SIZE_5PARTY,
SIZE_6STORED, SIZE_6PARTY
}.Contains((int)len);
}
// C# PKX Function Library
@@ -523,6 +536,8 @@ public static Image getSprite(int species, int form, int gender, int item, bool
Image itemimg = (Image)Resources.ResourceManager.GetObject("item_" + item) ?? Resources.helditem;
if ((generation == 3 || generation == 4) && 328 <= item && item <= 419) // gen3/4 TM
itemimg = Resources.item_tm;
if (generation == 2)
itemimg = Resources.helditem; // Don't even try
// Redraw
baseImage = Util.LayerImage(baseImage, itemimg, 22 + (15 - itemimg.Width) / 2, 15 + (15 - itemimg.Height), 1);
@@ -1698,11 +1713,13 @@ public static ushort getG4Item(ushort g3val)
{0xB7, "x"},
{0xB8, "y"},
{0xB9, "z"},
{0xE0, ""},
{0xE1, "{"}, /* Pk */
{0xE2, "}"}, /* Mn */
{0xE3, "-"},
{0xE6, "?"},
{0xE7, "!"},
{0xE8, "."}, // Alias decimal point to .
{0xEF, "♂"},
{0xF2, "."},
{0xF3, "/"},
@@ -1782,6 +1799,8 @@ public static ushort getG4Item(ushort g3val)
{"x", 0xB7},
{"y", 0xB8},
{"z", 0xB9},
{"'", 0xE0}, // Alias ' to for Farfetch'd
{"", 0xE0},
{"{", 0xE1}, /* Pk */
{"}", 0xE2}, /* Mn */
{"-", 0xE3},
@@ -1961,7 +1980,17 @@ public static ushort getG4Item(ushort g3val)
{"ー", 0xE3},
{"ァ", 0xE9},
{"♂", 0xEF},
{"♀", 0xF5}
{"♀", 0xF5},
{"0", 0xF6},
{"1", 0xF7},
{"2", 0xF8},
{"3", 0xF9},
{"4", 0xFA},
{"5", 0xFB},
{"6", 0xFC},
{"7", 0xFD},
{"8", 0xFE},
{"9", 0xFF}
};
private static Dictionary<byte, string> RBY2U_J => new Dictionary<byte, string> {
@@ -2117,29 +2146,20 @@ public static ushort getG4Item(ushort g3val)
{0xE3, "ー"},
{0xE9, "ァ"},
{0xEF, "♂"},
{0xF5, "♀"}
{0xF5, "♀"},
{0xF6, "0"},
{0xF7, "1"},
{0xF8, "2"},
{0xF9, "3"},
{0xFA, "4"},
{0xFB, "5"},
{0xFC, "6"},
{0xFD, "7"},
{0xFE, "8"},
{0xFF, "9"}
};
#endregion
#region Gen 1 Item Table
public static string[] getG1ItemList()
{
return new[] { "(None)", "Master Ball", "Ultra Ball", "Great Ball", "Poké Ball", "Town Map", "Bicycle", "????? (7)", "Safari Ball", "Pokédex", "Moon Stone", "Antidote", "Burn Heal", "Ice Heal", "Awakening", "Parlyz Heal", "Full Restore", "Max Potion", "Hyper Potion", "Super Potion", "Potion", "BoulderBadge", "CascadeBadge", "ThunderBadge", "RainbowBadge", "SoulBadge", "MarshBadge", "VolcanoBadge", "EarthBadge", "Escape Rope", "Repel", "Old Amber", "Fire Stone", "Thunder Stone", "Water Stone", "HP Up", "Protein", "Iron", "Carbos", "Calcium", "Rare Candy", "Dome Fossil", "Helix Fossil", "Secret Key", "????? (44)", "Bike Voucher", "X Accuracy", "Leaf Stone", "Card Key", "Nugget", "PP Up (Unused)", "Poké Doll", "Full Heal", "Revive", "Max Revive", "Guard Spec.", "Super Repel", "Max Repel", "Dire Hit", "Coin", "Fresh Water", "Soda Pop", "Lemonade", "S.S. Ticket", "Gold Teeth", "X Attack", "X Defend", "X Speed", "X Special", "Coin Case", "Oak's Parcel", "Itemfinder", "Silph Scope", "Poké Flute", "Lift Key", "Exp. All", "Old Rod", "Good Rod", "Super Rod", "PP Up", "Ether", "Max Ether", "Elixer", "Max Elixer", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "HM01", "HM02", "HM03", "HM04", "HM05", "TM01", "TM02", "TM03", "TM04", "TM05", "TM06", "TM07", "TM08", "TM09", "TM10", "TM11", "TM12", "TM13", "TM14", "TM15", "TM16", "TM17", "TM18", "TM19", "TM20", "TM21", "TM22", "TM23", "TM24", "TM25", "TM26", "TM27", "TM28", "TM29", "TM30", "TM31", "TM32", "TM33", "TM34", "TM35", "TM36", "TM37", "TM38", "TM39", "TM40", "TM41", "TM42", "TM43", "TM44", "TM45", "TM46", "TM47", "TM48", "TM49", "TM50", "TM51", "TM52", "TM53", "TM54", "TM55" };
}
#endregion
public static int[] getG1LegalItems()
{
return Enumerable.Range(0, 7) // 0-6
.Concat(Enumerable.Range(10, 11)) // 10-20
.Concat(Enumerable.Range(29, 15)) // 29-43
.Concat(Enumerable.Range(45, 5)) // 45-49
.Concat(Enumerable.Range(51, 8)) // 51-58
.Concat(Enumerable.Range(60, 24)) // 60-83
.Concat(Enumerable.Range(196, 54)) // 196-249
.ToArray();
}
public static int getG1Species(int raw_id)
{
int[] table = { 0x00, 0x70, 0x73, 0x20, 0x23, 0x15, 0x64, 0x22, 0x50, 0x02, 0x67, 0x6C, 0x66, 0x58, 0x5E, 0x1D, 0x1F, 0x68, 0x6F, 0x83, 0x3B, 0x97, 0x82, 0x5A, 0x48, 0x5C, 0x7B, 0x78, 0x09, 0x7F, 0x72, 0x00, 0x00, 0x3A, 0x5F, 0x16, 0x10, 0x4F, 0x40, 0x4B, 0x71, 0x43, 0x7A, 0x6A, 0x6B, 0x18, 0x2F, 0x36, 0x60, 0x4C, 0x00, 0x7E, 0x00, 0x7D, 0x52, 0x6D, 0x00, 0x38, 0x56, 0x32, 0x80, 0x00, 0x00, 0x00, 0x53, 0x30, 0x95, 0x00, 0x00, 0x00, 0x54, 0x3C, 0x7C, 0x92, 0x90, 0x91, 0x84, 0x34, 0x62, 0x00, 0x00, 0x00, 0x25, 0x26, 0x19, 0x1A, 0x00, 0x00, 0x93, 0x94, 0x8C, 0x8D, 0x74, 0x75, 0x00, 0x00, 0x1B, 0x1C, 0x8A, 0x8B, 0x27, 0x28, 0x85, 0x88, 0x87, 0x86, 0x42, 0x29, 0x17, 0x2E, 0x3D, 0x3E, 0x0D, 0x0E, 0x0F, 0x00, 0x55, 0x39, 0x33, 0x31, 0x57, 0x00, 0x00, 0x0A, 0x0B, 0x0C, 0x44, 0x00, 0x37, 0x61, 0x2A, 0x96, 0x8F, 0x81, 0x00, 0x00, 0x59, 0x00, 0x63, 0x5B, 0x00, 0x65, 0x24, 0x6E, 0x35, 0x69, 0x00, 0x5D, 0x3F, 0x41, 0x11, 0x12, 0x79, 0x01, 0x03, 0x49, 0x00, 0x76, 0x77, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x4E, 0x13, 0x14, 0x21, 0x1E, 0x4A, 0x89, 0x8E, 0x00, 0x51, 0x00, 0x00, 0x04, 0x07, 0x05, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x2C, 0x2D, 0x45, 0x46, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace PKHeX
@@ -30,6 +31,7 @@ public class ShowdownSet
public int[] EVs;
public int[] IVs;
public int[] Moves;
public readonly List<string> InvalidLines = new List<string>();
// Parsing Utility
public ShowdownSet(string input = null)
@@ -118,7 +120,10 @@ public ShowdownSet(string input = null)
{
string type = moveString.Remove(0, 13).Replace("[", "").Replace("]", ""); // Trim out excess data
int hpVal = Array.IndexOf(hptypes, type); // Get HP Type
if (hpVal >= 0) IVs = PKX.setHPIVs(hpVal, IVs); // Get IVs
if (hpVal >= 0)
IVs = PKX.setHPIVs(hpVal, IVs); // Get IVs
else
InvalidLines.Add($"Invalid Hidden Power Type: {type}");
}
moveString = "Hidden Power";
}
@@ -136,20 +141,45 @@ public ShowdownSet(string input = null)
case "Level": { Level = Util.ToInt32(brokenline[1]); break; }
case "Shiny": { Shiny = brokenline[1] == "Yes"; break; }
case "Happiness": { Friendship = Util.ToInt32(brokenline[1]); break; }
case "Nature": { Nature = Array.IndexOf(natures, brokenline[1]); break; }
case "EVs":
{
// Get EV list String
string[] evlist = brokenline[1].Replace("SAtk", "SpA").Replace("SDef", "SpD").Replace("Spd", "Spe").Split(new[] { " / ", " " }, StringSplitOptions.None);
for (int i = 0; i < evlist.Length / 2; i++)
EVs[Array.IndexOf(StatNames, evlist[1 + i * 2])] = (byte)Util.ToInt32(evlist[0 + 2 * i]);
string[] evlist = brokenline[1]
// Because people think they can type sets out...
.Replace("SAtk", "SpA").Replace("Sp Atk", "SpA")
.Replace("SDef", "SpD").Replace("Sp Def", "SpD")
.Replace("Spd", "Spe").Replace("Speed", "Spe").Split(new[] { " / ", " " }, StringSplitOptions.None);
for (int i = 0; i < evlist.Length/2; i++)
{
ushort EV;
ushort.TryParse(evlist[i * 2 + 0], out EV);
int index = Array.IndexOf(StatNames, evlist[i*2 + 1]);
if (index > -1)
EVs[index] = EV;
else
InvalidLines.Add($"Unknown EV Type input: {evlist[i*2]}");
}
break;
}
case "IVs":
{
// Get IV list String
string[] ivlist = brokenline[1].Split(new[] { " / ", " " }, StringSplitOptions.None);
for (int i = 0; i < ivlist.Length / 2; i++)
IVs[Array.IndexOf(StatNames, ivlist[1 + i * 2])] = (byte)Util.ToInt32(ivlist[0 + 2 * i]);
string[] ivlist = brokenline[1]
// Because people think they can type sets out...
.Replace("SAtk", "SpA").Replace("Sp Atk", "SpA")
.Replace("SDef", "SpD").Replace("Sp Def", "SpD")
.Replace("Spd", "Spe").Replace("Speed", "Spe").Split(new[] { " / ", " " }, StringSplitOptions.None);
for (int i = 0; i < ivlist.Length/2; i++)
{
byte IV;
byte.TryParse(ivlist[i*2 + 0], out IV);
int index = Array.IndexOf(StatNames, ivlist[i*2 + 1]);
if (index > -1)
IVs[index] = IV;
else
InvalidLines.Add($"Unknown IV Type input: {ivlist[i * 2]}");
}
break;
}
default:
@@ -185,6 +215,7 @@ public ShowdownSet(string input = null)
)
{
string[] tmp = spec.Split(new[] { "-" }, StringSplitOptions.None);
if (tmp.Length < 2) return;
Species = Array.IndexOf(species, tmp[0].Replace(" ", ""));
Form = tmp[1].Trim();
if (tmp.Length > 2)
@@ -194,7 +225,13 @@ public ShowdownSet(string input = null)
else if (brokenline[0].Contains("Nature"))
Nature = Array.IndexOf(natures, line.Split(' ')[0]);
else // Fallback
Species = Array.IndexOf(species, line.Split('(')[0]);
{
int spec = Array.IndexOf(species, line.Split('(')[0]);
if (spec > 0)
Species = spec;
else
InvalidLines.Add(line);
}
}
break;
}
@@ -206,9 +243,9 @@ public string getText()
return "";
// First Line: Name, Nickname, Gender, Item
string result = string.Format(species[Species] != Nickname ? "{0} ({1})" : "{1}", Nickname,
string result = string.Format(Nickname != null && species[Species] != Nickname ? "{0} ({1})" : "{1}", Nickname,
species[Species] + ((Form ?? "") != "" ? "-" + Form?.Replace("Mega ", "Mega-") : "")) // Species (& Form if necessary)
+ Gender + (Item != 0 ? " @ " + items[Item] : "") + Environment.NewLine;
+ Gender + (Item > 0 ? " @ " + items[Item] : "") + Environment.NewLine;
// IVs
string[] ivstr = new string[6];
@@ -235,12 +272,14 @@ public string getText()
result += "EVs: " + string.Join(" / ", evstr.Take(evctr)) + Environment.NewLine;
// Secondary Stats
result += "Ability: " + abilities[Ability] + Environment.NewLine;
if (Ability > -1)
result += "Ability: " + abilities[Ability] + Environment.NewLine;
result += "Level: " + Level + Environment.NewLine;
if (Shiny)
result += "Shiny: Yes" + Environment.NewLine;
result += natures[Nature] + " Nature" + Environment.NewLine;
if (Nature > -1)
result += natures[Nature] + " Nature" + Environment.NewLine;
// Add in Moves
string[] MoveLines = new string[Moves.Length];
int movectr = 0;

View File

@@ -0,0 +1,80 @@
using System.Linq;
namespace PKHeX
{
public class PersonalInfoG2 : PersonalInfo
{
protected PersonalInfoG2() { }
public const int SIZE = 0x20;
public PersonalInfoG2(byte[] data)
{
if (data.Length != SIZE)
return;
Data = data;
TMHM = getBits(Data.Skip(0x18).Take(0x8).ToArray());
}
public override byte[] Write()
{
setBits(TMHM).CopyTo(Data, 0x18);
return Data;
}
public int DEX_ID { get { return Data[0x00]; } set { Data[0x00] = (byte)value; } }
public override int HP { get { return Data[0x01]; } set { Data[0x01] = (byte)value; } }
public override int ATK { get { return Data[0x02]; } set { Data[0x02] = (byte)value; } }
public override int DEF { get { return Data[0x03]; } set { Data[0x03] = (byte)value; } }
public override int SPE { get { return Data[0x04]; } set { Data[0x04] = (byte)value; } }
public override int SPA { get { return Data[0x05]; } set { Data[0x05] = (byte)value; } }
public override int SPD { get { return Data[0x06]; } set { Data[0x06] = (byte)value; } }
public override int[] Types
{
get { return new int[] { Data[0x07], Data[0x08] }; }
set
{
if (value?.Length != 2) return;
Data[0x07] = (byte)value[0];
Data[0x08] = (byte)value[1];
}
}
public override int CatchRate { get { return Data[0x09]; } set { Data[0x09] = (byte)value; } }
public override int BaseEXP { get { return Data[0x0A]; } set { Data[0x0A] = (byte)value; } }
public override int[] Items
{
get { return new int[] { Data[0xB], Data[0xC] }; }
set
{
if (value?.Length != 2) return;
Data[0xB] = (byte) value[0];
Data[0xC] = (byte) value[1];
}
}
public override int Gender { get { return Data[0xD]; } set { Data[0xD] = (byte)value; } }
public override int HatchCycles { get { return Data[0xF]; } set { Data[0xF] = (byte)value; } }
public override int EXPGrowth { get { return Data[0x16]; } set { Data[0x16] = (byte)value; } }
public override int[] EggGroups
{
get { return new[] { Data[0x17] >> 4, Data[0x17] & 0xF }; }
set
{
if (value?.Length != 2) return;
Data[0x17] = (byte)(((value[0] & 0xF) << 4) | (value[1] & 0xF));
}
}
// EV Yields are just aliases for base stats in Gen I
public override int EV_HP { get { return HP; } set { } }
public override int EV_ATK { get { return ATK; } set { } }
public override int EV_DEF { get { return DEF; } set { } }
public override int EV_SPE { get { return SPE; } set { } }
public override int EV_SPA { get { return SPA; } set { } }
public override int EV_SPD { get { return SPD; } set { } }
// Future game values, unused
public override int[] Abilities { get { return new[] { 0, 0 }; } set { } }
public override int BaseFriendship { get { return 70; } set { } }
public override int EscapeRate { get { return 0; } set { } }
public override int Color { get { return 0; } set { } }
}
}

View File

@@ -15,6 +15,8 @@ public class PersonalTable
internal static readonly PersonalTable FR = new PersonalTable(Properties.Resources.personal_fr, GameVersion.FR);
internal static readonly PersonalTable E = new PersonalTable(Properties.Resources.personal_e, GameVersion.E);
internal static readonly PersonalTable RS = new PersonalTable(Properties.Resources.personal_rs, GameVersion.RS);
internal static readonly PersonalTable C = new PersonalTable(Properties.Resources.personal_c, GameVersion.C);
internal static readonly PersonalTable GS = new PersonalTable(Properties.Resources.personal_c, GameVersion.GS);
internal static readonly PersonalTable RBY = new PersonalTable(Properties.Resources.personal_rby, GameVersion.RBY);
private static byte[][] splitBytes(byte[] data, int size)
@@ -33,6 +35,8 @@ private PersonalTable(byte[] data, GameVersion format)
switch (format)
{
case GameVersion.RBY: size = PersonalInfoG1.SIZE; break;
case GameVersion.GS:
case GameVersion.C: size = PersonalInfoG2.SIZE; break;
case GameVersion.RS:
case GameVersion.E:
case GameVersion.FR:
@@ -58,6 +62,11 @@ private PersonalTable(byte[] data, GameVersion format)
for (int i = 0; i < d.Length; i++)
d[i] = new PersonalInfoG1(entries[i]);
break;
case GameVersion.GS:
case GameVersion.C:
for (int i = 0; i < d.Length; i++)
d[i] = new PersonalInfoG2(entries[i]);
break;
case GameVersion.RS:
case GameVersion.E:
case GameVersion.FR:

File diff suppressed because it is too large Load Diff

View File

@@ -6397,4 +6397,55 @@
<data name="personal_rby" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\byte\personal_rby;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="text_gsc_00000_en" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_gsc_00000_en.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="text_ItemsG1_en" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_ItemsG1_en.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="personal_c" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\byte\personal_c;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="personal_gs" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\byte\personal_gs;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="text_ItemsG2_en" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\text\gen3\text_itemsg2_en.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="_172_1" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\img\Pokemon Sprites\172_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="gift" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\img\Program\gift.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="text_gsc_00000_es" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_gsc_00000_es.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="text_gsc_00000_zh" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_gsc_00000_zh.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="text_ItemsG1_es" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_ItemsG1_es.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="text_ItemsG1_zh" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_ItemsG1_zh.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="text_ItemsG2_es" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_ItemsG2_es.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="text_ItemsG2_zh" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_ItemsG2_zh.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="text_ItemsG3_es" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_ItemsG3_es.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="text_ItemsG3_zh" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_ItemsG3_zh.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="text_rsefrlg_00000_es" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_rsefrlg_00000_es.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
<data name="text_rsefrlg_00000_zh" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text\gen3\text_rsefrlg_00000_zh.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
</root>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

After

Width:  |  Height:  |  Size: 1013 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 999 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 B

View File

@@ -21,7 +21,7 @@ Menu_Open = Open...
Menu_Save = Save PKM...
Menu_ExportSAV = Export SAV...
Menu_ExportMAIN = Export main
Menu_ExportBAK = Export BAK
Menu_ExportBAK = Export Backup
Menu_Exit = Quit
--
Menu_Tools = Tools
@@ -38,6 +38,8 @@ Menu_LoadBoxes = Load Boxes
Menu_DumpBoxes = Dump Boxes
Menu_Report = Box Data Report
Menu_Database = PKM Database
Menu_MGDatabase = Mystery Gift Database
Menu_BatchEditor = Batch Editor
Menu_Other = Other
Menu_OpenSDF = Open SaveDataFiler Folder
Menu_OpenSDB = Open SaveDataBackup Folder
@@ -92,6 +94,7 @@ Label_EggLocation = Location:
Label_EggDate = Date:
--------------------Stats Tab Data----------------------
Tab_Stats = Stats
CHK_HackedStats = Hacked Stats
Label_IVs = IVs
Label_EVs = EVs
Label_Stats = Stats
@@ -101,6 +104,7 @@ Label_DEF = Def:
Label_SPA = SpA:
Label_SPD = SpD:
Label_SPE = Spe:
Label_SPC = SpC:
Label_Total = Total:
Label_HiddenPowerPrefix = Hidden Power Type:
Label_CharacteristicPrefix = Characteristic:
@@ -144,15 +148,18 @@ B_OpenItemPouch = Items
B_OpenTrainerInfo = Trainer Info
B_OUTPasserby = Passerby
B_OpenBoxLayout = Box Layout
B_OpenWondercards = WonderCard
B_OpenWondercards = Mystery Gift
B_OpenSuperTraining = Super Train
B_OpenHallofFame = Hall of Fame
B_OpenOPowers = O-Powers
B_OpenEventFlags = Event Flags
B_OpenPokedex = Pokédex
B_OpenBerryField = Berry Field
B_OpenPokeBlocks = Pokéblocks
B_OpenLinkInfo = Link Data
--
B_OpenSecretBase = Secret Base
B_CGearSkin = C-Gear Skin
--------------------Tab Internals-----------------------
L_Party = Party:
L_BattleBox = Battle Box:
@@ -363,6 +370,66 @@ L_Arguments = Disabled ; Never left ; OT ; Past Gen ; Memories with ; Pokémon ;
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_PokeBlockORAS = Pokéblock Editor
- Change stuff below this line, not above.
-------------------------------------------------------
L_Red = Red Pokéblocks:
L_Blue = Blue Pokéblocks:
L_Pink = Pink Pokéblocks:
L_Green = Green Pokéblocks:
L_Yellow = Yellow Pokéblocks:
L_Rainbow = Rainbow Pokéblocks:
L_Red = Red Pokéblocks +:
L_Blue = Blue Pokéblocks +:
L_Pink = Pink Pokéblocks +:
L_Green = Green Pokéblocks +:
L_Yellow = Yellow Pokéblocks +:
L_Rainbow = Rainbow Pokéblocks +:
B_RandomizeBerries = Randomize Berries
B_GiveAllBlocks = Give All Blocks
B_Cancel = Cancel
B_Save = Save
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_Link6 = Pokémon Link Tool
- Change stuff below this line, not above.
-------------------------------------------------------
TAB_Main = Main
TAB_PKM = Pokémon
TAB_Items = Items
L_BP = Battle Points:
L_Pokemiles: PokéMiles
CHK_LinkAvailable = Pokémon Link Enabled
B_Import = Import
B_Export = Export
B_Cancel = Cancel
B_Save = Save
L_Item1 = Item 1:
L_Item2 = Item 2:
L_Item3 = Item 3:
L_Item4 = Item 4:
L_Item5 = Item 5:
L_Item6 = Item 6:
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SuperTrain = Super Training Records
- Change stuff below this line, not above.
----------------------Buttons--------------------------
L_Records = Records
L_Bags = Training Bags
L_Species = Species:
L_Unk = L_Unk
L_Time0 = Time:
L_Time1 = Time1
L_Time2 = Time2
L_UNKNOWN = UNKNOWN
L_Species2 = Species
B_Cancel = Cancel
B_Save = Save
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_BerryField = Berry Field Viewer
- Change stuff below this line, not above.
-------------------------------------------------------
@@ -525,13 +592,14 @@ B_Cancel = Cancel
- Change stuff below this line, not above.
------------------------------------------------------
L_goto = goto:
GB_Owned = Owned
CHK_P1 = Obtained
GB_Owned = Seen
CHK_P2 = Male
CHK_P3 = Female
CHK_P4 = Shiny Male
CHK_P5 = Shiny Female
GB_Encountered = Encountered
GB_Owned = Owned
CHK_P1 = Obtained
GB_Displayed = Displayed
CHK_P6 = Male
CHK_P7 = Female
CHK_P8 = Shiny Male
@@ -606,6 +674,7 @@ Label_EncryptionConstant = Encryption Constant:
CHK_Nicknamed = Nickname:
Label_Species = Species:
L_PartyNum = Party Index:
B_Delete = Delete
B_Close = Save
! End
! -----------------------------------------------------
@@ -613,12 +682,7 @@ B_Close = Save
! SAV_Inventory = Inventory Editor
- Change stuff below this line, not above.
-------------------------------------------------------
GB_Pouch = Pouches
B_DisplayBerries = Berry
B_DisplayMedicine = Medicine
B_DisplayTMHM = TM/HM
B_DisplayKeyItems = Key Items
B_DisplayItems = Items
B_GiveAll = Give All
B_Save = Save
B_Cancel = Cancel
! End
@@ -723,14 +787,20 @@ L_PPUps = PPUps
-------------------------------------------------------
Tab_Multiplayer = Multiplayer
L_MultiplayerSprite = Multiplayer Sprite:
L_Style = Style:
GB_Sayings = Saved Sayings
L_Saying1 = 1:
L_Saying2 = 2:
L_Saying3 = 3:
L_Saying4 = 4:
L_Saying5 = 5:
--
Tab_BadgeMap = Badges/Map
GB_Map = Map Position
L_CurrentMap = Current Map:
L_X = X Coordinate:
L_Z = Z Coordinate:
L_Y = Y Coordinate:
L_Offset = (offset)
--
Tab_Appearance = Current Appearance (X/Y)
L_Outfit = Outfit Vals
B_GiveAccessories = Give All Accessories
@@ -745,6 +815,8 @@ L_FacialHair = Facial Hair:
L_Hairstyle = Hairstyle:
L_HairColor = Hair Color:
L_SkinColor = Skin Color:
--
Tab_Maison = Maison
GB_MaisonCurrent = Maison Streaks (Current)
L_SuperC = Super
L_NormalC = Normal
@@ -764,32 +836,35 @@ L_SinglesB = Singles:
B_Save = Save
L_Stats = Stats
B_Cancel = Cancel
--
Tab_Overview = Overview
L_Seconds = Sec:
L_Minutes = Min:
L_Hours = Hrs:
L_TrainerName = Trainer Name:
L_Language = Language:
L_PM = PokéMiles:
L_Region = Region:
L_BP = BP:
L_Country = Country:
B_MaxCash = +
L_3DSReg = 3DS Region:
L_Money = $:
L_SID = SID:
L_TID = TID:
L_TrainerName = Trainer Name:
L_SID = SID:
-
GB_Adventure = Adventure Info
L_Seconds = Sec:
L_Minutes = Min:
L_Hours = Hrs:
L_Started = Game Started:
L_Fame = HoF Entered:
L_LastSaved = Last Saved:
-
L_PM = PokéMiles:
L_BP = BP:
L_Style = Style:
L_Value = Value
GB_Sayings = Saved Sayings
L_Saying1 = 1:
L_Saying2 = 2:
L_Saying3 = 3:
L_Saying4 = 4:
L_Saying5 = 5:
L_Offset = (offset)
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_Wondercard = Wonder Card I/O
! SAV_Wondercard = Mystery Gift I/O
- Change stuff below this line, not above.
-------------------------------------------------------
L_Details = Details:

View File

@@ -38,6 +38,8 @@ Menu_LoadBoxes = Cargar Cajas
Menu_DumpBoxes = Exportar Cajas
Menu_Report = Informe de la caja
Menu_Database = Base de datos de PKM
Menu_MGDatabase = Base de datos de regalo misterioso
Menu_BatchEditor = Editor por lotes
Menu_Other = Otro
Menu_OpenSDF = Abrir carpeta SaveDataFiler
Menu_OpenSDB = Abrir carpeta SaveDataBackup
@@ -76,6 +78,8 @@ Label_PKRSdays = d:
Label_Country = País:
Label_SubRegion = Subregión:
Label_3DSRegion = Región 3DS:
L_NSparkle = Brillo de N
CHK_NSparkle = Activo
---------------------Met Tab Data-----------------------
Tab_Met = Conocido
Label_OriginGame = Juego Original:
@@ -92,15 +96,17 @@ Label_EggLocation = Lugar:
Label_EggDate = Fecha:
--------------------Stats Tab Data----------------------
Tab_Stats = Estadísticas
CHK_HackedStats = Estadísticas Hackeadas
Label_IVs = IVs
Label_EVs = EVs
Label_Stats = Estad.
Label_Stats = Esta.
Label_HP = PS:
Label_ATK = Atq:
Label_DEF = Def:
Label_SPA = Atq E:
Label_SPD = Def E:
Label_SPE = Velo:
Label_ATK = Ataque:
Label_DEF = Defensa:
Label_SPA = Atq. Esp.:
Label_SPD = Def. Esp.:
Label_SPE = Velocidad:
Label_SPC = Especial:
Label_Total = Total:
Label_HiddenPowerPrefix = Tipo del Poder Oculto:
Label_CharacteristicPrefix = Características:
@@ -142,34 +148,37 @@ Tab_SAV = SAV
B_OpenPokePuffs = Pokélito
B_OpenItemPouch = Inventario
B_OpenTrainerInfo = Entrenador
B_OUTPasserby = Transeúntes
B_OpenBoxLayout = Fondos Cajas
B_OpenWondercards = Tarjetas Misteriosas
B_OpenBerryField = C. de Bayas
B_OpenSuperTraining = Superentren.
B_OpenHallofFame = Hall de la fama
B_OpenOPowers = Poder O
B_OpenEventFlags = Eventos
B_OpenPokedex = Pokédex
B_OpenSuperTraining = Superentren.
B_OpenBerryField = C. de Bayas
B_OpenPokeBlocks = Pokécubos
B_OpenLinkInfo = Datos Enlace
--
B_OpenSecretBase = Base Secreta
B_CGearSkin = C-Gear
--------------------Tab Internals-----------------------
L_Party = Equipo:
L_BattleBox = Caja de Combate:
L_ReadOnlyPBB = Sólo leer.
L_ReadOnlyPBB = Sólo lectura.
GB_Daycare = Guardería
GB_GTS = GTS
GB_Fused = Fusionado
GB_Fused = Fusión
GB_SUBE = Viejo
DayCare_HasEgg = Huevo Disponible
L_DaycareSeed = Seed
L_ReadOnlyOther = Sólo leer.
L_DaycareSeed = Semill.
L_ReadOnlyOther = Sólo lectura.
B_JPEG = Guardar PGL .JPEG
B_OpenHallofFame = Hall de la fama
B_OUTPasserby = Transeúntes
B_VerifyCHK = Checksums
B_SaveBoxBin = Save Box Data++
L_GameSync = Game Sync ID:
L_Secure1 = Secure Value 1:
L_Secure2 = Secure Value 2:
B_SaveBoxBin = Guardar Cajas++
L_GameSync = ID de Sincronización:
L_Secure1 = Valor Seguro 1:
L_Secure2 = Valor Seguro 2:
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
@@ -293,23 +302,23 @@ B_Save = Guardar
------------------Super Training-----------------------
CHK_SuperTraining = Superentrenamiento Normal
CHK_SuperTrain1_HP = Nv. 1: PS
CHK_SuperTrain1_ATK = Nv. 1: Atq
CHK_SuperTrain1_DEF = Nv. 1: Def
CHK_SuperTrain1_SPA = Nv. 1: AtE
CHK_SuperTrain1_SPD = Nv. 1: DfE
CHK_SuperTrain1_SPE = Nv. 1: Vel
CHK_SuperTrain1_ATK = Nv. 1: Ataque
CHK_SuperTrain1_DEF = Nv. 1: Defensa
CHK_SuperTrain1_SPA = Nv. 1: Ataque Especial
CHK_SuperTrain1_SPD = Nv. 1: Defensa Especial
CHK_SuperTrain1_SPE = Nv. 1: Velocidad
CHK_SuperTrain2_HP = Nv. 2: PS
CHK_SuperTrain2_ATK = Nv. 2: Atq
CHK_SuperTrain2_DEF = Nv. 2: Def
CHK_SuperTrain2_SPA = Nv. 2: AtE
CHK_SuperTrain2_SPD = Nv. 2: DfE
CHK_SuperTrain2_SPE = Nv. 2: Vel
CHK_SuperTrain2_ATK = Nv. 2: Ataque
CHK_SuperTrain2_DEF = Nv. 2: Defensa
CHK_SuperTrain2_SPA = Nv. 2: Ataque Especial
CHK_SuperTrain2_SPD = Nv. 2: Defensa Especial
CHK_SuperTrain2_SPE = Nv. 2: Velocidad
CHK_SuperTrain3_HP = Nv. 3: PS
CHK_SuperTrain3_ATK = Nv. 3: Atq
CHK_SuperTrain3_DEF = Nv. 3: Def
CHK_SuperTrain3_SPA = Nv. 3: AtE
CHK_SuperTrain3_SPD = Nv. 3: DfE
CHK_SuperTrain3_SPE = Nv. 3: Vel
CHK_SuperTrain3_ATK = Nv. 3: Ataque
CHK_SuperTrain3_DEF = Nv. 3: Defensa
CHK_SuperTrain3_SPA = Nv. 3: Ataque Especial
CHK_SuperTrain3_SPD = Nv. 3: Defensa Especial
CHK_SuperTrain3_SPE = Nv. 3: Velocidad
CHK_SecretUnlocked = Superentrenamiento Desbloqueado
CHK_SecretComplete = Superentrenamiento Completa
CHK_SuperTrain4_1 = Nv. 4: Dificultad tras otra
@@ -330,20 +339,25 @@ L_Hits = Golpes restantes:
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! MemoryAmie = Editor de Memorias / Amigos
! MemoryAmie = Editor de Memorias / Poké Recreo
- Change stuff below this line, not above.
---------------------Bottom UI-------------------------
BTN_Cancel = Cancelar
BTN_Save = Guardar
L_Handler = Manejador Actual:
L_Handler = Dueño Actual:
B_ClearAll = Limpiar todo
-
Tab_OTMemory = Memorias con: EO
L_OT_Friendship = Amistad:
L_OT_Affection = Cariño:
L_OT_Affection = Afecto:
L_OT_TextLine = Tipo Memoria:
Tab_CTMemory = Memorias con: noEO
L_CT_Friendship = Amistad:
L_cT_Affection = Cariño:
Tab_Residence = Residencia
GB_Residence = El Pokémon ha residido en:
L_Enjoyment = Diversión:
L_Fullness = Saciedad:
--
L_Country = País
L_Region = Región
@@ -353,7 +367,7 @@ L_Geo2 = Anterior 2:
L_Geo3 = Anterior 3:
L_Geo4 = Anterior 4:
--
L_Arguments = Disabled ; Never left ; OT ; Past Gen ; Memories with ; Pokémon ; Area ; Item(s) ; Move ; Location ;
L_Arguments = Deshabilitado ; Nunca dejado ; EO ; Gen Pas ; Memorias con ; Pokémon ; Área ; Objeto(s) ; Mov. ; Localización ;
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
@@ -364,12 +378,73 @@ L_Arguments = Disabled ; Never left ; OT ; Past Gen ; Memories with ; Pokémon ;
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_PokeBlockORAS = Editor de Pokécubos
- Change stuff below this line, not above.
-------------------------------------------------------
L_Red = Pokécubos Rojos:
L_Blue = Pokécubos Azules:
L_Pink = Pokécubos Rosas:
L_Green = Pokécubos Verdes:
L_Yellow = Pokécubos Amarillos:
L_Rainbow = Pokécubos Arcoíris:
L_Red = Pokécubos Rojos Plus:
L_Blue = Pokécubos Azules Plus:
L_Pink = Pokécubos Rosas Plus:
L_Green = Pokécubos Verdes Plus:
L_Yellow = Pokécubos Amarillos Plus:
L_Rainbow = Pokécubos Arcoíris Plus:
B_RandomizeBerries = PkCubos aleatorios
B_GiveAllBlocks = Todos Max
B_Cancel = Cancelar
B_Save = Guardar
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_Link6 = Editor de Enlace de Datos
- Change stuff below this line, not above.
-------------------------------------------------------
TAB_Main = Inicio
TAB_PKM = Pokémon
TAB_Items = Objetos
L_BP = Ptos Batalla:
L_Pokemiles: PokéMillas
CHK_LinkAvailable = Habilitar Pokémon Link
B_Import = Importar
B_Export = Exportar
B_Cancel = Cancelar
B_Save = Guardar
L_Item1 = Objeto 1:
L_Item2 = Objeto 2:
L_Item3 = Objeto 3:
L_Item4 = Objeto 4:
L_Item5 = Objeto 5:
L_Item6 = Objeto 6:
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_SuperTrain = Records de Superentrenamiento
- Change stuff below this line, not above.
----------------------Buttons--------------------------
L_Records = Records
L_Bags = Bolsas de Entrenamiento
L_Species = Especie:
L_Unk = L_Unk
L_Time0 = Tiempo:
L_Time1 = Tiempo1
L_Time2 = Tiempo2
L_UNKNOWN = DESCONOCIDO
L_Species2 = Especie
B_Cancel = Cancelar
B_Save = Guardar
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_BerryField = Visor de Campos de Bayas
- Change stuff below this line, not above.
-------------------------------------------------------
L_Berry = Baya:
L_Field = Campo:
L_Unfinished = Unfinished: Needs More Research
L_Unfinished = Sin acabar: Necesita más investigación
L_u1 = 1
L_u2 = 2
L_u3 = 3
@@ -397,7 +472,7 @@ L_BoxName = Nombre de la caja:
! SAV_EventFlagsORAS = Editor de Eventos (ORAS)
- Change stuff below this line, not above.
------------------------------------------------------
L_Ash = Asho volcánico:
L_Ash = Ceniza volcánica:
GB_Misc = Misc
flag_0288 = Multi Statuette
flag_0287 = Rotation Statuette
@@ -412,7 +487,7 @@ flag_0284 = Singles Statuette
GB_Rebattle = Rebattle
flag_2835 = (AS) Latios Capturado
flag_0420 = (AS) Latios Derrotado
L_SkyTower = *Sky Tower
L_SkyTower = *Torre del Cielo
flag_2834 = (OR) Latias Capturado
flag_0419 = (OR) Latias Derrotado
flag_2828 = (OR) Tornadus Capturado
@@ -467,12 +542,12 @@ flag_2831 = (AS) Zekrom Capturado
flag_0183 = (AS) Zekrom Derrotado
flag_2840 = (AS) Kyogre Capturado
flag_0647 = (AS) Kyogre Derrotado
GB_Researcher = FlagDiff Researcher
GB_Researcher = Investigador de FlagDiff
L_UnSet = UnSet
L_IsSet = IsSet
B_LoadNew = Carg. Nuevo
B_LoadOld = Carg. Antiguo
GB_FlagStatus = Check Flag Status
B_LoadOld = Carg. Antig.
GB_FlagStatus = Comprobar Estado de Flags
L_Flag = Flag:
CHK_CustomFlag = Estado:
B_Save = Guardar
@@ -501,11 +576,11 @@ flag_0114 = Zygarde Capturado
flag_0790 = Zygarde Derrotado
flag_0115 = Mewtwo Capturado
flag_0963 = Mewtwo Derrotado
GB_Researcher = FlagDiff Researcher
GB_Researcher = Investigador de FlagDiff
L_UnSet = UnSet
L_IsSet = IsSet
B_LoadNew = Carg. Nuevo
B_LoadOld = Carg. Antiguo
B_LoadOld = Carg. Antig.
flag_2239 = 2239
flag_2238 = 2238
flag_2237 = 2237
@@ -515,7 +590,7 @@ flag_0004 = Flag4
flag_0003 = Flag3
flag_0002 = Flag2
flag_0001 = Flag1
GB_FlagStatus = Check Flag Status
GB_FlagStatus = Comprobar Estado de Flags
L_Flag = Flag:
CHK_CustomFlag = Estado:
B_Cancel = Cancelar
@@ -525,7 +600,7 @@ B_Cancel = Cancelar
! SAV_PokedexORAS = Editor de Pokédex (ORAS)
- Change stuff below this line, not above.
------------------------------------------------------
L_goto = goto:
L_goto = Ir a:
GB_Owned = Obtenido
CHK_P1 = Obtenido
CHK_P2 = Macho
@@ -533,10 +608,14 @@ CHK_P3 = Hembra
CHK_P4 = Macho brillante
CHK_P5 = Hembra brillante
GB_Encountered = Encontrado
GB_Displayed = Aparecido
CHK_P6 = Macho
CHK_P7 = Hembra
CHK_P8 = Macho brillante
CHK_P9 = Hembra brillante
L_FormsSeen = Formas vistas
L_FormDisplayed = Formas mostradas
B_ModifyForms = Modificar...
L_DexNav = Nvl. DexNav:
GB_Language = Idiomas
CHK_L1 = Japonés
@@ -547,7 +626,7 @@ CHK_L5 = Alemán
CHK_L6 = Español
CHK_L7 = Coreano
B_Modify = Modificar...
B_GiveAll = Marcar todos
B_GiveAll = Todos Max
L_Spinda = Spinda:
B_Save = Guardar
B_Cancel = Cancelar
@@ -557,7 +636,7 @@ B_Cancel = Cancelar
! SAV_PokedexXY = Editor de Pokédex (XY)
- Change stuff below this line, not above.
-------------------------------------------------------
L_goto = ir a:
L_goto = Ir a:
GB_Owned = Obtenido
CHK_F1 = Extranjero (Pre)
CHK_P1 = Nativo (Kalos)
@@ -566,11 +645,14 @@ CHK_P2 = Macho
CHK_P3 = Hembra
CHK_P4 = Macho brillante
CHK_P5 = Hembra brillante
GB_Displayed = Mostrado
GB_Displayed = Aparecido
CHK_P6 = Macho
CHK_P7 = Hembra
CHK_P8 = Macho brillante
CHK_P9 = Hembra brillante
L_FormsSeen = Formas vistas
L_FormDisplayed = Formas mostradas
B_ModifyForms = Modificar...
GB_Language = Idiomas
CHK_L1 = Japonés
CHK_L2 = Inglés
@@ -580,7 +662,7 @@ CHK_L5 = Alemán
CHK_L6 = Español
CHK_L7 = Coreano
B_Modify = Modificar...
B_GiveAll = Marcar todos
B_GiveAll = Todos Max
L_Spinda = Spinda:
B_Save = Guardar
B_Cancel = Cancelar
@@ -607,6 +689,7 @@ Label_EncryptionConstant = Cte. de Encriptación:
CHK_Nicknamed = Apodo:
Label_Species = Especie:
L_PartyNum = N. equipo:
B_Delete = Borrar
B_Close = Guardar
! End
! -----------------------------------------------------
@@ -614,12 +697,7 @@ B_Close = Guardar
! SAV_Inventory = Editor de Inventario
- Change stuff below this line, not above.
-------------------------------------------------------
GB_Pouch = Pokélitos
B_DisplayBerries = Bayas
B_DisplayMedicine = Medicinas
B_DisplayTMHM = MT/MO
B_DisplayKeyItems = Objetos clave
B_DisplayItems = Objetos
B_GiveAll = Todos Max
B_Save = Guardar
B_Cancel = Cancelar
! End
@@ -677,7 +755,7 @@ B_Save = Guardar
! SAV_SecretBase = Editor de Bases Secretas
- Change stuff below this line, not above.
-------------------------------------------------------
L_FlagsCaptured = Flags Captur.:
L_FlagsCaptured = Capturadas:
B_FSave = <
B_GiveDecor = Marcar Decoraciones
B_Cancel = Cancelar
@@ -688,10 +766,10 @@ L_Favorite = Favoritos:
f_MAIN = Inicio
L_TrName = Nombre Ent.:
L_BaseLocation = Localización Base:
L_Happy = Happy:
L_Encourage = Encourage:
L_Blackboard = Blackboard:
L_Confetti = Confetti:
L_Happy = Feliz:
L_Encourage = Estimulante:
L_Blackboard = Pizarra:
L_Confetti = Confeti:
L_TeamName = Nombre Eq.:
L_TeamSlogan = Eslógan Eq.:
--
@@ -709,11 +787,11 @@ L_EncryptionConstant = ENC:
L_IVs = IVs
L_EVs = EVs
L_HP = PS
L_ATK = ATQ
L_DEF = DEF
L_SpA = AtE
L_SpD = DfE
L_SPE = VEL
L_ATK = Atq.
L_DEF = Def.
L_SpA = AtqE.
L_SpD = DefE.
L_SPE = Vel.
L_PKFriendship = Amistad:
L_PPUps = PPs
! End
@@ -724,14 +802,20 @@ L_PPUps = PPs
-------------------------------------------------------
Tab_Multiplayer = Multijugador
L_MultiplayerSprite = Icono Multijugador:
L_Style = Estilo:
GB_Sayings = Frases guardadas
L_Saying1 = 1:
L_Saying2 = 2:
L_Saying3 = 3:
L_Saying4 = 4:
L_Saying5 = 5:
--
Tab_BadgeMap = Medallas/Mapa
GB_Map = Posición en el Mapa
L_CurrentMap = Mapa actual:
L_X = Coordenada X:
L_Z = Coordenada Z:
L_Y = Coordenada Y:
L_Offset = (offset)
--
Tab_Appearance = Apariencia (X/Y)
L_Outfit = Valores Atuendos
B_GiveAccessories = Marcar Accesorios
@@ -746,7 +830,9 @@ L_FacialHair = Pelo Facial:
L_Hairstyle = Estilo Pelo:
L_HairColor = Color Pelo:
L_SkinColor = Color Piel:
GB_MaisonCurrent = Maison Streaks (Current)
--
Tab_Maison = Mansión
GB_MaisonCurrent = Rachas Mansión (Actual)
L_SuperC = Super
L_NormalC = Normal
L_MultiC = Multi:
@@ -754,7 +840,7 @@ L_RotationC = Rotation:
L_TriplesC = Triples:
L_DoublesC = Dobles:
L_SinglesC = Indiv.:
GB_MaisonBest = Maison Streaks (Best)
GB_MaisonBest = Rachas Mansión (Mejor)
L_SuperB = Super
L_NormalB = Normal
L_MultiB = Multi:
@@ -765,28 +851,77 @@ L_SinglesB = Indiv:
B_Save = Guardar
L_Stats = Estadísticas
B_Cancel = Cancelar
--
Tab_Overview = Inicio
L_Seconds = Seg:
L_Minutes = Min:
L_Hours = Hrs:
L_TrainerName = Nombre Entr.:
L_Language = Idioma:
L_PM = PokéMillas:
L_Region = Subregión:
L_BP = BP:
L_Country = País:
B_MaxCash = +
L_3DSReg = Región 3DS:
L_Money = $:
L_SID = SID:
L_TID = TID:
L_TrainerName = Nombre Entrena.:
L_SID = SID:
--
GB_Adventure = Información de la Aventura
L_Seconds = Seg:
L_Minutes = Min:
L_Hours = Hrs:
L_Started = Comienzo:
L_Fame = Hall Fama:
L_LastSaved = Último:
--
GB_Stats = Estadísticas
L_PM = PokéMillas:
L_BP = BP:
L_Style = Estilo:
L_Value = Valor
GB_Sayings = Saved Sayings
L_Saying1 = 1:
L_Saying2 = 2:
L_Saying3 = 3:
L_Saying4 = 4:
L_Saying5 = 5:
L_Offset = (offset)
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_SimpleTrainer = Editor del Entrenador
- Change stuff below this line, not above.
-------------------------------------------------------
GB_Trainer = Nombre
L_TrainerName = Nombre Entr.:
B_MaxCash = +
L_Money = $:
L_TID = TID:
L_SID = SID:
GB_Adventure = Información de la Aventura
L_Seconds = Seg:
L_Minutes = Min:
L_Hours = Hrs:
L_Started = Comienzo:
L_Fame = Hall Fama:
GB_Badges = Medallas
GB_Map = Posición en el Mapa
L_CurrentMap = Mapa actual:
L_X = Coordenada X:
L_Z = Coordenada Z:
L_Y = Coordenada Y:
GB_Options = Opciones
label1 = Tipo Son.:
LBL_TextSpeed = Vel. Texto:
LBL_BattleStyle = Estilo Bat.:
CHK_BattleEffects = Usar efectos de batalla
B_Cancel = Cancelar
B_Save = Guardar
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_SimplePokedex = Editor de Pokédex
- Change stuff below this line, not above.
-------------------------------------------------------
label2 = Atrapados:
Label_Seen = Vistos:
B_SeenNone = Visto Ninguno
B_SeenAll = Vistos Todos
B_CaughtNone = Atrapado Ninguno
B_CaughtAll = Atrapados Todos
B_Cancel = Cancelar
B_Save = Guardar
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
@@ -802,6 +937,18 @@ B_Save = Guardar
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! SAV_CGearSkin = Editor de la apariencia del C-Gear
- Change stuff below this line, not above.
-------------------------------------------------------
B_ImportPNG = Importar .png
B_ExportPNG = Exportar .png
B_ImportCGB = Importar .cgb/.psk
B_ExportCGB = Exportar .cgb
B_Cancel = Cancelar
B_Save = Guardar
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! ErrorWindow = Error
- Change stuff below this line, not above.
-------------------------------------------------------
@@ -809,4 +956,4 @@ L_ProvideInfo = Por favor, proporciona esta información cuando reportes este fa
B_CopyToClipboard = Copiar al portapapeles
B_Continue = Continuar
B_Abort = Abortar
! End
! End

View File

@@ -1,4 +1,4 @@
Spiky
Picoreja
@@ -199,7 +199,7 @@
Unaa
Una

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,255 @@
(None)
Master Ball
Ultra Ball
BrightPowder
Great Ball
Poké Ball
Teru-sama (0)
Bicycle
Moon Stone
Antidote
Burn Heal
Ice Heal
Awakening
Parlyz Heal
Full Restore
Max Potion
Hyper Potion
Super Potion
Potion
Escape Rope
Repel
Max Elixer
Fire Stone
Thunder Stone
Water Stone
Teru-sama (1)
HP Up
Protein
Iron
Carbos
Lucky Punch
Calcium
Rare Candy
X Accuracy
Leaf Stone
Metal Powder
Nugget
Poké Doll
Full Heal
Revive
Max Revive
Guard Spec.
Super Repel
Max Repel
Dire Hit
Teru-sama (2)
Fresh Water
Soda Pop
Lemonade
X Attack
Teru-sama (3)
X Defend
X Speed
X Special
Coin Case
Itemfinder
Teru-sama (4)
Exp Share
Old Rod
Good Rod
Silver Leaf
Super Rod
PP Up
Ether
Max Ether
Elixer
Red Scale
SecretPotion
S.S. Ticket
Mystery Egg
Clear Bell*
Silver Wing
Moomoo Milk
Quick Claw
PSNCureBerry
Gold Leaf
Soft Sand
Sharp Beak
PRZCureBerry
Burnt Berry
Ice Berry
Poison Barb
King's Rock
Bitter Berry
Mint Berry
Red Apricorn
TinyMushroom
Big Mushroom
SilverPowder
Blu Apricorn
Teru-sama (5)
Amulet Coin
Ylw Apricorn
Grn Apricorn
Cleanse Tag
Mystic Water
TwistedSpoon
Wht Apricorn
Black Belt
Blk Apricorn
Teru-sama (6)
Pnk Apricorn
BlackGlasses
SlowpokeTail
Pink Bow
Stick
Smoke Ball
NeverMeltIce
Magnet
MiracleBerry
Pearl
Big Pearl
Everstone
Spell Tag
RageCandyBar
GS Ball*
Blue Card*
Miracle Seed
Thick Club
Focus Band
Teru-sama (7)
EnergyPowder
Energy Root
Heal Powder
Revival Herb
Hard Stone
Lucky Egg
Card Key
Machine Part
Egg Ticket*
Lost Item
Stardust
Star Piece
Basement Key
Pass
Teru-sama (8)
Teru-sama (9)
Teru-sama (10)
Charcoal
Berry Juice
Scope Lens
Teru-sama (11)
Teru-sama (12)
Metal Coat
Dragon Fang
Teru-sama (13)
Leftovers
Teru-sama (14)
Teru-sama (15)
Teru-sama (16)
MysteryBerry
Dragon Scale
Berserk Gene
Teru-sama (17)
Teru-sama (18)
Teru-sama (19)
Sacred Ash
Heavy Ball
Flower Mail
Level Ball
Lure Ball
Fast Ball
Teru-sama (20)
Light Ball
Friend Ball
Moon Ball
Love Ball
Normal Box
Gorgeous Box
Sun Stone
Polkadot Bow
Teru-sama (21)
Up-Grade
Berry
Gold Berry
SquirtBottle
Teru-sama (22)
Park Ball
Rainbow Wing
Teru-sama (23)
Brick Piece
Surf Mail
Litebluemail
Portraitmail
Lovely Mail
Eon Mail
Morph Mail
Bluesky Mail
Music Mail
Mirage Mail
Teru-sama (24)
TM01
TM02
TM03
TM04
TM04 (Unused)
TM05
TM06
TM07
TM08
TM09
TM10
TM11
TM12
TM13
TM14
TM15
TM16
TM17
TM18
TM19
TM20
TM21
TM22
TM23
TM24
TM25
TM26
TM27
TM28
TM28 (Unused)
TM29
TM30
TM31
TM32
TM33
TM34
TM35
TM36
TM37
TM38
TM39
TM40
TM41
TM42
TM43
TM44
TM45
TM46
TM47
TM48
TM49
TM50
HM01
HM02
HM03
HM04
HM05
HM06
HM07
HM08 (Unused)
HM09 (Unused)
HM10 (Unused)
HM11 (Unused)
HM12 (Unused)

View File

@@ -0,0 +1,255 @@
Ningún
Master Ball
Ultra Ball
Polvo brillo
Super Ball
Poké Ball
Teru-sama (0)
Bicicleta
Piedra Lunar
Antídoto
Antiquemar
Antihielo
Despertar
Antiparalizador
Restaurar Todo
Poción Máxima
Hiperpoción
Superpoción
Poción
Cuerda Huida
Repelente
Elixir Máximo
Piedra Fuego
Piedra Trueno
Piedra Agua
Teru-sama (1)
Más PS
Proteína
Hierro
Carburante
Puño suerte
Calcio
Caramelo Raro
Precisión X
Piedra Hoja
Polvo metálico
Pepita
Poké Muñeco
Cura Total
Revivir
Revivir Máximo
Protec. Especial
Superrepelente
Repelente Máximo
Directo
Teru-sama (2)
Agua Fresca
Refresco
Limonada
Ataque X
Teru-sama (3)
Defensa X
Velocidad X
Especial X
Monedero
Buscaobjetos
Teru-sama (4)
Repartir Exp
Caña Vieja
Caña Buena
Hoja plata
Supercaña
Más PP
Éter
Éter Máximo
Elixir
Escama roja
Poción secreta
Ticket barco
Huevo misterioso
Campana clara*
Ala plateada
Leche Mu-mu
Garra Rápida
Bayantídoto
Hoja oro
Arena Fina
Pico Afilado
Antiparabaya
Antiquembaya
Baya Hielo
Flecha venenosa
Roca del Rey
Bayamarga
Baya Menta
Bonguri rojo
Mini Seta
Seta Grande
Polvo Plata
Bonguri azul
Teru-sama (5)
Moneda Amuleto
Bonguri amarillo
Bonguri verde
Amuleto
Agua Mística
Cuchara Torcida
Bonguri blanco
Cinturón Negro
Bonguri negro
Teru-sama (6)
Bonguri rosa
Gafas de Sol
Cola Slowpoke
Lazo rosa
Palo
Bola humo
Antiderretir
Imán
Baya Milagro
Perla
Perla Grande
Piedra Eterna
Hechizo
Caramelo furia
GS Ball*
Tarjeta azul*
Semilla milagro
Hueso grueso
Cinta Focus
Teru-sama (7)
Polvo Energía
Raíz Energía
Polvo Curación
Hierba Revivir
Piedra dura
Huevo Suerte
Llave magnética
Maquinaria
Ticket huevo*
Objeto perdido
Polvoestelar
Trozo Estrella
Llave sótano
Pase del tren
Teru-sama (8)
Teru-sama (9)
Teru-sama (10)
Carbón
Zumo de Baya
Periscopio
Teru-sama (11)
Teru-sama (12)
Revest. Metálico
Colmillo Dragón
Teru-sama (13)
Restos
Teru-sama (14)
Teru-sama (15)
Teru-sama (16)
Baya Misterio
Escamadragón
Gen loco
Teru-sama (17)
Teru-sama (18)
Teru-sama (19)
Ceniza Sagrada
Peso Ball
Carta flor
Nivel Ball
Cebo Ball
Rapid Ball
Teru-sama (20)
Bolaluminosa
Amigo Ball
Luna Ball
Amor Ball
Caja Normal
Caja Grande
Piedra Solar
Cinta lunares
Teru-sama (21)
Mejora
Baya
Baya Dorada
Regadera
Teru-sama (22)
Parque Ball
Ala arcoíris
Teru-sama (23)
Ladrillo
Carta surf
Carta azul
Carta retrato
Carta amor
Carta eón
Carta morfosis
Carta celeste
Carta música
Carta espejismo
Teru-sama (24)
MT01
MT02
MT03
MT04
MT04 (Sin uso)
MT05
MT06
MT07
MT08
MT09
MT10
MT11
MT12
MT13
MT14
MT15
MT16
MT17
MT18
MT19
MT20
MT21
MT22
MT23
MT24
MT25
MT26
MT27
MT28
MT28 (Sin uso)
MT29
MT30
MT31
MT32
MT33
MT34
MT35
MT36
MT37
MT38
MT39
MT40
MT41
MT42
MT43
MT44
MT45
MT46
MT47
MT48
MT49
MT50
MO01
MO02
MO03
MO04
MO05
MO06
MO07
MO08 (Sin uso)
MO09 (Sin uso)
MO10 (Sin uso)
MO11 (Sin uso)
MO12 (Sin uso)

View File

@@ -0,0 +1,255 @@
(无)
掌门球
高级球
亮光之粉
超级球
精灵球
卡比丘 (0)
自行车
月之石
解毒剂
灼伤药
解冻药
解眠药
解麻药
回复药水
全满药水
超高级药水
超级药水
药水
脱离洞穴的绳子
除虫喷雾器
PP全补剂
火之石
雷之石
水之石
卡比丘 (1)
HP提升剂
攻击牛磺剂
防御提升剂
效果防护
幸运之拳
特攻增加剂
神奇糖果
命中加强
叶之石
金属粉
金色珠
皮皮玩偶
万能药
更生剂
特级更生剂
防御效果
白银喷雾器
黄金喷雾器
要害攻击
卡比丘 (2)
美味之水
塞可汽水
综合调味乳
力量增强
卡比丘 (3)
伤害预防
速度增加
特殊增强
代币盒
蓝色卡片
卡比丘 (4)
学习装置
破烂钓竿
优秀钓竿
银叶
超强钓竿
PP提升剂
PP小补剂
PP单补剂
PP大补剂
红色的鳞片
秘传之药
船票
神奇之蛋
透明铃铛
银色之翼
摩摩牛奶
先攻之爪
解毒的果实
金叶
柔软的沙子
尖锐的鸟嘴
消除麻痹的果实
烧烤的果实
冰冻的果实
毒针
王者之证
苦涩的果实
薄荷的果实
红色圆柑果实
小蘑菇
大蘑菇
银色的粉
蓝色圆柑果实
卡比丘 (5)
护身金币
黄色圆柑果实
绿色圆柑果实
净身的护身符
神秘的水滴
弯曲的汤匙
白色圆柑果实
黑色带子
黑色圆柑果实
卡比丘 (6)
桃色圆柑果实
黑色的眼镜
美味尾巴
粉红色丝带
大葱
烟雾球
融化不了的冰块
磁铁
奇迹的果实
珍珠
大珍珠
不变之石
诅咒护身符
愤怒馒头
GS球*
蓝色卡片*
奇迹种子
胖骨头
振奋精神的头布
卡比丘 (7)
元气之粉
元气之根
万能之粉
复活草
硬石头
幸运蛋
卡片钥匙
机械的零件
神奇宝贝蛋兑换券
掉落的东西
星星的沙子
星星的碎片
地下室钥匙
定期月票
卡比丘 (8)
卡比丘 (9)
卡比丘 (10)
木灰
树果汁
对焦镜片
卡比丘 (11)
卡比丘 (12)
金属涂层
龙之牙
卡比丘 (13)
吃剩下的东西
卡比丘 (14)
卡比丘 (15)
卡比丘 (16)
神奇的果实
龙之鳞片
破坏性的遗传因子
卡比丘 (17)
卡比丘 (18)
卡比丘 (19)
神圣之灰
重量球
花案邮件
等级球
诱饵球
速度球
卡比丘 (20)
电气球
友友球
月亮球
爱心球
木箱
桐木箱
太阳之石
水玉色之带
卡比丘 (21)
升级
树果
黄金的果实
杰尼龟喷壶
卡比丘 (22)
公园球
彩虹之翼
卡比丘 (23)
砖瓦碎片
冲浪邮件
海洋邮件
肖像邮件
可爱邮件
伊布邮件
变身邮件
蓝天邮件
音符邮件
梦幻邮件
卡比丘 (24)
TM01
TM02
TM03
TM04
TM04 (未使用)
TM05
TM06
TM07
TM08
TM09
TM10
TM11
TM12
TM13
TM14
TM15
TM16
TM17
TM18
TM19
TM20
TM21
TM22
TM23
TM24
TM25
TM26
TM27
TM28
TM28 (未使用)
TM29
TM30
TM31
TM32
TM33
TM34
TM35
TM36
TM37
TM38
TM39
TM40
TM41
TM42
TM43
TM44
TM45
TM46
TM47
TM48
TM49
TM50
HM01
HM02
HM03
HM04
HM05
HM06
HM07
HM08 (未使用)
HM09 (未使用)
HM10 (未使用)
HM11 (未使用)
HM12 (未使用)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -67,22 +67,56 @@ public void setPouch(ref byte[] Data)
public void getPouchG1(ref byte[] Data)
{
InventoryItem[] items = new InventoryItem[PouchDataSize];
int numStored = Data[Offset];
for (int i = 0; i < numStored; i++)
if (Type == InventoryType.TMHMs)
{
items[i] = new InventoryItem
int slot = 0;
for (int i = 0; i < items.Length; i++)
{
Index = Data[Offset + i * 2 + 1],
Count = Data[Offset + i * 2 + 2]
};
if (Data[Offset + i] != 0)
items[slot++] = new InventoryItem
{
Index = LegalItems[i],
Count = Data[Offset+i]
};
}
while (slot < items.Length)
items[slot++] = new InventoryItem
{
Index = 0,
Count = 0
};
}
for (int i = numStored; i < items.Length; i++)
else
{
items[i] = new InventoryItem
int numStored = Data[Offset];
for (int i = 0; i < numStored; i++)
{
Index = 0,
Count = 0
};
switch (Type)
{
case InventoryType.KeyItems:
items[i] = new InventoryItem
{
Index = Data[Offset + i + 1],
Count = 1
};
break;
default:
items[i] = new InventoryItem
{
Index = Data[Offset + i * 2 + 1],
Count = Data[Offset + i * 2 + 2]
};
break;
}
}
for (int i = numStored; i < items.Length; i++)
{
items[i] = new InventoryItem
{
Index = 0,
Count = 0
};
}
}
Items = items;
@@ -92,14 +126,33 @@ public void setPouchG1(ref byte[] Data)
{
if (Items.Length != PouchDataSize)
throw new ArgumentException("Item array length does not match original pouch size.");
for (int i = 0; i < Items.Length; i++)
if (Type == InventoryType.TMHMs)
{
Data[Offset + i * 2 + 1] = (byte)Items[i].Index;
Data[Offset + i * 2 + 2] = (byte)Items[i].Count;
for (int i = 0; i < Items.Length; i++)
{
if (LegalItems.Any(it => it == Items[i].Index))
Data[Offset + Array.FindIndex(LegalItems, it => Items[i].Index == it)] = (byte) Items[i].Count;
}
}
else if (Type == InventoryType.KeyItems)
{
for (int i = 0; i < Items.Length; i++)
{
Data[Offset + i + 1] = (byte)Items[i].Index;
}
Data[Offset] = (byte)Count;
Data[Offset + 1 + Count] = 0xFF;
}
else
{
for (int i = 0; i < Items.Length; i++)
{
Data[Offset + i * 2 + 1] = (byte)Items[i].Index;
Data[Offset + i * 2 + 2] = (byte)Items[i].Count;
}
Data[Offset] = (byte)Count;
Data[Offset + 1 + 2 * Count] = 0xFF;
}
Data[Offset] = (byte) Count;
Data[Offset + 1 + 2*Count] = 0xFF;
}
}
}

View File

@@ -5,7 +5,7 @@ namespace PKHeX
{
public sealed class SAV1 : SaveFile
{
public override string BAKName => $"{FileName} [{OT} ({Version})" +/* - {LastSavedTime}*/ "].bak";
public override string BAKName => $"{FileName} [{OT} ({Version}) - {PlayTimeString}].bak";
public override string Filter => "SAV File|*.sav";
public override string Extension => ".sav";
@@ -149,7 +149,7 @@ public override byte[] Write(bool DSV)
// Configuration
public override SaveFile Clone() { return new SAV1(Data.Take(Data.Length - SIZE_RESERVED).ToArray()); }
public override SaveFile Clone() { return new SAV1(Write(DSV: false)); }
public override int SIZE_STORED => Japanese ? PKX.SIZE_1JLIST : PKX.SIZE_1ULIST;
public override int SIZE_PARTY => Japanese ? PKX.SIZE_1JLIST : PKX.SIZE_1ULIST;
@@ -167,13 +167,14 @@ public override byte[] Write(bool DSV)
public override int MaxItemID => 255;
public override int MaxBallID => 0;
public override int MaxGameID => 99; // What do I set this to...?
public override int MaxMoney => 999999;
public override int BoxCount => Japanese ? 8 : 12;
public override int MaxEV => 65535;
public override int MaxIV => 15;
public override int Generation => 1;
protected override int GiftCountMax => 0;
public override int OTLength => Japanese ? 5 : 10;
public override int OTLength => Japanese ? 5 : 7;
public override int NickLength => Japanese ? 5 : 10;
public override int BoxSlotCount => Japanese ? 30 : 20;
@@ -327,7 +328,7 @@ public uint Coin
}
}
private readonly ushort[] LegalItems = PKX.getG1LegalItems().Select(i => (ushort)i).ToArray();
private readonly ushort[] LegalItems = Legal.Pouch_Items_RBY;
public override InventoryPouch[] Inventory
{
get

657
PKHeX/Saves/SAV2.cs Normal file
View File

@@ -0,0 +1,657 @@
using System;
using System.Linq;
namespace PKHeX
{
public sealed class SAV2 : SaveFile
{
public override string BAKName => $"{FileName} [{OT} ({Version}) - {PlayTimeString}].bak";
public override string Filter => "SAV File|*.sav";
public override string Extension => ".sav";
public SAV2(byte[] data = null)
{
Data = data == null ? new byte[SaveUtil.SIZE_G2RAW_U] : (byte[])data.Clone();
BAK = (byte[])Data.Clone();
Exportable = !Data.SequenceEqual(new byte[Data.Length]);
Version = data == null ? GameVersion.GSC : SaveUtil.getIsG2SAV(Data);
if (Version == GameVersion.Invalid)
return;
Japanese = SaveUtil.getIsG2SAVJ(Data) != GameVersion.Invalid;
if (Japanese && Data.Length < SaveUtil.SIZE_G2RAW_J)
Array.Resize(ref Data, SaveUtil.SIZE_G2RAW_J);
Box = Data.Length;
Array.Resize(ref Data, Data.Length + SIZE_RESERVED);
Party = getPartyOffset(0);
Personal = Version == GameVersion.GS ? PersonalTable.GS : PersonalTable.C;
getSAVOffsets();
LegalItems = Legal.Pouch_Items_GSC;
LegalBalls = Legal.Pouch_Ball_GSC;
LegalKeyItems = Version == GameVersion.C ? Legal.Pouch_Key_C : Legal.Pouch_Key_GS;
LegalTMHMs = Legal.Pouch_TMHM_GSC;
HeldItems = Legal.HeldItems_GSC;
// Stash boxes after the save file's end.
byte[] TempBox = new byte[SIZE_STOREDBOX];
for (int i = 0; i < BoxCount; i++)
{
if (i < (Japanese ? 6 : 7))
Array.Copy(Data, 0x4000 + i * (TempBox.Length + 2), TempBox, 0, TempBox.Length);
else
Array.Copy(Data, 0x6000 + (i - (Japanese ? 6 : 7)) * (TempBox.Length + 2), TempBox, 0, TempBox.Length);
PokemonList2 PL2 = new PokemonList2(TempBox, Japanese ? PokemonList2.CapacityType.StoredJP : PokemonList2.CapacityType.Stored, Japanese);
for (int j = 0; j < PL2.Pokemon.Length; j++)
{
if (j < PL2.Count)
{
byte[] pkDat = new PokemonList2(PL2[j]).GetBytes();
pkDat.CopyTo(Data, Data.Length - SIZE_RESERVED + i * SIZE_BOX + j * SIZE_STORED);
}
else
{
byte[] pkDat = new byte[PokemonList2.GetDataLength(PokemonList2.CapacityType.Single, Japanese)];
pkDat.CopyTo(Data, Data.Length - SIZE_RESERVED + i * SIZE_BOX + j * SIZE_STORED);
}
}
}
Array.Copy(Data, CurrentBoxOffset, TempBox, 0, TempBox.Length);
PokemonList2 curBoxPL = new PokemonList2(TempBox, Japanese ? PokemonList2.CapacityType.StoredJP : PokemonList2.CapacityType.Stored, Japanese);
for (int i = 0; i < curBoxPL.Pokemon.Length; i++)
{
if (i < curBoxPL.Count)
{
byte[] pkDat = new PokemonList2(curBoxPL[i]).GetBytes();
pkDat.CopyTo(Data, Data.Length - SIZE_RESERVED + CurrentBox * SIZE_BOX + i * SIZE_STORED);
}
else
{
byte[] pkDat = new byte[PokemonList2.GetDataLength(PokemonList2.CapacityType.Single, Japanese)];
pkDat.CopyTo(Data, Data.Length - SIZE_RESERVED + CurrentBox * SIZE_BOX + i * SIZE_STORED);
}
}
byte[] TempParty = new byte[PokemonList2.GetDataLength(PokemonList2.CapacityType.Party, Japanese)];
Array.Copy(Data, PartyOffset, TempParty, 0, TempParty.Length);
PokemonList2 partyList = new PokemonList2(TempParty, PokemonList2.CapacityType.Party, Japanese);
for (int i = 0; i < partyList.Pokemon.Length; i++)
{
if (i < partyList.Count)
{
byte[] pkDat = new PokemonList2(partyList[i]).GetBytes();
pkDat.CopyTo(Data, getPartyOffset(i));
}
else
{
byte[] pkDat = new byte[PokemonList2.GetDataLength(PokemonList2.CapacityType.Single, Japanese)];
pkDat.CopyTo(Data, getPartyOffset(i));
}
}
// Daycare currently undocumented for all Gen II games.
// Enable Pokedex editing
PokeDex = 0;
if (!Exportable)
resetBoxes();
}
private const int SIZE_RESERVED = 0x8000; // unpacked box data
public override byte[] Write(bool DSV)
{
for (int i = 0; i < BoxCount; i++)
{
PokemonList2 boxPL = new PokemonList2(Japanese ? PokemonList2.CapacityType.StoredJP : PokemonList2.CapacityType.Stored, Japanese);
int slot = 0;
for (int j = 0; j < boxPL.Pokemon.Length; j++)
{
PK2 boxPK = (PK2) getPKM(getData(getBoxOffset(i) + j*SIZE_STORED, SIZE_STORED));
if (boxPK.Species > 0)
boxPL[slot++] = boxPK;
}
if (i < (Japanese ? 6 : 7))
boxPL.GetBytes().CopyTo(Data, 0x4000 + i * (SIZE_STOREDBOX + 2));
else
boxPL.GetBytes().CopyTo(Data, 0x6000 + (i - (Japanese ? 6 : 7)) * (SIZE_STOREDBOX + 2));
if (i == CurrentBox)
boxPL.GetBytes().CopyTo(Data, CurrentBoxOffset);
}
PokemonList2 partyPL = new PokemonList2(PokemonList2.CapacityType.Party, Japanese);
int pSlot = 0;
for (int i = 0; i < 6; i++)
{
PK2 partyPK = (PK2)getPKM(getData(getPartyOffset(i), SIZE_STORED));
if (partyPK.Species > 0)
partyPL[pSlot++] = partyPK;
}
partyPL.GetBytes().CopyTo(Data, PartyOffset);
setChecksums();
if (Version == GameVersion.C && !Japanese)
{
Array.Copy(Data, 0x2009, Data, 0x1209, 0xB7A);
}
if (Version == GameVersion.C && Japanese)
{
Array.Copy(Data, 0x2009, Data, 0x7209, 0xB32);
}
if (Version == GameVersion.GS && !Japanese)
{
Array.Copy(Data, 0x2009, Data, 0x15C7, 0x222F - 0x2009);
Array.Copy(Data, 0x222F, Data, 0x3D69, 0x23D9 - 0x222F);
Array.Copy(Data, 0x23D9, Data, 0x0C6B, 0x2856 - 0x23D9);
Array.Copy(Data, 0x2856, Data, 0x7E39, 0x288A - 0x2856);
Array.Copy(Data, 0x288A, Data, 0x10E8, 0x2D69 - 0x288A);
}
if (Version == GameVersion.GS && Japanese)
{
Array.Copy(Data, 0x2009, Data, 0x7209, 0xC83);
}
byte[] outData = new byte[Data.Length - SIZE_RESERVED];
Array.Copy(Data, outData, outData.Length);
return outData;
}
private void getSAVOffsets()
{
OptionsOffset = 0x2000;
Trainer1 = 0x2009;
switch (Version)
{
case GameVersion.GS:
DaylightSavingsOffset = Japanese ? 0x2029 : 0x2042;
TimePlayedOffset = Japanese ? 0x2034 : 0x2053;
PaletteOffset = Japanese ? 0x204C : 0x206B;
MoneyOffset = Japanese ? 0x23BC : 0x23DB;
JohtoBadgesOffset = Japanese ? 0x23C5 : 0x23E4;
CurrentBoxIndexOffset = Japanese ? 0x2705 : 0x2724;
BoxNamesOffset = Japanese ? 0x2708 : 0x2727;
PartyOffset = Japanese ? 0x283E : 0x288A;
PokedexCaughtOffset = Japanese ? 0x29CE : 0x2A4C;
PokedexSeenOffset = Japanese ? 0x29EE : 0x2A6C;
CurrentBoxOffset = Japanese ? 0x2D10 : 0x2D6C;
GenderOffset = -1; // No gender in GSC
break;
case GameVersion.C:
DaylightSavingsOffset = Japanese ? 0x2029 : 0x2042;
TimePlayedOffset = Japanese ? 0x2034 : 0x2052;
PaletteOffset = Japanese ? 0x204C : 0x206A;
MoneyOffset = Japanese ? 0x23BE : 0x23DC;
JohtoBadgesOffset = Japanese ? 0x23C7 : 0x23E5;
CurrentBoxIndexOffset = Japanese ? 0x26E2 : 0x2700;
BoxNamesOffset = Japanese ? 0x26E5 : 0x2703;
PartyOffset = Japanese ? 0x281A : 0x2865;
PokedexCaughtOffset = Japanese ? 0x29AA : 0x2A27;
PokedexSeenOffset = Japanese ? 0x29CA : 0x2A47;
CurrentBoxOffset = 0x2D10;
GenderOffset = Japanese ? 0x8000 : 0x3E3D;
break;
}
}
// Configuration
public override SaveFile Clone() { return new SAV2(Write(DSV: false)); }
public override int SIZE_STORED => Japanese ? PKX.SIZE_2JLIST : PKX.SIZE_2ULIST;
public override int SIZE_PARTY => Japanese ? PKX.SIZE_2JLIST : PKX.SIZE_2ULIST;
public int SIZE_BOX => BoxSlotCount*SIZE_STORED;
public int SIZE_STOREDBOX => PokemonList2.GetDataLength(Japanese ? PokemonList2.CapacityType.StoredJP : PokemonList2.CapacityType.Stored, Japanese);
public override PKM BlankPKM => new PK2(null, null, Japanese);
protected override Type PKMType => typeof(PK2);
public override int MaxMoveID => 251;
public override int MaxSpeciesID => 251;
public override int MaxAbilityID => 0;
public override int MaxItemID => 255;
public override int MaxBallID => 0;
public override int MaxGameID => 99; // What do I set this to...?
public override int MaxMoney => 999999;
public override int BoxCount => Japanese ? 9 : 14;
public override int MaxEV => 65535;
public override int MaxIV => 15;
public override int Generation => 2;
protected override int GiftCountMax => 0;
public override int OTLength => Japanese ? 5 : 7;
public override int NickLength => Japanese ? 5 : 10;
public override int BoxSlotCount => Japanese ? 30 : 20;
public override bool HasParty => true;
private int StringLength => Japanese ? PK2.STRLEN_J : PK2.STRLEN_U;
// Offsets
private int OptionsOffset { get; set; } = int.MinValue;
private int DaylightSavingsOffset { get; set; } = int.MinValue;
private int TimePlayedOffset { get; set; } = int.MinValue;
private int PaletteOffset { get; set; } = int.MinValue;
private int MoneyOffset { get; set; } = int.MinValue;
private int JohtoBadgesOffset { get; set; } = int.MinValue;
private int CurrentBoxIndexOffset { get; set; } = int.MinValue;
private int BoxNamesOffset { get; set; } = int.MinValue;
private int PartyOffset { get; set; } = int.MinValue;
private int PokedexSeenOffset { get; set; } = int.MinValue;
private int PokedexCaughtOffset { get; set; } = int.MinValue;
private int CurrentBoxOffset { get; set; } = int.MinValue;
private int GenderOffset { get; set; } = int.MinValue;
// Checksums
protected override void setChecksums()
{
ushort accum = 0;
for (int i = 0x2009; i <= 0x2B3A; i++)
accum += Data[i];
if (Version == GameVersion.C && Japanese)
{
BitConverter.GetBytes(accum).CopyTo(Data, 0x2D0D);
BitConverter.GetBytes(accum).CopyTo(Data, 0x7F0D);
}
for (int i = 0x2B3B; i <= 0x2B82; i++)
accum += Data[i];
if (Version == GameVersion.C && !Japanese)
{
BitConverter.GetBytes(accum).CopyTo(Data, 0x2D0D);
BitConverter.GetBytes(accum).CopyTo(Data, 0x1F0D);
}
for (int i = 0x2B83; i <= 0x2C8B; i++)
accum += Data[i];
if (Version == GameVersion.GS && Japanese)
{
BitConverter.GetBytes(accum).CopyTo(Data, 0x2D0D);
BitConverter.GetBytes(accum).CopyTo(Data, 0x7F0D);
}
for (int i = 0x2C8C; i <= 0x2D68; i++)
accum += Data[i];
if (Version == GameVersion.GS && !Japanese)
{
BitConverter.GetBytes(accum).CopyTo(Data, 0x2D69);
BitConverter.GetBytes(accum).CopyTo(Data, 0x7E6D);
}
}
public override bool ChecksumsValid
{
get
{
ushort accum = 0;
for (int i = 0x2009; i <= 0x2B3A; i++)
accum += Data[i];
if (Version == GameVersion.C && Japanese)
return accum == BitConverter.ToUInt16(Data, 0x2D0D); // Japanese Crystal
for (int i = 0x2B3B; i <= 0x2B82; i++)
accum += Data[i];
if (Version == GameVersion.C && !Japanese)
return accum == BitConverter.ToUInt16(Data, 0x2D0D); // US Crystal
for (int i = 0x2B83; i <= 0x2C8B; i++)
accum += Data[i];
if (Version == GameVersion.GS && Japanese)
return accum == BitConverter.ToUInt16(Data, 0x2D69); // Japanese Gold/Silver
for (int i = 0x2C8C; i <= 0x2D68; i++)
accum += Data[i];
if (Version == GameVersion.GS && !Japanese)
return accum == BitConverter.ToUInt16(Data, 0x2D69); // US Gold/Silver
return false;
}
}
private int getChecksum()
{
ushort accum = 0;
for (int i = 0x2009; i <= 0x2B3A; i++)
accum += Data[i];
if (Version == GameVersion.C && Japanese)
return accum; // Japanese Crystal
for (int i = 0x2B3B; i <= 0x2B82; i++)
accum += Data[i];
if (Version == GameVersion.C && !Japanese)
return accum; // US Crystal
for (int i = 0x2B83; i <= 0x2C8B; i++)
accum += Data[i];
if (Version == GameVersion.GS && Japanese)
return accum; // Japanese Gold/Silver
for (int i = 0x2C8C; i <= 0x2D68; i++)
accum += Data[i];
if (Version == GameVersion.GS && !Japanese)
return accum; // US Gold/Silver
return 0;
}
public override string ChecksumInfo => ChecksumsValid ? "Checksum valid." : "Checksum invalid";
// Trainer Info
public override GameVersion Version { get; protected set; }
public override string OT
{
get { return PKX.getG1Str(Data.Skip(0x200B).Take(StringLength).ToArray(), Japanese); }
set
{
byte[] strdata = PKX.setG1Str(value, Japanese);
if (strdata.Length > StringLength)
throw new ArgumentException("OT Name too long for given save file.");
strdata.CopyTo(Data, 0x200B);
}
}
public override int Gender
{
get { return Version == GameVersion.C ? Data[GenderOffset] : 0; }
set
{
if (Version != GameVersion.C)
return;
Data[GenderOffset] = (byte) value;
Data[PaletteOffset] = (byte) value;
}
}
public override ushort TID
{
get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, 0x2009)); }
set { BitConverter.GetBytes(Util.SwapEndianness(value)).CopyTo(Data, 0x2009); }
}
public override ushort SID
{
get { return 0; }
set { }
}
public override int PlayedHours
{
get { return Util.SwapEndianness(BitConverter.ToUInt16(Data, TimePlayedOffset)); }
set { BitConverter.GetBytes(Util.SwapEndianness((ushort)value)).CopyTo(Data,TimePlayedOffset); }
}
public override int PlayedMinutes
{
get { return Data[TimePlayedOffset+2]; }
set { Data[TimePlayedOffset+2] = (byte)value; }
}
public override int PlayedSeconds
{
get { return Data[TimePlayedOffset + 3]; }
set { Data[TimePlayedOffset + 3] = (byte)value; }
}
public int Badges
{
get { return BitConverter.ToUInt16(Data, JohtoBadgesOffset); }
set { if (value < 0) return; BitConverter.GetBytes(value).CopyTo(Data, JohtoBadgesOffset); }
}
private byte Options
{
get { return Data[0x2000]; }
set { Data[0x2000] = value; }
}
public bool BattleEffects
{
get { return (Options & 0x80) == 0; }
set { Options = (byte)((Options & 0x7F) | (value ? 0 : 0x80)); }
}
public bool BattleStyleSwitch
{
get { return (Options & 0x40) == 0; }
set { Options = (byte)((Options & 0xBF) | (value ? 0 : 0x40)); }
}
public int Sound
{
get { return (Options & 0x30) >> 4; }
set
{
var new_sound = value;
if (new_sound > 0)
new_sound = 2; // Stereo
if (new_sound < 0)
new_sound = 0; // Mono
Options = (byte)((Options & 0xCF) | (new_sound << 4));
}
}
public int TextSpeed
{
get { return Options & 0x7; }
set
{
var new_speed = value;
if (new_speed > 7)
new_speed = 7;
if (new_speed < 0)
new_speed = 0;
Options = (byte)((Options & 0xF8) | new_speed);
}
}
public override uint Money
{
get { return Util.SwapEndianness(BitConverter.ToUInt32(Data, MoneyOffset)) >> 8; }
set
{
BitConverter.GetBytes(Util.SwapEndianness(value > 999999 ? 999999 : value)).Skip(1).ToArray().CopyTo(Data, MoneyOffset);
}
}
public uint Coin
{
get
{
return Util.SwapEndianness(BitConverter.ToUInt16(Data, MoneyOffset+7));
}
set
{
BitConverter.GetBytes(Util.SwapEndianness(value > 9999 ? 9999 : value)).ToArray().CopyTo(Data, MoneyOffset + 7);
}
}
private readonly ushort[] LegalItems, LegalKeyItems, LegalBalls, LegalTMHMs;
public override InventoryPouch[] Inventory
{
get
{
InventoryPouch[] pouch;
if (Version == GameVersion.C)
{
pouch = new[]
{
new InventoryPouch(InventoryType.TMHMs, LegalTMHMs, 1, Japanese ? 0x23C9 : 0x23E7, 57),
new InventoryPouch(InventoryType.Items, LegalItems, 99, Japanese ? 0x2402 : 0x2420, 20),
new InventoryPouch(InventoryType.KeyItems, LegalKeyItems, 1, Japanese ? 0x242C : 0x244A, 26),
new InventoryPouch(InventoryType.Balls, LegalBalls, 99, Japanese ? 0x2447 : 0x2465, 12),
new InventoryPouch(InventoryType.MailItems, LegalItems.Concat(LegalKeyItems).Concat(LegalBalls).Concat(LegalTMHMs).ToArray(), 99, Japanese ? 0x2461 : 0x247F, 50)
};
}
else
{
pouch = new[]
{
new InventoryPouch(InventoryType.TMHMs, LegalTMHMs, 1, Japanese ? 0x23C7 : 0x23E6, 57),
new InventoryPouch(InventoryType.Items, LegalItems, 99, Japanese ? 0x2400 : 0x241F, 20),
new InventoryPouch(InventoryType.KeyItems, LegalKeyItems, 99, Japanese ? 0x242A : 0x2449, 26),
new InventoryPouch(InventoryType.Balls, LegalBalls, 99, Japanese ? 0x2445 : 0x2464, 12),
new InventoryPouch(InventoryType.MailItems, LegalItems.Concat(LegalKeyItems).Concat(LegalBalls).Concat(LegalTMHMs).ToArray(), 99, Japanese ? 0x245F : 0x247E, 50)
};
}
foreach (var p in pouch)
{
p.getPouchG1(ref Data);
}
return pouch;
}
set
{
foreach (var p in value)
{
int ofs = 0;
for (int i = 0; i < p.Count; i++)
{
while (p.Items[ofs].Count == 0)
ofs++;
p.Items[i] = p.Items[ofs++];
}
while (ofs < p.Items.Length)
p.Items[ofs++] = new InventoryItem { Count = 0, Index = 0 };
p.setPouchG1(ref Data);
}
}
}
public override int getDaycareSlotOffset(int loc, int slot)
{
return Daycare;
}
public override ulong? getDaycareRNGSeed(int loc)
{
return null;
}
public override uint? getDaycareEXP(int loc, int slot)
{
return null;
}
public override bool? getDaycareOccupied(int loc, int slot)
{
return null;
}
public override void setDaycareEXP(int loc, int slot, uint EXP)
{
}
public override void setDaycareOccupied(int loc, int slot, bool occupied)
{
}
// Storage
public override int PartyCount
{
get { return Data[PartyOffset]; }
protected set
{
Data[PartyOffset] = (byte)value;
}
}
public override int getBoxOffset(int box)
{
return Data.Length - SIZE_RESERVED + box * SIZE_BOX;
}
public override int getPartyOffset(int slot)
{
return Data.Length - SIZE_RESERVED + BoxCount * SIZE_BOX + slot * SIZE_STORED;
}
public override int CurrentBox
{
get { return Data[CurrentBoxIndexOffset] & 0x7F; }
set { Data[CurrentBoxIndexOffset] = (byte)((Data[Japanese ? 0x2842 : 0x284C] & 0x80) | (value & 0x7F)); }
}
public override int getBoxWallpaper(int box)
{
return 0;
}
public override string getBoxName(int box)
{
return PKX.getG1Str(Data.Skip(BoxNamesOffset + box*9).Take(9).ToArray(), Japanese);
}
public override void setBoxName(int box, string value)
{
// Don't allow for custom box names
}
public override PKM getPKM(byte[] data)
{
if (data.Length == SIZE_STORED)
return new PokemonList2(data, PokemonList2.CapacityType.Single, Japanese)[0];
return new PK2(data);
}
public override byte[] decryptPKM(byte[] data)
{
return data;
}
// Pokédex
public override bool getSeen(PKM pkm)
{
if (pkm.Species == 0)
return false;
if (pkm.Species > MaxSpeciesID)
return false;
if (Version == GameVersion.Unknown)
return false;
int bit = pkm.Species - 1;
int ofs = bit >> 3;
byte bitval = (byte)(1 << (bit & 7));
// Get the Seen Flag
return (Data[PokedexSeenOffset + ofs] & bitval) != 0;
}
public override bool getCaught(PKM pkm)
{
if (pkm.Species == 0)
return false;
if (pkm.Species > MaxSpeciesID)
return false;
if (Version == GameVersion.Unknown)
return false;
int bit = pkm.Species - 1;
int ofs = bit >> 3;
byte bitval = (byte)(1 << (bit & 7));
// Get the Caught Flag
return (Data[PokedexCaughtOffset + ofs] & bitval) != 0;
}
protected internal override void setSeen(PKM pkm, bool seen = true)
{
if (pkm.Species == 0)
return;
if (pkm.Species > MaxSpeciesID)
return;
if (Version == GameVersion.Unknown)
return;
int bit = pkm.Species - 1;
int ofs = bit >> 3;
byte bitval = (byte)(1 << (bit & 7));
// Set the Seen Flag
Data[PokedexSeenOffset + ofs] &= (byte)(~bitval);
if (seen)
Data[PokedexSeenOffset + ofs] |= bitval;
}
protected internal override void setCaught(PKM pkm, bool caught = true)
{
if (pkm.Species == 0)
return;
if (pkm.Species > MaxSpeciesID)
return;
if (Version == GameVersion.Unknown)
return;
int bit = pkm.Species - 1;
int ofs = bit >> 3;
byte bitval = (byte)(1 << (bit & 7));
// Set the Captured Flag
Data[PokedexCaughtOffset + ofs] &= (byte)(~bitval);
if (caught)
{
Data[PokedexCaughtOffset + ofs] |= bitval;
if (pkm.Species == 201) // Unown
{
// Give all Unown caught to prevent a crash on pokedex view
for (int i = 1; i <= 26; i++)
{
Data[PokedexSeenOffset + 0x1F + i] = (byte)(i);
}
}
}
}
}
}

View File

@@ -5,7 +5,7 @@ namespace PKHeX
{
public sealed class SAV3 : SaveFile
{
public override string BAKName => $"{FileName} [{OT} ({Version})" +/* - {LastSavedTime}*/ "].bak";
public override string BAKName => $"{FileName} [{OT} ({Version}) - {PlayTimeString}].bak";
public override string Filter => "SAV File|*.sav";
public override string Extension => ".sav";
@@ -152,7 +152,7 @@ public override byte[] Write(bool DSV)
private readonly int[] BlockOfs;
// Configuration
public override SaveFile Clone() { return new SAV3(Data.Take(Box).ToArray(), Version); }
public override SaveFile Clone() { return new SAV3(Write(DSV:false), Version); }
public override int SIZE_STORED => PKX.SIZE_3STORED;
public override int SIZE_PARTY => PKX.SIZE_3PARTY;
@@ -172,6 +172,7 @@ public override byte[] Write(bool DSV)
protected override int GiftCountMax => 1;
public override int OTLength => 8;
public override int NickLength => 10;
public override int MaxMoney => 999999;
public override bool HasParty => true;

View File

@@ -5,7 +5,7 @@ namespace PKHeX
{
public sealed class SAV4 : SaveFile
{
public override string BAKName => $"{FileName} [{OT} ({Version})" +/* - {LastSavedTime}*/ "].bak";
public override string BAKName => $"{FileName} [{OT} ({Version}) - {PlayTimeString}].bak";
public override string Filter => (Footer.Length > 0 ? "DeSmuME DSV|*.dsv|" : "") + "SAV File|*.sav";
public override string Extension => ".sav";
public SAV4(byte[] data = null, GameVersion versionOverride = GameVersion.Any)
@@ -53,6 +53,7 @@ public SAV4(byte[] data = null, GameVersion versionOverride = GameVersion.Any)
protected override int GiftCountMax => 11;
public override int OTLength => 8;
public override int NickLength => 10;
public override int MaxMoney => 999999;
public override int MaxMoveID => 467;
public override int MaxSpeciesID => 493;

View File

@@ -7,7 +7,7 @@ namespace PKHeX
public sealed class SAV5 : SaveFile
{
// Save Data Attributes
public override string BAKName => $"{FileName} [{OT} ({(GameVersion)Game})" +/* - {LastSavedTime}*/ "].bak";
public override string BAKName => $"{FileName} [{OT} ({(GameVersion)Game}) - {PlayTimeString}].bak";
public override string Filter => (Footer.Length > 0 ? "DeSmuME DSV|*.dsv|" : "") + "SAV File|*.sav";
public override string Extension => ".sav";
public SAV5(byte[] data = null, GameVersion versionOverride = GameVersion.Any)

View File

@@ -20,6 +20,7 @@ public abstract class SaveFile
public abstract string Filter { get; }
public byte[] Footer { protected get; set; } = new byte[0]; // .dsv
public bool Japanese { protected get; set; }
public string PlayTimeString => $"{PlayedHours}ː{PlayedMinutes.ToString("00")}ː{PlayedSeconds.ToString("00")}"; // not :
public bool GetJapanese => Japanese;
@@ -63,6 +64,8 @@ public virtual byte[] Write(bool DSV)
public bool RS => Version == GameVersion.RS;
public bool RBY => Version == GameVersion.RBY;
public bool GSC => Version == GameVersion.GS || Version == GameVersion.C;
public virtual int MaxMoveID => int.MaxValue;
public virtual int MaxSpeciesID => int.MaxValue;
public virtual int MaxAbilityID => int.MaxValue;
@@ -102,6 +105,7 @@ public virtual byte[] Write(bool DSV)
public virtual int DaycareSeedSize { get; } = 0;
public abstract int OTLength { get; }
public abstract int NickLength { get; }
public virtual int MaxMoney { get; } = 9999999;
// Offsets
protected int Box { get; set; } = int.MinValue;
@@ -324,7 +328,7 @@ public virtual MysteryGiftAlbum GiftAlbum
public abstract int getDaycareSlotOffset(int loc, int slot);
public abstract uint? getDaycareEXP(int loc, int slot);
public virtual ulong? getDaycareRNGSeed(int loc) { return null; }
public virtual bool? getDaycareHasEgg(int loc) { return false; }
public virtual bool? getDaycareHasEgg(int loc) { return null; }
public abstract bool? getDaycareOccupied(int loc, int slot);
public abstract void setDaycareEXP(int loc, int slot, uint EXP);
@@ -463,7 +467,7 @@ public bool setPCBin(byte[] data)
PKM[] pkms = BoxData;
for (int i = 0; i < pkms.Length; i++)
pkms[i].Data = decryptPKM(pkdata[i]);
pkms[i] = getPKM(decryptPKM(pkdata[i]));
BoxData = pkms;
return true;
}
@@ -481,7 +485,7 @@ public bool setBoxBin(byte[] data, int box)
PKM[] pkms = BoxData;
for (int i = 0; i < BoxSlotCount; i++)
pkms[box*BoxSlotCount + i].Data = decryptPKM(pkdata[i]);
pkms[box*BoxSlotCount + i] = getPKM(decryptPKM(pkdata[i]));
BoxData = pkms;
return true;
}

View File

@@ -8,6 +8,9 @@ namespace PKHeX
{
public enum GameVersion
{
/* I don't want to assign Gen I/II... */
GS = -4,
C = -3,
Invalid = -2,
Any = -1,
Unknown = 0,
@@ -45,6 +48,11 @@ public static class SaveUtil
internal const int SIZE_G4RAW = 0x80000;
internal const int SIZE_G3RAW = 0x20000;
internal const int SIZE_G3RAWHALF = 0x10000;
internal const int SIZE_G2RAW_U = 0x8000;
internal const int SIZE_G2BAT_U = 0x802C;
internal const int SIZE_G2EMU = 0x8030;
internal const int SIZE_G2RAW_J = 0x10000;
internal const int SIZE_G2BAT_J = 0x1002C;
internal const int SIZE_G1RAW = 0x8000;
internal const int SIZE_G1BAT = 0x802C;
@@ -57,6 +65,8 @@ public static int getSAVGeneration(byte[] data)
{
if (getIsG1SAV(data) != GameVersion.Invalid)
return 1;
if (getIsG2SAV(data) != GameVersion.Invalid)
return 2;
if (getIsG3SAV(data) != GameVersion.Invalid)
return 3;
if (getIsG4SAV(data) != GameVersion.Invalid)
@@ -108,6 +118,71 @@ public static bool getIsG1SAVJ(byte[] data)
}
return true;
}
/// <summary>Determines the type of 2nd gen save</summary>
/// <param name="data">Save data of which to determine the type</param>
/// <returns>Version Identifier or Invalid if type cannot be determined.</returns>
public static GameVersion getIsG2SAV(byte[] data)
{
if (data.Length != SIZE_G2RAW_U && data.Length != SIZE_G2BAT_U && data.Length != SIZE_G2RAW_J && data.Length != SIZE_G2BAT_J && data.Length != SIZE_G2EMU)
return GameVersion.Invalid;
// Check if it's not an american save or a japanese save
if (getIsG2SAVU(data) != GameVersion.Invalid)
return getIsG2SAVU(data);
if (getIsG2SAVJ(data) != GameVersion.Invalid)
return getIsG2SAVJ(data);
return GameVersion.Invalid;
}
/// <summary>Determines if 2nd gen save is non-japanese</summary>
/// <param name="data">Save data of which to determine the region</param>
/// <returns>True if a valid non-japanese save, False otherwise.</returns>
public static GameVersion getIsG2SAVU(byte[] data)
{
bool gs = true;
bool c = true;
foreach (int ofs in new[] { 0x288A, 0x2D6C })
{
byte num_entries = data[ofs];
if (num_entries > 20 || data[ofs + 1 + num_entries] != 0xFF)
gs = false;
}
foreach (int ofs in new[] { 0x2865, 0x2D10 })
{
byte num_entries = data[ofs];
if (num_entries > 20 || data[ofs + 1 + num_entries] != 0xFF)
c = false;
}
if (gs)
return GameVersion.GS;
if (c)
return GameVersion.C;
return GameVersion.Invalid;
}
/// <summary>Determines if 2nd gen save is japanese</summary>
/// <param name="data">Save data of which to determine the region</param>
/// <returns>True if a valid japanese save, False otherwise.</returns>
public static GameVersion getIsG2SAVJ(byte[] data)
{
bool gs = true;
bool c = true;
foreach (int ofs in new[] { 0x283E, 0x2D10 })
{
byte num_entries = data[ofs];
if (num_entries > 30 || data[ofs + 1 + num_entries] != 0xFF)
gs = false;
}
foreach (int ofs in new[] { 0x281A, 0x2D10 })
{
byte num_entries = data[ofs];
if (num_entries > 30 || data[ofs + 1 + num_entries] != 0xFF)
c = false;
}
if (gs)
return GameVersion.GS;
if (c)
return GameVersion.C;
return GameVersion.Invalid;
}
/// <summary>Determines the type of 3th gen save</summary>
/// <param name="data">Save data of which to determine the type</param>
/// <returns>Version Identifier or Invalid if type cannot be determined.</returns>
@@ -218,6 +293,10 @@ public static GameVersion getVersionGroup(GameVersion Version)
case GameVersion.RBY:
return GameVersion.RBY;
case GameVersion.GS:
case GameVersion.C:
return GameVersion.GSC;
case GameVersion.R:
case GameVersion.S:
return GameVersion.RS;
@@ -270,6 +349,8 @@ public static SaveFile getVariantSAV(byte[] data)
{
case 1:
return new SAV1(data);
case 2:
return new SAV2(data);
case 3:
return new SAV3(data);
case 4:

View File

@@ -134,12 +134,14 @@ public RegimenInfo(string name, bool completedRegimen)
private void B_All_Click(object sender, EventArgs e)
{
if (CHK_SecretUnlocked.Checked) // only give dist if Secret is Unlocked (None -> All -> All*)
foreach (var c in TLP_DistSuperTrain.Controls.OfType<CheckBox>())
c.Checked = true;
CHK_SecretUnlocked.Checked = true;
CHK_SecretComplete.Checked = true;
foreach (var c in TLP_SuperTrain.Controls.OfType<CheckBox>())
c.Checked = true;
foreach (var c in TLP_DistSuperTrain.Controls.OfType<CheckBox>())
c.Checked = true;
}
private void B_None_Click(object sender, EventArgs e)
{

View File

@@ -1768,7 +1768,9 @@ private void InitializeComponent()
".pk6",
".pk5",
".pk4",
".pk3"});
".pk3",
".pk2",
".pk1"});
this.CB_Format.Location = new System.Drawing.Point(54, 0);
this.CB_Format.Margin = new System.Windows.Forms.Padding(0);
this.CB_Format.Name = "CB_Format";

View File

@@ -525,8 +525,11 @@ private void setResults(List<PKM> res)
private void FillPKXBoxes(int start)
{
if (Results == null)
{
for (int i = 0; i < RES_MAX; i++)
PKXBOXES[i].Image = null;
return;
}
PKM[] data = Results.Skip(start * RES_MIN).Take(RES_MAX).ToArray();
for (int i = 0; i < data.Length; i++)
PKXBOXES[i].Image = data[i].Sprite;
@@ -591,7 +594,8 @@ private void changeFormatFilter(object sender, EventArgs e)
else
{
CB_Format.Visible = true;
CB_Format.SelectedIndex = MAXFORMAT - Main.SAV.Generation + 1; // SAV generation (offset by 1 for "Any")
int index = MAXFORMAT - Main.SAV.Generation + 1;
CB_Format.SelectedIndex = index < CB_Format.Items.Count ? index : 0; // SAV generation (offset by 1 for "Any")
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,354 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
namespace PKHeX
{
public partial class SAV_MysteryGiftDB : Form
{
public SAV_MysteryGiftDB(Main f1)
{
m_parent = f1;
InitializeComponent();
// Preset Filters to only show PKM available for loaded save
CB_FormatComparator.SelectedIndex = 3; // <=
PKXBOXES = new[]
{
bpkx1, bpkx2, bpkx3, bpkx4, bpkx5, bpkx6,
bpkx7, bpkx8, bpkx9, bpkx10,bpkx11,bpkx12,
bpkx13,bpkx14,bpkx15,bpkx16,bpkx17,bpkx18,
bpkx19,bpkx20,bpkx21,bpkx22,bpkx23,bpkx24,
bpkx25,bpkx26,bpkx27,bpkx28,bpkx29,bpkx30,
bpkx31,bpkx32,bpkx33,bpkx34,bpkx35,bpkx36,
bpkx37,bpkx38,bpkx39,bpkx40,bpkx41,bpkx42,
bpkx43,bpkx44,bpkx45,bpkx46,bpkx47,bpkx48,
bpkx49,bpkx50,bpkx51,bpkx52,bpkx53,bpkx54,
bpkx55,bpkx56,bpkx57,bpkx58,bpkx59,bpkx60,
bpkx61,bpkx62,bpkx63,bpkx64,bpkx65,bpkx66,
};
// Enable Scrolling when hovered over
PAN_Box.MouseHover += (sender, args) =>
{
if (ActiveForm == this)
SCR_Box.Focus();
};
foreach (var slot in PKXBOXES)
{
slot.MouseEnter += (sender, args) =>
{
if (ActiveForm == this)
SCR_Box.Focus();
};
// Enable Click
slot.MouseClick += (sender, args) =>
{
if (ModifierKeys == Keys.Control)
clickView(sender, args);
};
}
Counter = L_Count.Text;
Viewed = L_Viewed.Text;
L_Viewed.Text = ""; // invis for now
populateComboBoxes();
ContextMenuStrip mnu = new ContextMenuStrip();
ToolStripMenuItem mnuView = new ToolStripMenuItem("View");
// Assign event handlers
mnuView.Click += clickView;
// Add to main context menu
mnu.Items.AddRange(new ToolStripItem[] { mnuView });
// Assign to datagridview
foreach (PictureBox p in PKXBOXES)
p.ContextMenuStrip = mnu;
// Load Data
RawDB = new List<MysteryGift>();
RawDB.AddRange(Legal.WC6DB);
if (Directory.Exists(DatabasePath))
foreach (string file in Directory.GetFiles(DatabasePath, "*", SearchOption.AllDirectories))
{
FileInfo fi = new FileInfo(file);
if (!MysteryGift.getIsMysteryGift(fi.Length)) continue;
var mg = MysteryGift.getMysteryGift(File.ReadAllBytes(file), fi.Extension);
if (mg != null)
RawDB.Add(mg);
}
RawDB = new List<MysteryGift>(RawDB.Where(mg => !mg.IsItem && mg.IsPokémon && mg.Species > 0).Distinct().OrderBy(mg => mg.Species));
foreach (var mg in RawDB)
mg.GiftUsed = false;
setResults(RawDB);
Menu_SearchSettings.DropDown.Closing += (sender, e) =>
{
if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
e.Cancel = true;
};
CenterToParent();
}
private readonly Main m_parent;
private readonly PictureBox[] PKXBOXES;
private readonly string DatabasePath = Main.WC6DatabasePath;
private List<MysteryGift> Results;
private readonly List<MysteryGift> RawDB;
private int slotSelected = -1; // = null;
private Image slotColor;
private const int RES_MAX = 66;
private const int RES_MIN = 6;
private readonly string Counter;
private readonly string Viewed;
private const int MAXFORMAT = 6;
// Important Events
private void clickView(object sender, EventArgs e)
{
sender = ((sender as ToolStripItem)?.Owner as ContextMenuStrip)?.SourceControl ?? sender as PictureBox;
int index = Array.IndexOf(PKXBOXES, sender);
var dataArr = Results.Skip(SCR_Box.Value * RES_MIN).Take(RES_MAX).ToArray();
if (index >= dataArr.Length)
System.Media.SystemSounds.Exclamation.Play();
else
{
m_parent.populateFields(dataArr[index].convertToPKM(Main.SAV), false);
slotSelected = index + SCR_Box.Value * RES_MIN;
slotColor = Properties.Resources.slotView;
FillPKXBoxes(SCR_Box.Value);
L_Viewed.Text = string.Format(Viewed, dataArr[index].FileName);
}
}
private void populateComboBoxes()
{
// Set the Text
CB_HeldItem.DisplayMember =
CB_Species.DisplayMember = "Text";
// Set the Value
CB_HeldItem.ValueMember =
CB_Species.ValueMember = "Value";
var Any = new ComboItem {Text = "Any", Value = -1};
var DS_Species = new List<ComboItem>(Main.SpeciesDataSource);
DS_Species.RemoveAt(0); DS_Species.Insert(0, Any); CB_Species.DataSource = DS_Species;
var DS_Item = new List<ComboItem>(Main.ItemDataSource);
DS_Item.Insert(0, Any); CB_HeldItem.DataSource = DS_Item;
// Set the Move ComboBoxes too..
var DS_Move = new List<ComboItem>(Main.MoveDataSource);
DS_Move.RemoveAt(0); DS_Move.Insert(0, Any);
{
foreach (ComboBox cb in new[] { CB_Move1, CB_Move2, CB_Move3, CB_Move4 })
{
cb.DisplayMember = "Text"; cb.ValueMember = "Value";
cb.DataSource = new BindingSource(DS_Move, null);
}
}
// Trigger a Reset
resetFilters(null, null);
}
private void resetFilters(object sender, EventArgs e)
{
CHK_Shiny.Checked = CHK_IsEgg.Checked = true;
CHK_Shiny.CheckState = CHK_IsEgg.CheckState = CheckState.Indeterminate;
CB_HeldItem.SelectedIndex = 0;
CB_Species.SelectedIndex = 0;
CB_Move1.SelectedIndex = CB_Move2.SelectedIndex = CB_Move3.SelectedIndex = CB_Move4.SelectedIndex = 0;
RTB_Instructions.Clear();
if (sender != null)
System.Media.SystemSounds.Asterisk.Play();
}
// IO Usage
private void openDB(object sender, EventArgs e)
{
if (Directory.Exists(DatabasePath))
Process.Start("explorer.exe", DatabasePath);
}
private void Menu_Export_Click(object sender, EventArgs e)
{
if (Results == null || Results.Count == 0)
{ Util.Alert("No results to export."); return; }
if (DialogResult.Yes != Util.Prompt(MessageBoxButtons.YesNo, "Export to a folder?"))
return;
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (DialogResult.OK != fbd.ShowDialog())
return;
string path = fbd.SelectedPath;
if (!Directory.Exists(path)) // just in case...
Directory.CreateDirectory(path);
foreach (var gift in Results)
File.WriteAllBytes(Path.Combine(path, Util.CleanFileName(gift.FileName)), gift.Data);
}
// View Updates
private void B_Search_Click(object sender, EventArgs e)
{
// Populate Search Query Result
IEnumerable<MysteryGift> res = RawDB;
int format = MAXFORMAT + 1 - CB_Format.SelectedIndex;
switch (CB_FormatComparator.SelectedIndex)
{
case 0: /* Do nothing */ break;
case 1: res = res.Where(mg => mg.Format >= format); break;
case 2: res = res.Where(mg => mg.Format == format); break;
case 3: res = res.Where(mg => mg.Format <= format); break;
}
// Primary Searchables
int species = Util.getIndex(CB_Species);
int item = Util.getIndex(CB_HeldItem);
if (species != -1) res = res.Where(pk => pk.Species == species);
if (item != -1) res = res.Where(pk => pk.HeldItem == item);
// Secondary Searchables
int move1 = Util.getIndex(CB_Move1);
int move2 = Util.getIndex(CB_Move2);
int move3 = Util.getIndex(CB_Move3);
int move4 = Util.getIndex(CB_Move4);
if (move1 != -1) res = res.Where(pk => pk.Moves.Contains(move1));
if (move2 != -1) res = res.Where(pk => pk.Moves.Contains(move2));
if (move3 != -1) res = res.Where(pk => pk.Moves.Contains(move3));
if (move4 != -1) res = res.Where(pk => pk.Moves.Contains(move4));
if (CHK_Shiny.CheckState == CheckState.Checked) res = res.Where(pk => pk.IsShiny);
if (CHK_Shiny.CheckState == CheckState.Unchecked) res = res.Where(pk => !pk.IsShiny);
if (CHK_IsEgg.CheckState == CheckState.Checked) res = res.Where(pk => pk.IsEgg);
if (CHK_IsEgg.CheckState == CheckState.Unchecked) res = res.Where(pk => !pk.IsEgg);
slotSelected = -1; // reset the slot last viewed
if (RTB_Instructions.Lines.Any(line => line.Length > 0))
{
var raw =
RTB_Instructions.Lines
.Where(line => !string.IsNullOrWhiteSpace(line))
.Where(line => new[] { '!', '=' }.Contains(line[0]));
var filters = (from line in raw
let eval = line[0] == '='
let split = line.Substring(1).Split('=')
where split.Length == 2 && !string.IsNullOrWhiteSpace(split[0])
select new BatchEditor.StringInstruction { PropertyName = split[0], PropertyValue = split[1], Evaluator = eval }).ToArray();
if (filters.Any(z => string.IsNullOrWhiteSpace(z.PropertyValue)))
{ Util.Error("Empty Filter Value detected."); return; }
res = res.Where(gift => // Compare across all filters
{
foreach (var cmd in filters)
{
if (!gift.GetType().HasProperty(cmd.PropertyName))
return false;
try { if (ReflectUtil.GetValueEquals(gift, cmd.PropertyName, cmd.PropertyValue) == cmd.Evaluator) continue; }
catch { Console.WriteLine($"Unable to compare {cmd.PropertyName} to {cmd.PropertyValue}."); }
return false;
}
return true;
});
}
var results = res.ToArray();
if (results.Length == 0)
{
Util.Alert("No results found!");
}
setResults(new List<MysteryGift>(results)); // updates Count Label as well.
System.Media.SystemSounds.Asterisk.Play();
}
private void updateScroll(object sender, ScrollEventArgs e)
{
if (e.OldValue != e.NewValue)
FillPKXBoxes(e.NewValue);
}
private void setResults(List<MysteryGift> res)
{
Results = new List<MysteryGift>(res);
SCR_Box.Maximum = (int)Math.Ceiling((decimal)Results.Count / RES_MIN);
if (SCR_Box.Maximum > 0) SCR_Box.Maximum -= 1;
SCR_Box.Value = 0;
FillPKXBoxes(0);
L_Count.Text = string.Format(Counter, Results.Count);
}
private void FillPKXBoxes(int start)
{
if (Results == null)
{
for (int i = 0; i < RES_MAX; i++)
PKXBOXES[i].Image = null;
return;
}
var data = Results.Skip(start * RES_MIN).Take(RES_MAX).ToArray();
for (int i = 0; i < data.Length; i++)
PKXBOXES[i].Image = SAV_Wondercard.getSprite(data[i]);
for (int i = data.Length; i < RES_MAX; i++)
PKXBOXES[i].Image = null;
for (int i = 0; i < RES_MAX; i++)
PKXBOXES[i].BackgroundImage = Properties.Resources.slotTrans;
if (slotSelected != -1 && slotSelected >= RES_MIN * start && slotSelected < RES_MIN * start + RES_MAX)
PKXBOXES[slotSelected - start * RES_MIN].BackgroundImage = slotColor ?? Properties.Resources.slotView;
}
private void Menu_SearchAdvanced_Click(object sender, EventArgs e)
{
if (!Menu_SearchAdvanced.Checked)
{ Size = MinimumSize; RTB_Instructions.Clear(); }
else Size = MaximumSize;
}
private void Menu_Exit_Click(object sender, EventArgs e)
{
Close();
}
protected override void OnMouseWheel(MouseEventArgs e)
{
if (!PAN_Box.RectangleToScreen(PAN_Box.ClientRectangle).Contains(MousePosition))
return;
int oldval = SCR_Box.Value;
int newval = oldval + (e.Delta < 0 ? 1 : -1);
if (newval >= SCR_Box.Minimum && SCR_Box.Maximum >= newval)
FillPKXBoxes(SCR_Box.Value = newval);
}
private void changeFormatFilter(object sender, EventArgs e)
{
if (CB_FormatComparator.SelectedIndex == 0)
{
CB_Format.Visible = false; // !any
CB_Format.SelectedIndex = 0;
}
else
{
CB_Format.Visible = true;
int index = MAXFORMAT - Main.SAV.Generation + 1;
CB_Format.SelectedIndex = index < CB_Format.Items.Count ? index : 0; // SAV generation (offset by 1 for "Any")
}
}
}
}

View File

@@ -0,0 +1,420 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="bpkx30.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx29.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx28.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx27.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx26.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx25.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx24.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx23.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx22.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx21.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx20.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx19.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx18.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx17.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx16.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx15.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx14.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx13.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx12.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx11.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx10.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx9.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx8.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx7.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx6.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx5.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx4.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx3.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx2.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx60.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx59.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx58.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx57.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx56.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx55.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx54.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx53.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx52.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx51.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx50.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx49.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx48.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx47.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx46.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx45.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx44.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx43.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx42.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx41.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx40.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx39.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx38.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx37.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx36.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx35.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx34.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx33.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx32.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx31.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="menuStrip1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx66.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx65.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx64.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx63.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx62.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bpkx61.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAE
AAAAAAAAAAAAAAAAAAAAAAAAIyMjAQAAAAALCwsPJiYmJysrKycqKionKSkpJykpKScpKSknKioqJyoq
KicrKysnJycnJw0ODQ8AAAAAJiYmAQAAAABpaWlHq6ur17+/v+6+vr7svr6+7b6+vu2+vr7tvr6+7b6+
vu2+vr7tvr6+7L+/v+6rq6vXampqSAAAAAAoKSgXvr++3eLi4v/g4OD94eHh/+Hh4f/i4uL/4uLi/+Li
4v/i4uL/4eHh/+Dh4P/g4OD94uLi/7+/v90sLCwXfn5+PNna2frg4OD/39/f/uHh4f7h4eH+39/f/uDg
4P7g4OD+39/f/uHh4f7h4OH+39/f/t/g3//a2tr6g4ODPoOCgz7X19f64+Pj/+Li4v7k5OT/4+Tj//Ly
8v/19fX/9PT0//T09P/k5OT/5OTk/+Pj4/7j4+P/19jX+4qLikCDhIM+2tra++Xl5f/k5eT+5OTk//Lz
8v+urq7/RUVF/z4+Pv+Zmpn/8fHx/+Xm5f/k5eT+5eXl/9ra2vyLi4tAhYWFPuXm5vvx8vP/7+/w/v//
//+sra3/AgIC/15eXv9tbG3/BQUF/4yMjP//////7+/w/vHy8//l5ub8jY2NQC4uLD5LS0f7UFBL/09P
Sv5YWVP/FBUS/29wcP///////////5SUlP8PDw//U1NO/1BQS/5PT0r/S0tH/DIyMEAAAAs+AAAM+wAA
Dv8AAA/+AwMS/wAAAP+UlJX///////////+3t7n/AAAA/wAAD/8BAQ/+AAAO/wAADPwCAg5ABARSPgoK
k/sNDab/DQ2o/hAQvP8CAmj/IiIW/7Kzrv/Cw8D/NDQm/wAATf8QELz/DQ2q/gwMp/8LC5T8Dg5bQAUF
Xj4KCpz7DQ2u/w0NsP4NDbX/Dw+//wUFYf8CAhL/AwMP/wMDTf8ODrj/Dg64/w0NsP4MDK7/Cwud/A8P
aEEGBmU9DAyl+w4Otf8ODrf+Dw+6/xAQvv8TE8v/EhK+/xAQvP8TE8v/EBDA/w8Puf8PD7f+Dg61/w0N
pvsREW9ACAhtQA8PsfsTE77/ExO//xQUwP8UFML/FBTD/xUVyP8WFsn/FRXE/xQUw/8UFMH/ExO//xMT
vv8QELL7ERF3QxkZdCgXF771ExPH/xUVyPwVFcn9FhbL/RcXzP0XF8z9FxfM/RcXy/0XF8v9FhbJ/RUV
yPwTE8f/Fxe+9RkZdykAAAAAIyOtghsbx/8ZGcj+GRnJ/xoayf8aGsn/GhrK/xoayv8aGsn/GhrJ/xkZ
yf8ZGcj+GxvH/yMjrYQAAAAAAADHAQAAAAAzM51FLCyscCoqrGwqKqxtKSmsbSoqrG0qKqxtKSmsbSoq
rG0qKqxsLCyscDMznUUAAAAAAAAAAP//AADAAwAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
AACAAQAAgAEAAIABAACAAQAAgAEAAP//AAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKysrCR0dHSMWFhY3GBgYORgYGDkYGBg5GBgYORgY
GDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5FxcXNx4e
HiQuLi4JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhIARYWFis7OzuVkJCQ2ampqeqqqqrsqqqq7Kqq
quyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqq
quypqanqkZGR2j09PZcXFxcsUFBQAQAAAAAAAAAAAAAAAAAAAAASEhIuhISEytvb2/7W1tb/19fX/9jY
2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Y2Nj/2NjY/9jY
2P/Y2Nj/2NjY/9fX1//W1tb/29vb/oeHh8sTExMvAAAAAAAAAAAAAAAAPDw8DGtra6zZ2dn/2dnZ/9ra
2v/b29v/29vb/9vb2//c3Nz/3Nzc/9zc3P/c3Nz/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3Nzc/9zc
3P/c3Nz/3Nzc/9vb2//b29v/29vb/9ra2v/Z2dn/2dnZ/21tba5DQ0MNAAAAAAAAAAAiIiIx1NXU9tna
2f/c3Nz/3d3d/93e3f/e3t7/3t7e/9/f3//f39//39/f/9/g3//g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg
4P/g4OD/39/f/9/f3//f39//3t/e/97e3v/d3t3/3d3d/9zc3P/Z2tn/1dXV9icnJzMAAAAAAAAAAFhZ
WFzf4N//3Nzc/97e3v/f39//39/f/9/g3//g4OD/4ODg/+Hh4f/h4eH/4eHh/+Li4v/i4uL/4uLi/+Li
4v/i4uL/4uLi/+Hi4f/h4eH/4eHh/+Dg4P/g4OD/3+Df/9/f3//f39//3t7e/9zc3P/f39//XV1dXQAA
AAAAAAAAZmZmZdvc2//e3t7/3+Df/+Dg4P/g4eD/4eHh/+Hi4f/i4uL/4uPi/+Pj4//j4+P/5OTk/+Tk
5P/k5OT/5OTk/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Dg4P/f4N//3t7e/9vb
2/9wcHBoAAAAAAAAAABoaGhl3d3d/9/f3//h4eH/4eLh/+Li4v/j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl
5f/l5uX/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh
4f/f39//3N3c/3Nzc2kAAAAAAAAAAGhoaGXe3t7/4ODg/+Li4v/j4+P/4+Pj/+Tk5P/l5eX/5eXl/+bm
5v/m5+b/5+fn/+fn5//n6Of/6Ojo/+jo6P/o6Oj/5+fn/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Pk
4//j4+P/4uLi/+Dg4P/e3t7/c3NzaQAAAAAAAAAAaGhoZd/g3//i4uL/5OTk/+Tl5P/l5eX/5ebl/+bn
5v/n5+f/5+jn/+jp6P/p6en/7Ozs/8LCwv+Tk5P/ioqK/66urv/o6ej/6enp/+jp6P/o6Oj/5+jn/+bn
5v/m5ub/5ebl/+Tl5P/k5OT/4uLi/9/g3/9zdHNpAAAAAAAAAABoaWhl4eLh/+Pk4//m5ub/5ubm/+fn
5//n6Of/6Ojo/+np6f/p6un/6urq/8bGxv8yMjL/AAAA/wAAAP8AAAD/AAAA/xMTE/+ZmZn/7Ozs/+rq
6v/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/k5OT/4eHh/3R0dGkAAAAAAAAAAGhpaGXj4+P/5eXl/+fn
5//n6Of/6Ojo/+np6f/q6ur/6urq/+vr6//Dw8P/DAwM/wAAAP8AAAD/Gxsb/ygoKP8BAQH/AAAA/wAA
AP+FhYX/7O3s/+rr6v/q6ur/6enp/+jo6P/o6Oj/5+fn/+Xl5f/i4+L/dHR0aQAAAAAAAAAAYWFhZeTl
5P/m5+b/6Ono/+np6f/p6un/6uvq/+vr6//s7Oz/7e7t/ycnJ/8AAAD/Ghoa/7S0tP/m5ub/5OTk/9HR
0f9GRkb/AAAA/wICAv/IyMj/7Ozs/+vs6//q6+r/6urq/+nq6f/o6ej/5+fn/+Tk5P9sbGxpAAAAAAAA
AAA9Pj1lj4+P/5OTk/+VlZX/lpaW/5eXl/+YmJj/mZmZ/5qamv92dnb/AAAA/wEBAf+/wL//3Nzc/+Tk
5P/l5eX/3d3d/+Li4v8mJib/AAAA/0ZGRv+ampr/mZmZ/5iYmP+Xl5f/lpaW/5WVlf+Tk5P/j4+P/0ZG
RmoAAAAAAAAAAAwMDGUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Nzc3/+fn
5//q6ur/7O3s/+zt7P/v7+//39/f/4WFhf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/EBAQagAAAAAAAAAAAwMHZQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP9NTU3/5ufm//Lz8v/z9PP/8/Tz//X19f/l5eX/nZ2d/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8GBgpqAAAAAAAAAAAAABZlAQEk/wEBJ/8CAin/AgIq/wICKv8CAiv/AgIs/wIC
LP8BAR3/AAAA/xwcHP/w8PD/6+zr//r6+v/6+vr/9PT0/+vr6/9lZWX/AAAA/wAAD/8CAi3/AgIs/wIC
K/8CAir/AgIq/wICKf8BASf/AQEl/wUFG2oAAAAAAAAAAAICQGUGBpL/Bwec/wgIo/8JCaf/CQmq/wkJ
rf8JCa//Cgqz/wkJqP8AAAL/AAAA/4CAgP/y8/L/6+zr/+3t7f/u7u7/xMTE/wcHB/8AAAD/BgZz/woK
s/8JCbD/CQmt/wkJqv8JCaj/CAik/wcHnf8HB5P/Dg5MagAAAAAAAAAAAwNHZQgIk/8JCZ3/Cgqj/wsL
p/8LC6n/Cwus/wsLr/8MDLL/DAy2/wYGW/8AAAD/AAAA/1JSUv+sraz/tra2/3h4eP8KCgr/AAAA/wIC
Iv8MDLb/DAyy/wsLsP8LC63/Cwuq/wsLp/8KCqT/CQmd/wgIk/8PD1VrAAAAAAAAAAAEBE1lCQmY/woK
ov8LC6j/DAyr/wwMrf8MDLD/DAyy/w0Ntf8NDbf/Dg67/wUFSv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8CAiH/DQ2q/w0NuP8NDbX/DQ2z/wwMsP8MDK7/DAyr/wsLqP8KCqL/CQmZ/xAQWmsAAAAAAAAAAAQE
UGUKCp7/Cwum/wwMrP8NDa//DQ2w/w0Ns/8ODrX/Dg63/w4Ouf8ODrv/Dw/A/wwMiv8FBTj/AAAG/wAA
AP8DAyb/CQls/w8Pu/8PD7z/Dg66/w4OuP8ODrX/DQ2z/w0Nsf8NDa//DAys/wsLp/8KCp7/ERFeawAA
AAAAAAAABQVTZQsLpP8MDKv/DQ2w/w4Os/8ODrT/Dg62/w8PuP8PD7r/Dw+8/w8Pvf8QEL//EBDA/xER
w/8SEsn/ERHJ/xERxf8QEMD/EBC//w8Pvv8PD7z/Dw+6/w8PuP8ODrf/Dg61/w4Os/8NDbH/DAyr/wsL
pP8SEmFrAAAAAAAAAAAGBlZlDAyq/w4OsP8PD7X/Dw+3/w8PuP8QELr/EBC7/xAQvf8REb7/ERHA/xER
wf8REcL/EhLC/xISw/8SEsP/EhLC/xERwv8REcH/ERHA/xERvv8QEL3/EBC7/xAQuv8QELj/Dw+3/w8P
tf8ODrD/DAyq/xMTZWsAAAAAAAAAAAcHWmUODrD/EBC2/xERuv8REbz/ERG9/xISvv8SEr//EhLA/xMT
wf8TE8P/ExPD/xMTxP8TE8X/FBTF/xQUxf8UFMX/ExPE/xMTxP8TE8P/ExPC/xISwf8SEr//EhK+/xER
vf8REbz/ERG6/xAQtv8ODrD/FBRpawAAAAAAAAAACAhcYxAQtf8SErv/ExO+/xQUwP8UFMD/FBTB/xUV
wv8VFcP/FRXE/xUVxf8WFsb/FhbG/xYWx/8WFsf/FhbH/xYWx/8WFsf/FhbG/xYWxf8VFcT/FRXD/xUV
wv8UFMH/FBTB/xQUwP8TE77/EhK7/xAQtf8TE2hoAAAAAAAAAAAQEFNUFRXC/xMTv/8UFMP/FRXE/xUV
xP8VFcX/FRXG/xYWx/8WFsf/FhbI/xYWyf8XF8n/FxfK/xcXyv8XF8r/FxfK/xcXyf8XF8n/FhbI/xYW
yP8WFsf/FhbG/xUVxf8VFcT/FRXE/xQUw/8TE7//FRXB/xAQV1UAAAAAAAAAAA0NPxkjI8byFBTD/xUV
x/8WFsj/FxfJ/xcXyf8XF8r/FxfK/xcXy/8YGMz/GBjM/xgYzP8YGM3/GBjN/xgYzf8YGM3/GBjM/xgY
zP8YGMz/GBjL/xcXy/8XF8r/FxfJ/xcXyf8WFsj/FRXH/xQUw/8jI8f0Dg5GGwAAAAAAAAAAFhZxAiUl
eIUZGcr/FBTI/xUVyv8WFsv/FhbM/xYWzP8WFsz/FhbN/xcXzf8XF83/FxfN/xcXzv8XF87/FxfO/xcX
zv8XF87/FxfN/xcXzf8WFs3/FhbM/xYWzP8WFsz/FhbL/xUVyv8UFMj/GBjJ/yYmeogWFnYCAAAAAAAA
AAAAAAAAGBh1BzMzk50kJNP+FxfK/xgYzP8YGMz/GBjN/xgYzf8YGM3/GBjN/xgYzf8ZGc7/GRnO/xkZ
zv8ZGc7/GRnO/xkZzv8YGM3/GBjN/xgYzf8YGM3/GBjN/xgYzP8YGMz/FxfK/yMj0v4zM5WfFBRkBwAA
AAAAAAAAAAAAAAAAAAAAAAAAHBx7Ay0tdkg3N5emMTGpxSwsp8gsLKfILCynyCwsp8gsLKfILCynyCws
p8gsLKfILCynyCwsp8gsLKfILCynyCwsp8gsLKfILCynyCwsp8gsLKfILCynyDExqcU2NpenLi54Shsb
ewMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////8AAAD+AAAAfAAAADwAAAA8AAAAPAAAADwAAAA8AA
AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA
AAPAAAADwAAAA8AAAAPAAAAD4AAAB/gAAB//////
</value>
</data>
</root>

View File

@@ -48,11 +48,18 @@ private void Setup()
dgv.Columns.Add(dgvIndex);
dgv.Columns.Add(dgvPuff);
dgv.Rows.Add(100);
for (int i = 0; i < 100; i++)
var Puffs = SAV.Puffs;
dgv.Rows.Add(Puffs.Length);
for (int i = 0; i < Puffs.Length; i++)
{
dgv.Rows[i].Cells[0].Value = (i + 1).ToString();
dgv.Rows[i].Cells[1].Value = pfa[SAV.Data[SAV.Puff + i]];
int puffval = Puffs[i];
if (puffval >= pfa.Length)
{
Util.Error($"Invalid Puff Index: {i}", $"Expected < ${pfa.Length}");
puffval = 0;
}
dgv.Rows[i].Cells[1].Value = pfa[puffval];
}
MT_CNT.Text = SAV.PuffCount.ToString();
}

View File

@@ -396,12 +396,12 @@ private void InitializeComponent()
//
// L_PKFriendship
//
this.L_PKFriendship.AutoSize = true;
this.L_PKFriendship.Location = new System.Drawing.Point(265, 166);
this.L_PKFriendship.Location = new System.Drawing.Point(245, 163);
this.L_PKFriendship.Name = "L_PKFriendship";
this.L_PKFriendship.Size = new System.Drawing.Size(55, 13);
this.L_PKFriendship.Size = new System.Drawing.Size(75, 21);
this.L_PKFriendship.TabIndex = 82;
this.L_PKFriendship.Text = "Friendship";
this.L_PKFriendship.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// CB_Ball
//
@@ -451,7 +451,7 @@ private void InitializeComponent()
this.CHK_Shiny.AutoSize = true;
this.CHK_Shiny.Location = new System.Drawing.Point(146, 92);
this.CHK_Shiny.Name = "CHK_Shiny";
this.CHK_Shiny.Size = new System.Drawing.Size(38, 17);
this.CHK_Shiny.Size = new System.Drawing.Size(35, 17);
this.CHK_Shiny.TabIndex = 77;
this.CHK_Shiny.Text = "☆";
this.CHK_Shiny.UseVisualStyleBackColor = true;
@@ -514,7 +514,7 @@ private void InitializeComponent()
this.CB_Move4.FormattingEnabled = true;
this.CB_Move4.Location = new System.Drawing.Point(15, 225);
this.CB_Move4.Name = "CB_Move4";
this.CB_Move4.Size = new System.Drawing.Size(121, 21);
this.CB_Move4.Size = new System.Drawing.Size(122, 21);
this.CB_Move4.TabIndex = 74;
//
// CB_PPu1
@@ -538,7 +538,7 @@ private void InitializeComponent()
this.CB_Move3.FormattingEnabled = true;
this.CB_Move3.Location = new System.Drawing.Point(15, 203);
this.CB_Move3.Name = "CB_Move3";
this.CB_Move3.Size = new System.Drawing.Size(121, 21);
this.CB_Move3.Size = new System.Drawing.Size(122, 21);
this.CB_Move3.TabIndex = 72;
//
// CB_Move2
@@ -548,7 +548,7 @@ private void InitializeComponent()
this.CB_Move2.FormattingEnabled = true;
this.CB_Move2.Location = new System.Drawing.Point(15, 181);
this.CB_Move2.Name = "CB_Move2";
this.CB_Move2.Size = new System.Drawing.Size(121, 21);
this.CB_Move2.Size = new System.Drawing.Size(122, 21);
this.CB_Move2.TabIndex = 70;
//
// CB_Move1
@@ -558,21 +558,21 @@ private void InitializeComponent()
this.CB_Move1.FormattingEnabled = true;
this.CB_Move1.Location = new System.Drawing.Point(15, 159);
this.CB_Move1.Name = "CB_Move1";
this.CB_Move1.Size = new System.Drawing.Size(121, 21);
this.CB_Move1.Size = new System.Drawing.Size(122, 21);
this.CB_Move1.TabIndex = 68;
//
// L_Participant
//
this.L_Participant.AutoSize = true;
this.L_Participant.Location = new System.Drawing.Point(12, 19);
this.L_Participant.Location = new System.Drawing.Point(15, 19);
this.L_Participant.Name = "L_Participant";
this.L_Participant.Size = new System.Drawing.Size(60, 13);
this.L_Participant.Size = new System.Drawing.Size(78, 20);
this.L_Participant.TabIndex = 67;
this.L_Participant.Text = "Participant:";
this.L_Participant.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// NUD_FPKM
//
this.NUD_FPKM.Location = new System.Drawing.Point(78, 17);
this.NUD_FPKM.Location = new System.Drawing.Point(99, 21);
this.NUD_FPKM.Maximum = new decimal(new int[] {
3,
0,
@@ -584,7 +584,7 @@ private void InitializeComponent()
0,
0});
this.NUD_FPKM.Name = "NUD_FPKM";
this.NUD_FPKM.Size = new System.Drawing.Size(35, 20);
this.NUD_FPKM.Size = new System.Drawing.Size(38, 20);
this.NUD_FPKM.TabIndex = 66;
this.NUD_FPKM.Value = new decimal(new int[] {
1,
@@ -627,18 +627,18 @@ private void InitializeComponent()
//
// L_EncryptionConstant
//
this.L_EncryptionConstant.AutoSize = true;
this.L_EncryptionConstant.Location = new System.Drawing.Point(12, 47);
this.L_EncryptionConstant.Location = new System.Drawing.Point(15, 44);
this.L_EncryptionConstant.Name = "L_EncryptionConstant";
this.L_EncryptionConstant.Size = new System.Drawing.Size(32, 13);
this.L_EncryptionConstant.Size = new System.Drawing.Size(56, 21);
this.L_EncryptionConstant.TabIndex = 62;
this.L_EncryptionConstant.Text = "ENC:";
this.L_EncryptionConstant.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// TB_EC
//
this.TB_EC.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.TB_EC.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TB_EC.Location = new System.Drawing.Point(53, 45);
this.TB_EC.Location = new System.Drawing.Point(77, 44);
this.TB_EC.MaxLength = 8;
this.TB_EC.Name = "TB_EC";
this.TB_EC.Size = new System.Drawing.Size(60, 20);
@@ -668,62 +668,62 @@ private void InitializeComponent()
// L_SPE
//
this.L_SPE.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_SPE.AutoSize = true;
this.L_SPE.Location = new System.Drawing.Point(235, 140);
this.L_SPE.Location = new System.Drawing.Point(209, 138);
this.L_SPE.Name = "L_SPE";
this.L_SPE.Size = new System.Drawing.Size(28, 13);
this.L_SPE.Size = new System.Drawing.Size(50, 21);
this.L_SPE.TabIndex = 13;
this.L_SPE.Text = "SPE";
this.L_SPE.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// L_SpD
//
this.L_SpD.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_SpD.AutoSize = true;
this.L_SpD.Location = new System.Drawing.Point(235, 118);
this.L_SpD.Location = new System.Drawing.Point(209, 116);
this.L_SpD.Name = "L_SpD";
this.L_SpD.Size = new System.Drawing.Size(28, 13);
this.L_SpD.Size = new System.Drawing.Size(50, 21);
this.L_SpD.TabIndex = 12;
this.L_SpD.Text = "SpD";
this.L_SpD.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// L_SpA
//
this.L_SpA.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_SpA.AutoSize = true;
this.L_SpA.Location = new System.Drawing.Point(236, 96);
this.L_SpA.Location = new System.Drawing.Point(209, 94);
this.L_SpA.Name = "L_SpA";
this.L_SpA.Size = new System.Drawing.Size(27, 13);
this.L_SpA.Size = new System.Drawing.Size(50, 21);
this.L_SpA.TabIndex = 11;
this.L_SpA.Text = "SpA";
this.L_SpA.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// L_DEF
//
this.L_DEF.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_DEF.AutoSize = true;
this.L_DEF.Location = new System.Drawing.Point(235, 74);
this.L_DEF.Location = new System.Drawing.Point(209, 72);
this.L_DEF.Name = "L_DEF";
this.L_DEF.Size = new System.Drawing.Size(28, 13);
this.L_DEF.Size = new System.Drawing.Size(50, 21);
this.L_DEF.TabIndex = 4;
this.L_DEF.Text = "DEF";
this.L_DEF.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// L_ATK
//
this.L_ATK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_ATK.AutoSize = true;
this.L_ATK.Location = new System.Drawing.Point(235, 52);
this.L_ATK.Location = new System.Drawing.Point(209, 50);
this.L_ATK.Name = "L_ATK";
this.L_ATK.Size = new System.Drawing.Size(28, 13);
this.L_ATK.Size = new System.Drawing.Size(50, 21);
this.L_ATK.TabIndex = 3;
this.L_ATK.Text = "ATK";
this.L_ATK.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// L_HP
//
this.L_HP.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_HP.AutoSize = true;
this.L_HP.Location = new System.Drawing.Point(241, 30);
this.L_HP.Location = new System.Drawing.Point(209, 28);
this.L_HP.Name = "L_HP";
this.L_HP.Size = new System.Drawing.Size(22, 13);
this.L_HP.Size = new System.Drawing.Size(50, 21);
this.L_HP.TabIndex = 2;
this.L_HP.Text = "HP";
this.L_HP.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// f_MAIN
//
@@ -754,7 +754,7 @@ private void InitializeComponent()
//
// NUD_FBaseLocation
//
this.NUD_FBaseLocation.Location = new System.Drawing.Point(128, 35);
this.NUD_FBaseLocation.Location = new System.Drawing.Point(159, 5);
this.NUD_FBaseLocation.Maximum = new decimal(new int[] {
85,
0,
@@ -778,7 +778,7 @@ private void InitializeComponent()
//
this.TB_FT2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.TB_FT2.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TB_FT2.Location = new System.Drawing.Point(240, 132);
this.TB_FT2.Location = new System.Drawing.Point(92, 101);
this.TB_FT2.MaxLength = 16;
this.TB_FT2.Name = "TB_FT2";
this.TB_FT2.Size = new System.Drawing.Size(124, 20);
@@ -788,7 +788,7 @@ private void InitializeComponent()
//
this.TB_FT1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.TB_FT1.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TB_FT1.Location = new System.Drawing.Point(240, 110);
this.TB_FT1.Location = new System.Drawing.Point(92, 80);
this.TB_FT1.MaxLength = 16;
this.TB_FT1.Name = "TB_FT1";
this.TB_FT1.Size = new System.Drawing.Size(124, 20);
@@ -797,10 +797,9 @@ private void InitializeComponent()
// L_TeamSlogan
//
this.L_TeamSlogan.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_TeamSlogan.AutoSize = true;
this.L_TeamSlogan.Location = new System.Drawing.Point(166, 135);
this.L_TeamSlogan.Location = new System.Drawing.Point(11, 100);
this.L_TeamSlogan.Name = "L_TeamSlogan";
this.L_TeamSlogan.Size = new System.Drawing.Size(73, 13);
this.L_TeamSlogan.Size = new System.Drawing.Size(75, 21);
this.L_TeamSlogan.TabIndex = 17;
this.L_TeamSlogan.Text = "Team Slogan:";
this.L_TeamSlogan.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
@@ -808,10 +807,9 @@ private void InitializeComponent()
// L_TeamName
//
this.L_TeamName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_TeamName.AutoSize = true;
this.L_TeamName.Location = new System.Drawing.Point(171, 113);
this.L_TeamName.Location = new System.Drawing.Point(11, 79);
this.L_TeamName.Name = "L_TeamName";
this.L_TeamName.Size = new System.Drawing.Size(68, 13);
this.L_TeamName.Size = new System.Drawing.Size(75, 21);
this.L_TeamName.TabIndex = 16;
this.L_TeamName.Text = "Team Name:";
this.L_TeamName.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
@@ -830,85 +828,85 @@ private void InitializeComponent()
this.GB_Object.Controls.Add(this.NUD_FObjType);
this.GB_Object.Controls.Add(this.L_Index);
this.GB_Object.Controls.Add(this.NUD_FObject);
this.GB_Object.Location = new System.Drawing.Point(6, 158);
this.GB_Object.Location = new System.Drawing.Point(222, 56);
this.GB_Object.Name = "GB_Object";
this.GB_Object.Size = new System.Drawing.Size(357, 103);
this.GB_Object.Size = new System.Drawing.Size(142, 154);
this.GB_Object.TabIndex = 13;
this.GB_Object.TabStop = false;
this.GB_Object.Text = "Object Layout";
//
// L_Y
//
this.L_Y.AutoSize = true;
this.L_Y.Location = new System.Drawing.Point(231, 48);
this.L_Y.Location = new System.Drawing.Point(10, 117);
this.L_Y.Name = "L_Y";
this.L_Y.Size = new System.Drawing.Size(71, 13);
this.L_Y.Size = new System.Drawing.Size(75, 21);
this.L_Y.TabIndex = 9;
this.L_Y.Text = "Y Coordinate:";
this.L_Y.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// L_X
//
this.L_X.AutoSize = true;
this.L_X.Location = new System.Drawing.Point(231, 22);
this.L_X.Location = new System.Drawing.Point(10, 96);
this.L_X.Name = "L_X";
this.L_X.Size = new System.Drawing.Size(71, 13);
this.L_X.Size = new System.Drawing.Size(75, 21);
this.L_X.TabIndex = 8;
this.L_X.Text = "X Coordinate:";
this.L_X.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// NUD_FX
//
this.NUD_FX.Location = new System.Drawing.Point(308, 20);
this.NUD_FX.Location = new System.Drawing.Point(87, 98);
this.NUD_FX.Maximum = new decimal(new int[] {
40,
0,
0,
0});
this.NUD_FX.Name = "NUD_FX";
this.NUD_FX.Size = new System.Drawing.Size(36, 20);
this.NUD_FX.Size = new System.Drawing.Size(40, 20);
this.NUD_FX.TabIndex = 7;
this.NUD_FX.ValueChanged += new System.EventHandler(this.changeObjectQuality);
//
// NUD_FY
//
this.NUD_FY.Location = new System.Drawing.Point(308, 46);
this.NUD_FY.Location = new System.Drawing.Point(87, 119);
this.NUD_FY.Maximum = new decimal(new int[] {
40,
0,
0,
0});
this.NUD_FY.Name = "NUD_FY";
this.NUD_FY.Size = new System.Drawing.Size(36, 20);
this.NUD_FY.Size = new System.Drawing.Size(40, 20);
this.NUD_FY.TabIndex = 6;
this.NUD_FY.ValueChanged += new System.EventHandler(this.changeObjectQuality);
//
// L_Rotation
//
this.L_Rotation.AutoSize = true;
this.L_Rotation.Location = new System.Drawing.Point(6, 74);
this.L_Rotation.Location = new System.Drawing.Point(10, 70);
this.L_Rotation.Name = "L_Rotation";
this.L_Rotation.Size = new System.Drawing.Size(68, 13);
this.L_Rotation.Size = new System.Drawing.Size(75, 21);
this.L_Rotation.TabIndex = 5;
this.L_Rotation.Text = "Rotation Val:";
this.L_Rotation.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// L_Decoration
//
this.L_Decoration.AutoSize = true;
this.L_Decoration.Location = new System.Drawing.Point(12, 48);
this.L_Decoration.Location = new System.Drawing.Point(10, 49);
this.L_Decoration.Name = "L_Decoration";
this.L_Decoration.Size = new System.Drawing.Size(62, 13);
this.L_Decoration.Size = new System.Drawing.Size(75, 21);
this.L_Decoration.TabIndex = 4;
this.L_Decoration.Text = "Decoration:";
this.L_Decoration.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// NUD_FRot
//
this.NUD_FRot.Location = new System.Drawing.Point(76, 72);
this.NUD_FRot.Location = new System.Drawing.Point(87, 72);
this.NUD_FRot.Maximum = new decimal(new int[] {
7,
0,
0,
0});
this.NUD_FRot.Name = "NUD_FRot";
this.NUD_FRot.Size = new System.Drawing.Size(36, 20);
this.NUD_FRot.Size = new System.Drawing.Size(40, 20);
this.NUD_FRot.TabIndex = 3;
this.NUD_FRot.Value = new decimal(new int[] {
1,
@@ -919,7 +917,7 @@ private void InitializeComponent()
//
// NUD_FObjType
//
this.NUD_FObjType.Location = new System.Drawing.Point(76, 46);
this.NUD_FObjType.Location = new System.Drawing.Point(87, 51);
this.NUD_FObjType.Maximum = new decimal(new int[] {
173,
0,
@@ -931,7 +929,7 @@ private void InitializeComponent()
0,
-2147483648});
this.NUD_FObjType.Name = "NUD_FObjType";
this.NUD_FObjType.Size = new System.Drawing.Size(38, 20);
this.NUD_FObjType.Size = new System.Drawing.Size(40, 20);
this.NUD_FObjType.TabIndex = 2;
this.NUD_FObjType.Value = new decimal(new int[] {
1,
@@ -942,16 +940,16 @@ private void InitializeComponent()
//
// L_Index
//
this.L_Index.AutoSize = true;
this.L_Index.Location = new System.Drawing.Point(38, 22);
this.L_Index.Location = new System.Drawing.Point(10, 23);
this.L_Index.Name = "L_Index";
this.L_Index.Size = new System.Drawing.Size(36, 13);
this.L_Index.Size = new System.Drawing.Size(75, 21);
this.L_Index.TabIndex = 1;
this.L_Index.Text = "Index:";
this.L_Index.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// NUD_FObject
//
this.NUD_FObject.Location = new System.Drawing.Point(76, 20);
this.NUD_FObject.Location = new System.Drawing.Point(87, 25);
this.NUD_FObject.Maximum = new decimal(new int[] {
25,
0,
@@ -963,7 +961,7 @@ private void InitializeComponent()
0,
0});
this.NUD_FObject.Name = "NUD_FObject";
this.NUD_FObject.Size = new System.Drawing.Size(36, 20);
this.NUD_FObject.Size = new System.Drawing.Size(40, 20);
this.NUD_FObject.TabIndex = 0;
this.NUD_FObject.Value = new decimal(new int[] {
1,
@@ -974,18 +972,18 @@ private void InitializeComponent()
//
// L_BaseLocation
//
this.L_BaseLocation.AutoSize = true;
this.L_BaseLocation.Location = new System.Drawing.Point(6, 35);
this.L_BaseLocation.Location = new System.Drawing.Point(3, 3);
this.L_BaseLocation.Name = "L_BaseLocation";
this.L_BaseLocation.Size = new System.Drawing.Size(112, 13);
this.L_BaseLocation.Size = new System.Drawing.Size(150, 21);
this.L_BaseLocation.TabIndex = 11;
this.L_BaseLocation.Text = "Secret Base Location:";
this.L_BaseLocation.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// TB_FSay4
//
this.TB_FSay4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.TB_FSay4.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TB_FSay4.Location = new System.Drawing.Point(240, 72);
this.TB_FSay4.Location = new System.Drawing.Point(92, 190);
this.TB_FSay4.MaxLength = 16;
this.TB_FSay4.Name = "TB_FSay4";
this.TB_FSay4.Size = new System.Drawing.Size(124, 20);
@@ -995,7 +993,7 @@ private void InitializeComponent()
//
this.TB_FSay3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.TB_FSay3.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TB_FSay3.Location = new System.Drawing.Point(240, 50);
this.TB_FSay3.Location = new System.Drawing.Point(92, 169);
this.TB_FSay3.MaxLength = 16;
this.TB_FSay3.Name = "TB_FSay3";
this.TB_FSay3.Size = new System.Drawing.Size(124, 20);
@@ -1005,7 +1003,7 @@ private void InitializeComponent()
//
this.TB_FSay2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.TB_FSay2.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TB_FSay2.Location = new System.Drawing.Point(240, 28);
this.TB_FSay2.Location = new System.Drawing.Point(92, 148);
this.TB_FSay2.MaxLength = 16;
this.TB_FSay2.Name = "TB_FSay2";
this.TB_FSay2.Size = new System.Drawing.Size(124, 20);
@@ -1015,7 +1013,7 @@ private void InitializeComponent()
//
this.TB_FSay1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.TB_FSay1.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TB_FSay1.Location = new System.Drawing.Point(240, 6);
this.TB_FSay1.Location = new System.Drawing.Point(92, 127);
this.TB_FSay1.MaxLength = 16;
this.TB_FSay1.Name = "TB_FSay1";
this.TB_FSay1.Size = new System.Drawing.Size(124, 20);
@@ -1024,7 +1022,7 @@ private void InitializeComponent()
// TB_FOT
//
this.TB_FOT.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TB_FOT.Location = new System.Drawing.Point(80, 7);
this.TB_FOT.Location = new System.Drawing.Point(123, 54);
this.TB_FOT.MaxLength = 12;
this.TB_FOT.Name = "TB_FOT";
this.TB_FOT.Size = new System.Drawing.Size(93, 20);
@@ -1032,20 +1030,19 @@ private void InitializeComponent()
//
// L_TrName
//
this.L_TrName.AutoSize = true;
this.L_TrName.Location = new System.Drawing.Point(6, 9);
this.L_TrName.Location = new System.Drawing.Point(9, 53);
this.L_TrName.Name = "L_TrName";
this.L_TrName.Size = new System.Drawing.Size(74, 13);
this.L_TrName.Size = new System.Drawing.Size(108, 21);
this.L_TrName.TabIndex = 9;
this.L_TrName.Text = "Trainer Name:";
this.L_TrName.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// L_Confetti
//
this.L_Confetti.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_Confetti.AutoSize = true;
this.L_Confetti.Location = new System.Drawing.Point(193, 75);
this.L_Confetti.Location = new System.Drawing.Point(11, 189);
this.L_Confetti.Name = "L_Confetti";
this.L_Confetti.Size = new System.Drawing.Size(46, 13);
this.L_Confetti.Size = new System.Drawing.Size(75, 21);
this.L_Confetti.TabIndex = 8;
this.L_Confetti.Text = "Confetti:";
this.L_Confetti.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
@@ -1053,10 +1050,9 @@ private void InitializeComponent()
// L_Blackboard
//
this.L_Blackboard.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_Blackboard.AutoSize = true;
this.L_Blackboard.Location = new System.Drawing.Point(175, 53);
this.L_Blackboard.Location = new System.Drawing.Point(11, 168);
this.L_Blackboard.Name = "L_Blackboard";
this.L_Blackboard.Size = new System.Drawing.Size(64, 13);
this.L_Blackboard.Size = new System.Drawing.Size(75, 21);
this.L_Blackboard.TabIndex = 7;
this.L_Blackboard.Text = "Blackboard:";
this.L_Blackboard.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
@@ -1064,10 +1060,9 @@ private void InitializeComponent()
// L_Encourage
//
this.L_Encourage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_Encourage.AutoSize = true;
this.L_Encourage.Location = new System.Drawing.Point(177, 32);
this.L_Encourage.Location = new System.Drawing.Point(11, 147);
this.L_Encourage.Name = "L_Encourage";
this.L_Encourage.Size = new System.Drawing.Size(62, 13);
this.L_Encourage.Size = new System.Drawing.Size(75, 21);
this.L_Encourage.TabIndex = 6;
this.L_Encourage.Text = "Encourage:";
this.L_Encourage.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
@@ -1075,10 +1070,9 @@ private void InitializeComponent()
// L_Happy
//
this.L_Happy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_Happy.AutoSize = true;
this.L_Happy.Location = new System.Drawing.Point(198, 9);
this.L_Happy.Location = new System.Drawing.Point(11, 126);
this.L_Happy.Name = "L_Happy";
this.L_Happy.Size = new System.Drawing.Size(41, 13);
this.L_Happy.Size = new System.Drawing.Size(75, 21);
this.L_Happy.TabIndex = 5;
this.L_Happy.Text = "Happy:";
this.L_Happy.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
@@ -1098,7 +1092,7 @@ private void InitializeComponent()
// B_GiveDecor
//
this.B_GiveDecor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.B_GiveDecor.Location = new System.Drawing.Point(144, 302);
this.B_GiveDecor.Location = new System.Drawing.Point(162, 302);
this.B_GiveDecor.Name = "B_GiveDecor";
this.B_GiveDecor.Size = new System.Drawing.Size(112, 23);
this.B_GiveDecor.TabIndex = 19;
@@ -1118,7 +1112,7 @@ private void InitializeComponent()
//
// MT_Flags
//
this.MT_Flags.Location = new System.Drawing.Point(93, 304);
this.MT_Flags.Location = new System.Drawing.Point(111, 304);
this.MT_Flags.Mask = "00000";
this.MT_Flags.Name = "MT_Flags";
this.MT_Flags.Size = new System.Drawing.Size(39, 20);
@@ -1127,12 +1121,12 @@ private void InitializeComponent()
//
// L_FlagsCaptured
//
this.L_FlagsCaptured.AutoSize = true;
this.L_FlagsCaptured.Location = new System.Drawing.Point(9, 307);
this.L_FlagsCaptured.Name = "L_FlagsCaptured";
this.L_FlagsCaptured.Size = new System.Drawing.Size(84, 13);
this.L_FlagsCaptured.Size = new System.Drawing.Size(100, 13);
this.L_FlagsCaptured.TabIndex = 22;
this.L_FlagsCaptured.Text = "Flags Captured: ";
this.L_FlagsCaptured.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// B_FDelete
//
@@ -1175,7 +1169,6 @@ private void InitializeComponent()
this.f_MAIN.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.NUD_FBaseLocation)).EndInit();
this.GB_Object.ResumeLayout(false);
this.GB_Object.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.NUD_FX)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.NUD_FY)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.NUD_FRot)).EndInit();

View File

@@ -44,7 +44,7 @@ private void InitializeComponent()
this.TB_Unk = new System.Windows.Forms.MaskedTextBox();
this.L_Unk = new System.Windows.Forms.Label();
this.L_Species = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.L_Time0 = new System.Windows.Forms.Label();
this.L_Records = new System.Windows.Forms.Label();
this.L_Bags = new System.Windows.Forms.Label();
this.L_UNKNOWN = new System.Windows.Forms.Label();
@@ -207,6 +207,8 @@ private void InitializeComponent()
// CB_Species
//
this.CB_Species.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.CB_Species.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.CB_Species.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.CB_Species.FormattingEnabled = true;
this.CB_Species.Location = new System.Drawing.Point(176, 38);
this.CB_Species.Name = "CB_Species";
@@ -243,15 +245,15 @@ private void InitializeComponent()
this.L_Species.TabIndex = 129;
this.L_Species.Text = "Species:";
//
// label4
// L_Time0
//
this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(178, 99);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(33, 13);
this.label4.TabIndex = 130;
this.label4.Text = "Time:";
this.L_Time0.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.L_Time0.AutoSize = true;
this.L_Time0.Location = new System.Drawing.Point(178, 99);
this.L_Time0.Name = "L_Time0";
this.L_Time0.Size = new System.Drawing.Size(33, 13);
this.L_Time0.TabIndex = 130;
this.L_Time0.Text = "Time:";
//
// L_Records
//
@@ -290,7 +292,7 @@ private void InitializeComponent()
this.Controls.Add(this.L_UNKNOWN);
this.Controls.Add(this.L_Bags);
this.Controls.Add(this.L_Records);
this.Controls.Add(this.label4);
this.Controls.Add(this.L_Time0);
this.Controls.Add(this.L_Species);
this.Controls.Add(this.L_Unk);
this.Controls.Add(this.TB_Unk);
@@ -337,7 +339,7 @@ private void InitializeComponent()
private System.Windows.Forms.MaskedTextBox TB_Unk;
private System.Windows.Forms.Label L_Unk;
private System.Windows.Forms.Label L_Species;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label L_Time0;
private System.Windows.Forms.Label L_Records;
private System.Windows.Forms.Label L_Bags;
private System.Windows.Forms.Label L_UNKNOWN;

View File

@@ -179,8 +179,11 @@ private void InitializeComponent()
this.MT_Stat = new System.Windows.Forms.MaskedTextBox();
this.TC_Editor = new System.Windows.Forms.TabControl();
this.Tab_Overview = new System.Windows.Forms.TabPage();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.GB_Stats = new System.Windows.Forms.GroupBox();
this.GB_Adventure = new System.Windows.Forms.GroupBox();
this.L_Fame = new System.Windows.Forms.Label();
this.CAL_HoFDate = new System.Windows.Forms.DateTimePicker();
this.CAL_HoFTime = new System.Windows.Forms.DateTimePicker();
this.L_Started = new System.Windows.Forms.Label();
this.CAL_AdventureStartDate = new System.Windows.Forms.DateTimePicker();
this.CAL_AdventureStartTime = new System.Windows.Forms.DateTimePicker();
@@ -199,9 +202,6 @@ private void InitializeComponent()
this.Tab_Multiplayer = new System.Windows.Forms.TabPage();
this.Tab_Maison = new System.Windows.Forms.TabPage();
this.Tab_Appearance = new System.Windows.Forms.TabPage();
this.L_Fame = new System.Windows.Forms.Label();
this.CAL_HoFDate = new System.Windows.Forms.DateTimePicker();
this.CAL_HoFTime = new System.Windows.Forms.DateTimePicker();
((System.ComponentModel.ISupportInitialize)(this.PB_Badge8)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PB_Badge6)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PB_Badge4)).BeginInit();
@@ -216,8 +216,8 @@ private void InitializeComponent()
((System.ComponentModel.ISupportInitialize)(this.PB_Sprite)).BeginInit();
this.TC_Editor.SuspendLayout();
this.Tab_Overview.SuspendLayout();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.GB_Stats.SuspendLayout();
this.GB_Adventure.SuspendLayout();
this.Tab_BadgeMap.SuspendLayout();
this.GB_Map.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.NUD_Z)).BeginInit();
@@ -1777,8 +1777,8 @@ private void InitializeComponent()
//
// Tab_Overview
//
this.Tab_Overview.Controls.Add(this.groupBox1);
this.Tab_Overview.Controls.Add(this.groupBox2);
this.Tab_Overview.Controls.Add(this.GB_Stats);
this.Tab_Overview.Controls.Add(this.GB_Adventure);
this.Tab_Overview.Controls.Add(this.CB_Vivillon);
this.Tab_Overview.Controls.Add(this.L_Vivillon);
this.Tab_Overview.Controls.Add(this.TB_OTName);
@@ -1808,48 +1808,81 @@ private void InitializeComponent()
this.Tab_Overview.Text = "Overview";
this.Tab_Overview.UseVisualStyleBackColor = true;
//
// groupBox1
// GB_Stats
//
this.groupBox1.Controls.Add(this.TB_BP);
this.groupBox1.Controls.Add(this.TB_PM);
this.groupBox1.Controls.Add(this.L_PM);
this.groupBox1.Controls.Add(this.TB_Style);
this.groupBox1.Controls.Add(this.L_Offset);
this.groupBox1.Controls.Add(this.L_BP);
this.groupBox1.Controls.Add(this.L_Value);
this.groupBox1.Controls.Add(this.L_Style);
this.groupBox1.Controls.Add(this.MT_Stat);
this.groupBox1.Controls.Add(this.CB_Stats);
this.groupBox1.Location = new System.Drawing.Point(209, 99);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(171, 151);
this.groupBox1.TabIndex = 55;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Stats";
this.GB_Stats.Controls.Add(this.TB_BP);
this.GB_Stats.Controls.Add(this.TB_PM);
this.GB_Stats.Controls.Add(this.L_PM);
this.GB_Stats.Controls.Add(this.TB_Style);
this.GB_Stats.Controls.Add(this.L_Offset);
this.GB_Stats.Controls.Add(this.L_BP);
this.GB_Stats.Controls.Add(this.L_Value);
this.GB_Stats.Controls.Add(this.L_Style);
this.GB_Stats.Controls.Add(this.MT_Stat);
this.GB_Stats.Controls.Add(this.CB_Stats);
this.GB_Stats.Location = new System.Drawing.Point(209, 99);
this.GB_Stats.Name = "GB_Stats";
this.GB_Stats.Size = new System.Drawing.Size(171, 151);
this.GB_Stats.TabIndex = 55;
this.GB_Stats.TabStop = false;
this.GB_Stats.Text = "Stats";
//
// groupBox2
// GB_Adventure
//
this.groupBox2.Controls.Add(this.L_Fame);
this.groupBox2.Controls.Add(this.CAL_HoFDate);
this.groupBox2.Controls.Add(this.CAL_HoFTime);
this.groupBox2.Controls.Add(this.L_Started);
this.groupBox2.Controls.Add(this.CAL_AdventureStartDate);
this.groupBox2.Controls.Add(this.CAL_LastSavedDate);
this.groupBox2.Controls.Add(this.L_LastSaved);
this.groupBox2.Controls.Add(this.MT_Seconds);
this.groupBox2.Controls.Add(this.MT_Hours);
this.groupBox2.Controls.Add(this.L_Seconds);
this.groupBox2.Controls.Add(this.L_Hours);
this.groupBox2.Controls.Add(this.MT_Minutes);
this.groupBox2.Controls.Add(this.L_Minutes);
this.groupBox2.Controls.Add(this.CAL_AdventureStartTime);
this.groupBox2.Controls.Add(this.CAL_LastSavedTime);
this.groupBox2.Location = new System.Drawing.Point(3, 99);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(200, 151);
this.groupBox2.TabIndex = 56;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Adventure Info";
this.GB_Adventure.Controls.Add(this.L_Fame);
this.GB_Adventure.Controls.Add(this.CAL_HoFDate);
this.GB_Adventure.Controls.Add(this.CAL_HoFTime);
this.GB_Adventure.Controls.Add(this.L_Started);
this.GB_Adventure.Controls.Add(this.CAL_AdventureStartDate);
this.GB_Adventure.Controls.Add(this.CAL_LastSavedDate);
this.GB_Adventure.Controls.Add(this.L_LastSaved);
this.GB_Adventure.Controls.Add(this.MT_Seconds);
this.GB_Adventure.Controls.Add(this.MT_Hours);
this.GB_Adventure.Controls.Add(this.L_Seconds);
this.GB_Adventure.Controls.Add(this.L_Hours);
this.GB_Adventure.Controls.Add(this.MT_Minutes);
this.GB_Adventure.Controls.Add(this.L_Minutes);
this.GB_Adventure.Controls.Add(this.CAL_AdventureStartTime);
this.GB_Adventure.Controls.Add(this.CAL_LastSavedTime);
this.GB_Adventure.Location = new System.Drawing.Point(3, 99);
this.GB_Adventure.Name = "GB_Adventure";
this.GB_Adventure.Size = new System.Drawing.Size(200, 151);
this.GB_Adventure.TabIndex = 56;
this.GB_Adventure.TabStop = false;
this.GB_Adventure.Text = "Adventure Info";
//
// L_Fame
//
this.L_Fame.Location = new System.Drawing.Point(3, 72);
this.L_Fame.Name = "L_Fame";
this.L_Fame.Size = new System.Drawing.Size(80, 20);
this.L_Fame.TabIndex = 40;
this.L_Fame.Text = "HoF Entered:";
this.L_Fame.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// CAL_HoFDate
//
this.CAL_HoFDate.Format = System.Windows.Forms.DateTimePickerFormat.Short;
this.CAL_HoFDate.Location = new System.Drawing.Point(89, 72);
this.CAL_HoFDate.MaxDate = new System.DateTime(2050, 12, 31, 0, 0, 0, 0);
this.CAL_HoFDate.MinDate = new System.DateTime(2000, 1, 1, 0, 0, 0, 0);
this.CAL_HoFDate.Name = "CAL_HoFDate";
this.CAL_HoFDate.Size = new System.Drawing.Size(99, 20);
this.CAL_HoFDate.TabIndex = 39;
this.CAL_HoFDate.Value = new System.DateTime(2000, 1, 1, 0, 0, 0, 0);
//
// CAL_HoFTime
//
this.CAL_HoFTime.CustomFormat = "hh:mm tt";
this.CAL_HoFTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
this.CAL_HoFTime.Location = new System.Drawing.Point(115, 91);
this.CAL_HoFTime.MaxDate = new System.DateTime(2050, 12, 31, 0, 0, 0, 0);
this.CAL_HoFTime.MinDate = new System.DateTime(2000, 1, 1, 0, 0, 0, 0);
this.CAL_HoFTime.Name = "CAL_HoFTime";
this.CAL_HoFTime.ShowUpDown = true;
this.CAL_HoFTime.Size = new System.Drawing.Size(73, 20);
this.CAL_HoFTime.TabIndex = 38;
this.CAL_HoFTime.Value = new System.DateTime(2001, 1, 1, 0, 0, 0, 0);
//
// L_Started
//
@@ -2119,39 +2152,6 @@ private void InitializeComponent()
this.Tab_Appearance.Text = "Appearance";
this.Tab_Appearance.UseVisualStyleBackColor = true;
//
// L_Fame
//
this.L_Fame.Location = new System.Drawing.Point(3, 72);
this.L_Fame.Name = "L_Fame";
this.L_Fame.Size = new System.Drawing.Size(80, 20);
this.L_Fame.TabIndex = 40;
this.L_Fame.Text = "HoF Entered:";
this.L_Fame.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// CAL_HoFDate
//
this.CAL_HoFDate.Format = System.Windows.Forms.DateTimePickerFormat.Short;
this.CAL_HoFDate.Location = new System.Drawing.Point(89, 72);
this.CAL_HoFDate.MaxDate = new System.DateTime(2050, 12, 31, 0, 0, 0, 0);
this.CAL_HoFDate.MinDate = new System.DateTime(2000, 1, 1, 0, 0, 0, 0);
this.CAL_HoFDate.Name = "CAL_HoFDate";
this.CAL_HoFDate.Size = new System.Drawing.Size(99, 20);
this.CAL_HoFDate.TabIndex = 39;
this.CAL_HoFDate.Value = new System.DateTime(2000, 1, 1, 0, 0, 0, 0);
//
// CAL_HoFTime
//
this.CAL_HoFTime.CustomFormat = "hh:mm tt";
this.CAL_HoFTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
this.CAL_HoFTime.Location = new System.Drawing.Point(115, 91);
this.CAL_HoFTime.MaxDate = new System.DateTime(2050, 12, 31, 0, 0, 0, 0);
this.CAL_HoFTime.MinDate = new System.DateTime(2000, 1, 1, 0, 0, 0, 0);
this.CAL_HoFTime.Name = "CAL_HoFTime";
this.CAL_HoFTime.ShowUpDown = true;
this.CAL_HoFTime.Size = new System.Drawing.Size(73, 20);
this.CAL_HoFTime.TabIndex = 38;
this.CAL_HoFTime.Value = new System.DateTime(2001, 1, 1, 0, 0, 0, 0);
//
// SAV_Trainer
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -2185,10 +2185,10 @@ private void InitializeComponent()
this.TC_Editor.ResumeLayout(false);
this.Tab_Overview.ResumeLayout(false);
this.Tab_Overview.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.GB_Stats.ResumeLayout(false);
this.GB_Stats.PerformLayout();
this.GB_Adventure.ResumeLayout(false);
this.GB_Adventure.PerformLayout();
this.Tab_BadgeMap.ResumeLayout(false);
this.Tab_BadgeMap.PerformLayout();
this.GB_Map.ResumeLayout(false);
@@ -2371,8 +2371,8 @@ private void InitializeComponent()
private System.Windows.Forms.NumericUpDown NUD_M;
private System.Windows.Forms.NumericUpDown NUD_Z;
private System.Windows.Forms.GroupBox GB_Map;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox GB_Adventure;
private System.Windows.Forms.GroupBox GB_Stats;
private System.Windows.Forms.DateTimePicker CAL_AdventureStartDate;
private System.Windows.Forms.DateTimePicker CAL_AdventureStartTime;
private System.Windows.Forms.Label L_Started;

View File

@@ -42,6 +42,9 @@ public SAV_BoxViewer(Main p)
pb.DragEnter += pbBoxSlot_DragEnter;
pb.QueryContinueDrag += pbBoxSlot_QueryContinueDrag;
}
for (int i = SAV.BoxSlotCount; i < SlotPictureBoxes.Length; i++)
SlotPictureBoxes[i].Visible = false;
try
{
CB_BoxSelect.Items.Clear();
@@ -87,7 +90,7 @@ private void setPKXBoxes()
int boxbgval = SAV.getBoxWallpaper(CB_BoxSelect.SelectedIndex);
PAN_Box.BackgroundImage = BoxWallpaper.getWallpaper(SAV, boxbgval);
for (int i = 0; i < SlotPictureBoxes.Length; i++)
for (int i = 0; i < SAV.BoxSlotCount; i++)
getSlotFiller(boxoffset + SAV.SIZE_STORED*i, SlotPictureBoxes[i]);
}
private void getSlotFiller(int offset, PictureBox pb)

View File

@@ -49,9 +49,10 @@ private void InitializeComponent()
this.B_LoadNew = new System.Windows.Forms.Button();
this.B_LoadOld = new System.Windows.Forms.Button();
this.GB_Flags = new System.Windows.Forms.GroupBox();
this.TLP_Flags = new System.Windows.Forms.TableLayoutPanel();
this.GB_Constants = new System.Windows.Forms.GroupBox();
this.TLP_Const = new System.Windows.Forms.TableLayoutPanel();
this.TLP_Flags = new System.Windows.Forms.TableLayoutPanel();
this.L_EventFlagWarn = new System.Windows.Forms.Label();
this.GB_FlagStatus.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.nud)).BeginInit();
this.GB_Researcher.SuspendLayout();
@@ -271,21 +272,38 @@ private void InitializeComponent()
this.GB_Flags.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.GB_Flags.Controls.Add(this.TLP_Flags);
this.GB_Flags.Location = new System.Drawing.Point(12, 12);
this.GB_Flags.Location = new System.Drawing.Point(12, 24);
this.GB_Flags.Name = "GB_Flags";
this.GB_Flags.Size = new System.Drawing.Size(212, 210);
this.GB_Flags.Size = new System.Drawing.Size(212, 198);
this.GB_Flags.TabIndex = 39;
this.GB_Flags.TabStop = false;
this.GB_Flags.Text = "Event Flags";
//
// TLP_Flags
//
this.TLP_Flags.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.TLP_Flags.AutoScroll = true;
this.TLP_Flags.ColumnCount = 2;
this.TLP_Flags.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.TLP_Flags.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.TLP_Flags.Location = new System.Drawing.Point(6, 19);
this.TLP_Flags.Name = "TLP_Flags";
this.TLP_Flags.RowCount = 2;
this.TLP_Flags.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.TLP_Flags.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.TLP_Flags.Size = new System.Drawing.Size(200, 172);
this.TLP_Flags.TabIndex = 0;
//
// GB_Constants
//
this.GB_Constants.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.GB_Constants.Controls.Add(this.TLP_Const);
this.GB_Constants.Location = new System.Drawing.Point(235, 12);
this.GB_Constants.Location = new System.Drawing.Point(235, 24);
this.GB_Constants.Name = "GB_Constants";
this.GB_Constants.Size = new System.Drawing.Size(212, 210);
this.GB_Constants.Size = new System.Drawing.Size(212, 198);
this.GB_Constants.TabIndex = 40;
this.GB_Constants.TabStop = false;
this.GB_Constants.Text = "Event Constants";
@@ -303,31 +321,28 @@ private void InitializeComponent()
this.TLP_Const.Name = "TLP_Const";
this.TLP_Const.RowCount = 1;
this.TLP_Const.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.TLP_Const.Size = new System.Drawing.Size(200, 184);
this.TLP_Const.Size = new System.Drawing.Size(200, 172);
this.TLP_Const.TabIndex = 0;
//
// TLP_Flags
// L_EventFlagWarn
//
this.TLP_Flags.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
this.L_EventFlagWarn.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.TLP_Flags.AutoScroll = true;
this.TLP_Flags.ColumnCount = 2;
this.TLP_Flags.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.TLP_Flags.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.TLP_Flags.Location = new System.Drawing.Point(6, 19);
this.TLP_Flags.Name = "TLP_Flags";
this.TLP_Flags.RowCount = 2;
this.TLP_Flags.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.TLP_Flags.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.TLP_Flags.Size = new System.Drawing.Size(200, 184);
this.TLP_Flags.TabIndex = 0;
this.L_EventFlagWarn.ForeColor = System.Drawing.Color.Red;
this.L_EventFlagWarn.Location = new System.Drawing.Point(12, 1);
this.L_EventFlagWarn.Name = "L_EventFlagWarn";
this.L_EventFlagWarn.Size = new System.Drawing.Size(435, 20);
this.L_EventFlagWarn.TabIndex = 41;
this.L_EventFlagWarn.Text = "Altering Event Flags may impact other story events. Save file backups are recomme" +
"nded.";
this.L_EventFlagWarn.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// SAV_EventFlags
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(454, 351);
this.Controls.Add(this.L_EventFlagWarn);
this.Controls.Add(this.GB_Constants);
this.Controls.Add(this.GB_Flags);
this.Controls.Add(this.GB_Researcher);
@@ -378,5 +393,6 @@ private void InitializeComponent()
private System.Windows.Forms.GroupBox GB_Constants;
private System.Windows.Forms.TableLayoutPanel TLP_Const;
private System.Windows.Forms.TableLayoutPanel TLP_Flags;
private System.Windows.Forms.Label L_EventFlagWarn;
}
}

View File

@@ -218,7 +218,7 @@ private void changeCustomFlag(object sender, EventArgs e)
else
{
c_CustomFlag.Enabled = true;
nud.BackColor = Main.defaultControlWhite;
nud.ResetBackColor();
c_CustomFlag.Checked = flags[flag];
}
}
@@ -301,7 +301,7 @@ private void diffSaves()
SaveFile s1 = SaveUtil.getVariantSAV(File.ReadAllBytes(TB_OldSAV.Text));
SaveFile s2 = SaveUtil.getVariantSAV(File.ReadAllBytes(TB_NewSAV.Text));
if (s1.GetType() != s2.GetType()) { Util.Alert("Save types are different.", $"S1: {s1.GetType()}", $"S2: {s2.GetType()}"); return; }
if (s1.GetType() != s2.GetType()) { Util.Alert("Save types are different.", $"S1: {s1.GetType().Name}", $"S2: {s2.GetType().Name}"); return; }
if (s1.Version != s2.Version) { Util.Alert("Save versions are different.", $"S1: {s1.Version}", $"S2: {s2.Version}"); return; }
string tbIsSet = "";

View File

@@ -1,4 +1,5 @@
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
@@ -13,11 +14,16 @@ public SAV_Inventory()
switch (SAV.Generation)
{
case 1:
itemlist = PKX.getG1ItemList();
itemlist = Main.g1items;
B_GiveAll.Visible = false; // Can't give all, not enough room
break;
case 2:
itemlist = Main.g2items;
B_GiveAll.Visible = false;
break;
case 3:
itemlist = Main.g3items;
B_GiveAll.Visible = false;
break;
default:
itemlist = Main.itemlist;
@@ -47,6 +53,8 @@ private void B_Save_Click(object sender, EventArgs e)
private void getBags()
{
tabControl1.SizeMode = TabSizeMode.Fixed;
tabControl1.ItemSize = new Size(IL_Pouch.Images[0].Width + 4, 0);
for (int i = 0; i < Pouches.Length; i++)
{
// Add Tab
@@ -167,7 +175,7 @@ private void packBags()
itemcnt++; // No 0 count of items
else if (itemcnt > 995)
itemcnt = 995; // cap out
else if (itemcnt > 99 && SAV.Generation < 3)
else if (itemcnt > 99 && SAV.Generation <= 3)
itemcnt = 99;
if (itemindex == 0) // Compression of Empty Slots

View File

@@ -124,9 +124,9 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADE
IwAAAk1TRnQBSQFMAgEBCAEAARgBAAEIAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABgAMAAWADAAEBAQABCAYAATAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABc
DwAAAk1TRnQBSQFMAgEBCAEAARgBAAEIAQABGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABYAMAAUgDAAEBAQABCAYAARsYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
@@ -154,130 +154,43 @@
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8A/wD/AP8A
/wD/AP8A/wD/AP8A/wD/AP8AFAAT9BMADfQbAAf0CAAg9AMAAfQE/wn0BP8B9BMAAfQL/wH0GwAB9AL/
AfQC/wH0CAAe/wL0AQAD9AH/AvQCGQEJAtwB1QLcAQkBGQHzA/8D9A0ABPQB8wEZCdwBGQHzBPQHAAn0
AwAG9AEJAdUB3QH/AfQIAAH/ARkb3AEZAvQBAAH0Av8B9AIZAQkB3AHbAtQBzQLUAdsBCQEZA/QC/wH0
DQAB9AP/ARkB3AHUB80B1AHcARkD/wH0BwAB9Af/AfQDAAH0A/8B9AEZAdUBzQHcAf8B9AgAAf8B3BnN
AtQB3AL0AQAB9AH/AhkB3ALVA9QDzQLUAtUB3AEJAhkB/wH0CwAC9AHzARkC3AHVAtQHzQLUAdUC3AEZ
AfMC9AUAAfQB/wH1BPQB/wX0Af8C9AHcAdUB1AHNAdwB/wH0CAAB/wHcAc0a1AHcAvQBAAL0ARkB3AHU
C80C1AHbAdwBGQL0CwAB9AH/ARkB3AHUD80B1AHcARkB/wH0BQAB9AH/AfQEGQH0Bf8B9AIZAdUDzQHc
Af8B9AgAAf8B3AHNAdQB2xXcAdsB2gHUAdwD9ALzAQkB2wHUDM0C1AHcAQkB8wP0BwAC9AHzARkB3ALU
D80C1AHcARkB8wL0AwAB9AH/ARkB3AHbAdUB3AEJARkD8wEZAQkB3AHVAdQDzQHcAf8B9AgAAf8B3AHN
AdQB2xXcAdsB2gHUAdwD9ALzAdwC1A3NAdQB1QEJAfMB9AH/AfQHAAH0Af8BGQHcAdQTzQHUAdwBGQH/
AfQDAAL0AdwC1AHNAdQB2wHcA90B3AHbAdQFzQHcAf8B9AgAAf8B3AHNAdQB2xXcAdsB2gHUAdwC9AH/
ARkBCQHVAdQOzQLUAdwBGQHzAf8B9AcAAfQB/wHcAtQTzQLUAdwB/wH0AwAC9AEZAdwB1QTUA9UD1AXN
AdwB/wn0Af8B3AHNAdQB2xXcAdsB2gHUAdwC9AH/ARkB2wHUD80C1AHbAdwBGQL0BwAB9AH/AdwXzQHc
Af8B9AUAAfQB/wHcAtQNzQHcAv8I9AH/AdwBzQHUAdsV3AHbAdoB1AHcAvQB/wHcAtQEzQHUC80C1AHb
AQkC9AYAAfQB8wEZAdUHzQLUAdUD3AHVAtQHzQHVARkB8wL0AwAB9AH/AQkB2wHUBM0H1ALNAdUIGQH/
AfQB/wHcAc0B1AHbFdwB2wHaAdQB3AL0Af8B3AXNA9QLzQLUAdwC9AYAAf8BGQHcAdQHzQHUAdwBGQP/
ARkB3AHUB80B1AHcARkB/wH0AwAC9AEZAQkB1QPNCdQBzQHUB9wBGQH/AfQB/wHcAc0B1AHbFdwB2wHa
AdQB3AL0Af8B3AHUAs0BzgHUAdUB2wHVA9QHzQLUAdoB3AL0BgAB/wHcAtQFzQLUAdwBGQXcARkB3ALU
Bc0C1AHcAf8B9AMAAvQB8wEZAdwB1AHOAc0E1AHVA9sB1AHNBtQB1QHcAd0B/wH0Af8B3AHNAdQB2xXc
AdsB2gHUAdwC9AH/AdwC1AHNAdQB1QHcAQkB3AHbAdoC1AXNAtQB2gHbAQkC9AYAAf8B3AfNAdQB3AEZ
Af8B3APNAdwB/wEZAdwB1AfNAdwB/wH0BQAB9AH/AQkB1QHUAc0B1APVBNwB1AfNAdQB1QEJAvQB/wHc
Ac0B1AHbFdwB2wHaAdQB3AL0Af8BGQHcAdQBzgHUAdUB3AEZAtwB2wLUBc0C1AHbAdwBGQL0BgAB/wHc
B9QB3AEZAtwB1APNAdQC3AEZAdwH1AHcAf8B9AMABPQB3AHbAdQBzQTUAdsD3AHUBM0D1AHbAQkBGQL0
Af8B3AHNAdQB2wfcAdsB1QPUAdUB2wfcAdsB2gHUAdwD9AIZAdYBzgHUAdUB3AEZAQkB3AHbAtQFzQLU
AdwCGQL0BgAB/wEZB9wBGQH/AdwHzQHcAf8BGQfcARkB/wH0AwAC9AIZAdwB2wHUAc0E1AHbA9wB1APN
AtQB2gHbAQkC9AIAAf8B3AHNAdQB2wbcAdsC1APNAtQB2wbcAdsB2gHUAdwE9AEZAdwD1AHVAtwB2wLU
Bc0C1AHbAdwBGQP0BgAB/wH0BxkB9AH/AdwHzQHcAf8B9AcZAfQB/wH0AQAC9AEZAQkC3AHVAtQBzQHU
B9sB1AHNAtQB1QLcAQkBGQL0AgAB/wHcAc0B1AHbBdwB2wHVB9QB1QHbBdwB2wHaAdQB3AL0AQAC9AEJ
AdsB1AHNAdQB1QPUBc0C1AHbAdwBGQL0CAAL/wHcB80B3Av/AfQBAAL0AQkB1QPUA80B1APcAdsE1AHN
AdQB3AEJAhkC9AQAAf8B3AHNAdQB2wTcAdsC1AHVBdwB1QLUAdsE3AHbAdoB1AHcAvQBAAL0ARkB3AHb
AdQB1QHbA9QCzQPUAdUB2wHcARkB8wL0AQAH9AH/ARkI3AEZAtwB1APNAdQC3AEZCNwBGQH/AvQBGQEJ
AdUD1ATNAdQD3AHbBNQBzQHUAdwBCQT0BAAB/wHcAc0B1AHbA9wC2wHaAdsH3AHVAdQB1QHbA9wB2wHa
AdQB3AL0AQAC9AIZAQkC3AHbAdoC1AHNAtQB2gHbAdwBCQHxAvMC9AEAAfQC/wT0Af8B3AfNAdQB3AEZ
Af8B3APNAdwB/wEZAdwB1AfNAdwB/wL0AQkB1QHUB80B1ATcA9UB1AHNAdQB1QEJAf8B9AYAAf8B3AHN
AdQB2wLcAdsB1AHaAdsJ3AHVAtQB2wLcAdsB2gHUAdwC9AEAA/QDGQIJAdwB2wPUAdsB3AEJAhkB8wb0
Af8B9AEZA/QB/wHcAtQFzQLUAdwBGQXcARkB3ALUBc0C1AHcAf8B9AH/Ad0B3AbVAc4BzQHUA9sB1QTU
Ac0BzgHUAdwBGQHzAvQEAAH/AdwBzQHUBNsB2gHbC9wB2wHaBNsB2gHUAdwC9AMABPQC8wEZAtwB2wLc
ARkC8wH0Av8B9AEAAfQC/wH0AxkC9AH/ARkB3AHUB80B1AHcARkD/wEZAdwB1AfNAdQB3AEZAf8B9AH/
ARkHCQHVAc0J1APNAdUBCQEZAvQEAAH/AdwBzQHUAdsB2gHUAdoB2w3cAdsB2gHUAdoB2wHaAdQB3AL0
AwAE9ALzAQkB3AHbAdoB2wHcAQkC8wL0Af8B9ALzARkBCQPcARkD9AHzARkB1QfNAtQB1QPcAdUC1AfN
AdUBGQHzAvQB/wHzBxkB1QLNB9QEzQHUAdsBCQH/AfQEAAH/AdwBzQPUAdoB2w/cAdsB2gTUAdwC9AcA
AvQBCQHVAtQB2gHbAdwCGQP0AvMB8QEJAdsD1AHcAvQBAAH0Af8B3BfNAdwB/wH0AgAH9AL/AdwNzQLU
AdwB/wH0BAAB/wHcA80B1AHbEdwB2wHUAc0C1AHcAvQHAAL0Ad0B3AHVA9QB1QfcAtUD1AHbAQkC9AEA
AfQB/wHcAtQTzQLUAdwB/wH0AgAI9AH/AdwFzQPUA9UE1AHVAdwBGQL0AgAB/wHcAc0C1AHbE9wB2wPU
AdwC9AcAAvQBGQHcAdsC1AHNCdQDzQHUAdwBGQL0AQAB9AH/ARkB3AHUE80B1AHcARkB/wH0CQAB9AH/
AdwFzQHUAdsB3AMZAdwB2wHUAc0C1AHcAvQCAAH/AdwBzQHUAdsV3AHbAdoB1AHcAvQHAAH0Af8CGQHc
AdsO1AHcAhkB/wH0AQAC9AHzARkB3ALUD80C1AHcARkB8wL0CQAB9AH/AdwDzQHUAdUB3AEJARkD9AEZ
AQkB3AHVAdsB3AEZAf8B9AIAAf8B3AHNAdQB2xXcAdsB2gHUAdwC9AcAAfQC/wH0ARkB3AHbAtQHzQLU
AdsB3AEZAfQC/wH0AwAB9AH/ARkB3AHUD80B1AHcARkB/wH0CwAB9AH/AdwDzQHVAhkB9AX/AfQEGQH0
Af8B9AIAAf8B3AHNAdQB2xXcAdsB2gHUAdwC9AcAA/QB/wIZAQkB3AHbAtQEzQHUAdUB3AEJAhkB/wP0
AwAC9AHzARkC3AHVAtQHzQLUAdUC3AEZAfMC9AsAAfQB/wHcAc0B1AHVAQkC9AH/BfQB/wT0AfUB/wH0
AgAB/wHcAc0a1AHcAvQJAAH0Av8D9AEJAdsB1APNAtQB3AP0Av8B9AcAAfQD/wEZAdwB1AfNAdQB3AEZ
A/8B9A0AAfQB/wHcAc0B1QH0BP8B9AMAAfQH/wH0AgAB/wHcGc0C1AHcAvQJAAb0ARkBCQbcARkG9AcA
BPQB8wEZCdwBGQHzBPQNAAH0Af8BGQHcAd0G9AMACfQCAAH/ARkb3AEZAvQPAAL0Bf8C9BEAAfQL/wH0
EQAB9AP/AfQUAB7/AvQHABH0DQAJ9B0ACfQMACD0BwAC9A3/AvQNAAH0B/8B9B0AAfQH/wH0DAAe/wL0
AwAF9AIZAQkJ3AMZBfQFAAT0AfMBGQXcARkB8wT0FQAE9AEZB9wBGQT0CAAB/wEZGNwCGQT0AwAC9AL/
AfQBGQHcAdUB1AfNAdQB2wHcARkB9AL/AvQFAAH0A/8BGQHcAdQDzQHUAdwBGQP/AfQVAAH0A/8B3AfN
AdwD/wH0CAAB/wHcAtQVzQHUAdsB3AIZAvQBAAL0AfMBGQEJAtwB1QLUAc4HzQPUAdUC3AEJARkB8wL0
AwAB9AH/ARkB3AHVAtQDzQLUAdUB3AEZAf8B9BMAAvQBGQPcAdUB1AHVA9wB1QHUAdUD3AEZAvQGAAH/
AdwC1BXNAdQB2wHcAhkC9AEAAvQBGQEJAdsC1A/NAtQB2wEJARkC9AMAAfQB/wHcC80B3AH/AfQTAAH0
Af8B3APNAdQB3AEZA/8BGQHcAdQDzQHcAf8B9AYAAf8B3ALUFc0B1AHbAdwCGQL0AQAC9AEJAdsC1BHN
AdQB1QHcAd0C9AIAAfQB8wEZAdUDzQHUA9wB1APNAdUBGQHzAvQPAAL0ARkB3AHVAdQB1QLcARkB9AP/
ARkB3AHbA9QB1QHcARkC9AQAAf8B3ALUFc0B1AHbAdwCGQL0AQAC9AHcAtQTzQHUAdUBCQL0AgAB/wEZ
AdwB1APNAdwD/wHcA80B1AHcARkB/wH0DwAB9AH/AdwBzQHUAdwBGQf/ARkF3AHUAc0B3AH/AfQEAAH/
AdwC1BXNAdQB2wHcAhkD9AHzARkB2wLUE80C1AHcARkB8wL0Af8B3ALUAc0B1AHcARkD9AEZAdwB1AHN
AtQB3AH/AfQNAAL0ARkB3AHVAdQB3AEZAfQF/wH0ARkBCQXcAdsB1AHVAdwBGQL0AgAB/wHcAtQVzQHU
AdsB3AIZAvQB/wEZAdwB2wLUE80C1AHbAQkBGQL0Af8B3APNAdwB/wH0AwAB9AH/AdwDzQHcAf8B9A0A
AfQB/wHcAc0B1AHcARkH/wEZCdwB1AHNAdwB/wH0AgAB/wHcAtQVzQHUAdsB3AIZAvQB/wEJAdsC1BXN
AtQB2wEJAvQB/wHcA80B3AH/AfQDAAH0Af8B3APNAdwB/wH0DQAB9AH/AdwBzQHVARkB9Af/ARkJ3AHU
Ac0B3AH/AfQCAAH/AdwC1BXNAdQB2wHcAhkC9AH/AdwC1BfNAtQB3AL0Af8B3APNAdwB/wH0AwAB9AH/
AdwDzQHcAf8B9A0AAfQB/wHcAc0B3An/ARkJ3AHUAc0B3AH/AfQCAAH/AdwC1BXNAdQB2wHcAhkC9AH/
AdwC1BfNAtQB3AL0Af8B3ALUAc0B1AHcARkD9AEZAdwB1AHNAtQB3AH/AfQMAAH0ARkB3AHVAdQB3AX/
AfQBGQLcAdUB1AHbB9wB2wHUAdUB3AEZAvQB/wEJAdsB1RXUAdsC3AIZAvQB/wHcAtQXzQLUAdwC9AH/
ARkB3AHUA80B3AP/AdwDzQHUAdwBGQH/AfQMAAH/AdwBzQHUAdwBGQX/ARkB3AHUA80B1AncAdQBzQHc
Af8B9AH/ARkBCRjcAQkCGQL0Af8BCQHbAtQVzQLUAdsBCQP0AfMBGQHVA80B1APcAdQDzQHVARkB8wL0
AQAD9AgAAf8B3AHNAdUBGQH0Bf8B3AHUAdwDCQHcAdQB2wPcAQkDGQHVAc0B3AH/AfQB/wEZAQkY3AEJ
AhkC9AH/ARkB3AHbAtQTzQLUAdsBCQEZAvQBAAH0Af8B3AvNAdwB/wH0AwAB9AH/AfQIAAH/AdwBzQHc
B/8B3AHNAQkDAAEJAc0B1APcARkD/wHcAc0B3AH/AfQB/wEZAQkY3AEJAhkD9AHzARkB2wLUE80C1AHc
ARkB8wL0AQAB9AH/ARkB3AHVAtQFzQLUAdwB/wH0AQAC9AHzARkB8wL0BgAB/wHcAc0B3AP/AfQDGQHV
Ac0BCQMAAQkBzQHVAxkB9AP/AdwBzQHcAf8B9AH/AQkB2wHVFdQB2wLcAhkC9AEAAvQB3ALUE80B1AHV
AQkC9AMAAfQD/wEZAdwB1AXNAdQB3AEZAf8B9AEAAfQB/wEZAdwBGQH/AfQGAAH/AdwBzQHcA/8BGQPc
AdQBzQEJAwABCQHNAdwH/wHcAc0B3AH/AfQB/wHcAtQVzQHUAdsB3AIZAvQBAAL0AQkB2wLUEc0B1AHV
AdwB3QL0AwAE9AHzARkE3AHUAc0C1AHcARkB8wH0AfMBGQHcAdQB1QHcARkC9AQAAf8B3AHNAdUDGQEJ
A9wB2wHUAdwDCQHcAdQB3AX/AfQBGQHVAc0B3AH/AfQB/wHcAtQVzQHUAdsB3AIZAvQBAAL0ARkBCQHb
AtQPzQLUAdsBCQEZAvQHAAH0Bf8B3APNAdQB3AEZAf8BGQHcAdQDzQHcAf8B9AQAAf8B3AHNAdQJ3AHU
A80B1AHcARkF/wEZAdwB1AHNAdwB/wH0Af8B3ALUFc0B1AHbAdwCGQL0AQAC9AHzARkBCQLcAtUL1ALV
AtwBCQEZAfMC9AcABvQBGQHcAdQBzQLUAdwBGQHcAtQBzQHUAtwBGQHzAvQCAAH0ARkB3AHVAdQB2wfc
AdsB1AHVAtwBGQH0Bf8B3AHUAdUB3AEZAvQB/wHcAtQVzQHUAdsB3AIZAvQDAAL0Av8B9AEZAQkL3AEJ
ARkB9AL/AvQPAAH0Af8B3APNAdQB3AHUA80B3AH/ARkB3AEZAf8B9AMAAfQB/wHcAc0B1AncARkJ/wHc
Ac0B3AH/AfQCAAH/AdwC1BXNAdQB2wHcAhkC9AMAA/QB/wH0ARkC3AHVB9QB2wLcARkB9AH/A/QPAAL0
ARkB3AHUAc0D1AHNAdQC3AEZAdwB1AHVAdwBGQL0AQAB9AH/AdwBzQHUCdwBGQf/AfQBGQHVAc0B3AH/
AfQCAAH/ARkC3ALVE9QB2wHcARkE9AUAAvQCGQHcAdUB1AfNAdQB2wHcAhkC9BMAAfQB/wHcBc0B3AH/
ARkB3AHUA80B3AH/AfQBAAH0Af8B3AHNAdQJ3AEZB/8BGQHcAdQBzQHcAf8B9AIAA/8B9AEZAQkT3AEJ
ARkB9AL/AvQDAAL0AfMBGQLcAdUB1AHOB80C1AHVAdwCGQP0EQAC9AEZAdwB1APNAdUBGQHcAtQBzQHU
AdwBGQL0AQAC9AEZAdwB1QHUAdsF3AEJARkB9AX/AfQBGQHcAdQB1QHcARkC9AIAAvQB/wEZAdwB2w/U
AdUB2wLcAQkBGQH0Af8D9AMAAvQBGQEJAdsC1AvNAdQB1QHcAhkC9BMAAfQB/wHcA80B1AHcAdQDzQHc
Af8B9AUAAfQB/wHcAc0B1AXcARkH/wEZAdwB1AHNAdwB/wH0BQAC9AEJAdsB1A/NAtQB2wHcAQkCGQL0
AwAC9AHzARkBCQHbAtQMzQHOAdQB1QLcARkB8wL0EQAC9AEZAdwB1AHNA9QBzQHUAdwBGQL0BQAC9AEZ
AdwB1QPUAdsB3AEZA/8B9AEZAtwB1QHUAdUB3AEZAvQFAAL0AQkB2wHUD80C1AHbAdwBCQIZAvQDAAL0
ARkBCQHbAtQPzQLUAdsBCQEZAvQTAAH0Af8B3AXNAdwB/wH0CQAB9AH/AdwDzQHUAdwBGQP/ARkB3AHU
A80B3AH/AfQHAAL0AQkB2wHUD80C1AHbAdwBCQIZAvQDAAL0ARkBCQHbAtQPzQLUAdsBCQEZAvQTAAL0
ARkB3AHUAc0B1AHcARkC9AkAAvQBGQPcAdUB1AHVA9wB1QHUAdUD3AEZAvQHAAL0AQkB2wHUD80C1AHb
AdwBCQIZAvQDAAL0ARkBCQHbAtQPzQLUAdsBCQEZAvQVAAH0Af8B3AHNAdwB/wH0DQAB9AP/AdwHzQHc
A/8B9AkAAvQBCQHbAdQPzQLUAdsB3AEJAhkC9AMAAvQB8wEZAQkT3AEJARkB8wL0FQAC9AEZAdwBGQL0
DQAE9AEZB9wBGQT0CQAC9AIZEtwBCQIZBPQFAAL0Ff8C9BkAAfQB/wH0EwAB9Af/AfQNAAL0Gf8C9AIA
AUIBTQE+BwABPgMAASgDAAGAAwABYAMAAQEBAAEBBgABBhYAA///AP8AAwAB4AEAAQMC/wGAAQMD/wGA
Af8EAAHgAQABAwL/AYABAwP/AYAB/wQAAYACAAH/AfgCAAE/AYABOAEAAf8EAAGAAgAB/wH4AgABPwGA
ATgBAAH/BAABgAIAAf8B4AIAAQ8BgAIAAf8EAAGAAgAB/wHgAgABDwGAAgAB/wcAAT8BgAIAAQMBgAIA
Af8HAAE/AYACAAEDAYACAAH/BwABPwGAAgABAwGACgABPwGAAgABAwHgCgABPwQAAeAKAAE/BAAB4AoA
AT8EAAHgCgABPwQAAfgKAAE/BAAB4AoAAT8EAAHgAgABAwcAAT8EAAGAAgABAwQAAYACAAH/BAABgAIA
AQ8EAAGAAgABgAcAAQ8EAAGAAgABgAcAAT8EAAGACgABDwQAAeABAAECCAABDwQAAeAKAAEPBAAB/gMA
AYACAAEDAwABDwQAAf4DAAGAAgABAwMAAQMEAAH+AwABgAIAAQMB/gIAAQMEAAH+AwABgAIAAQMB/gIA
AQMEAAH+AwAB4AIAAQ8B/gIAAQMEAAH+AwAB4AIAAQ8B/gIAAQMEAAH/AYABAAEDAfgCAAE/Af4BAAE4
AQMEAAH/AYABAAEDAfgCAAE/Af4BAAE4AQMEAAH/Af4BAAL/AYABAwH/Af4BDwL/BAAB/gIAAf8B+AED
A/8B4AEPAf8EAAH+AgAB/wH4AQMD/wHgAQ8B/wQAAeACAAEPAYABAAE/Af8B/gIAAf8EAAHgAgABDwGA
AQABPwH/Af4CAAH/BAABgAIAAQMBgAEAAT8B/wH4AgABPwQAAYACAAEDAYABAAE/Af8B+AIAAT8EAAGA
AgABAwIAAQ8B/wHgAgABDwQAAYACAAEDAgABDwH/AeACAAEPCgABDwH/AYACAAEDCQAB4AEPAf8BgAIA
AQMJAAHgAQ8B/wGAAgABAwkAAeABDwH/AYACAAEDCgABDwH/DgABDwH/DgABCAH/DAABgAEAATgB/wEA
AQMBgAkAAYABAAEgAT8BAAEDAYAFAAGAAgABAwGAAQABIAE/AQABAwGABQABgAIAAQMBgAIAAQ8IAAGA
AgABAwH4AgABDwgAAYACAAEDAfgCAAEDCAAB4AIAAQ8B/wHgAQABAwGAAgABAwQAAeACAAEPAf8B4AIA
AYACAAEDBAAB+AIAAT8B/wH4AgABgAIAAQMEAAHgAgABDwH/AfgCAAGAAgABAwQAAeACAAEPAf8B/gEA
AQMB4AIAAQ8BgAIAAQMBgAIAAQMB/wH+AQABAwHgAgABDwGAAgABAwGAAgABAwL/AYABDwH4AgABPwGA
AgABAwGAAgABAwL/AYABDwH4AgABPwGAAgABAwGAAgABAwL/AeABPwH+AgAB/wGAAgABAwGAAgABAwL/
AeABPwH+AgAB/wGAAgABAwHgAgABDwL/AfgC/wHgAQ8B/wGAAgABAws=
/wD/AAwAFHEEABRLBAAUrAQAFJADABZxAgAWSwIAFqwCABaQAQAYcRhLGKwYkBhxGEsYrBiQCXEE/wtx
CUsG/wlLDqwC/wisBZAP/wSQB3EC/wHcAs0B3AL/CXEHSwL/AdwEzQHcAv8HSw2sAf8BzQH/CKwFkAH/
Dc0B/wSQBnEB/wHcBs0B3AH/CHEGSwH/AdwIzQHcAf8GSwWsBP8CrAL/As0B/wisBZAB/wHNC9wBzQH/
BJAGcQH/CM0B/whxBUsB/wHcCs0B3AH/BUsFrAH/As0B3AL/AdwDzQH/CKwFkAH/Ac0L3AHNAf8EkAVx
Af8B3AjNAdwB/wdxBUsB/wzNAf8FSwasAf8IzQH/CKwFkAH/Ac0L3AHNAf8EkAVxAf8KzQH/B3EESwH/
AdwEzQHcAv8B3ATNAdwB/wRLBqwB/wHcB80F/wSsBZAB/wHNC9wBzQH/BJAFTwH/A80B3AbNAf8HTwRS
Af8EzQHcAf8CzQH/AdwEzQH/BFIHrQH/As0E3AXNAf8ErQWWAf8BzQvcAc0B/wSWBU8B/wHcAc0C/wHc
BM0B3AH/B08EUgH/BNwB/wTNAf8E3AH/BFIHrQL/A80C3ATNAf8FrQWWAf8BzQTcA80E3AHNAf8ElgZV
Af8CzQH/Bc0B/whVBFkG/wTNBv8EWQbVAf8B3ALNBNwCzQHcAf8G1QW5Af8BzQPcAc0D3AHNA9wBzQH/
BLkGVQH/AdwGzQHcAf8IVQRZAf8EzQHcAf8CzQH/AdwEzQH/BFkF1QH/BM0C3APNAv8H1QW5Af8BzQLc
Ac0F3AHNAtwBzQH/BLkHVQL/AdwCzQHcAv8DVQL/BFUEWQH/AdwEzQHcAv8B3ATNAdwB/wRZBNUB/wXN
BNwCzQH/B9UFuQH/Ac0B3AHNB9wBzQHcAc0B/wS5CVUB/wLcAf8EVQH/AdwB/wRVBVkB/wzNAf8FWQTV
Bf8HzQHcAf8G1QW5Af8CzQncAs0B/wS5CVUB/wLNAdwD/wHcAs0B/wRVBVkB/wHcCs0B3AH/BVkI1QH/
CM0B/wbVBbkB/wHNC9wBzQH/BLkJVQH/AdwHzQHcAf8EVQZZAf8B3AjNAdwB/wZZCNUB/wPNAdwC/wHc
As0B/wXVBbkB/wHNC9wBzQH/BLkKVQH/AdwFzQHcAf8FVQdZAv8B3ATNAdwC/wdZCNUB/wLNAv8C1QT/
BdUFuQH/Dc0B/wS5C1UC/wPNAv8GVQlZBv8JWQjVAf8BzQH/DdUFuQ//BLkNVQP/CFUYWQjVAv8O1Ri5
GFUYWRjVGLkBABZVAgAWWQIAFtUCABa5AwAUVQQAFFkEABTVBAAUuQQAFI0EABSoBAAUUAQAFEsDABaN
AgAWqAIAFlACABZLAQAYjRioGFAYSxiNGKgYUBhLCY0G/wmNB6gE/w2oClAE/wpQBksM/wZLB40C/wHc
BM0B3AL/B40FqAL/AdwCzQHcAv8LqAhQAv8EzQL/CFAGSwH/Cc0B3AH/BksGjQH/AdwIzQHcAf8GjQWo
Af8GzQH/C6gHUAH/As0B3AL/AdwCzQH/B1AGSwH/Cc0B3AH/BksGjQH/Cs0B/waNBKgB/wHcAs0C/wLN
AdwB/wqoBlAB/wHNAdwE/wPcAc0B/wZQBksB/wnNAdwB/wZLBY0B/wHcCs0B3AH/BY0EqAH/As0B/wKo
Af8CzQH/CqgFUAH/Ac0B3AT/BdwBzQH/BVAGSwH/Cc0B3AH/BksFjQH/DM0B/wWNBKgB/wLNAf8CqAH/
As0B/wqoBVAB/wHNBf8F3AHNAf8FUAZLAf8JzQHcAf8GSwWOAf8MzQH/BY4EygH/AdwCzQL/As0B3AH/
CsoEVwH/Ac0B3AP/AdwCzQXcAc0B/wRXBkwB/wrcAf8GTAWOAf8B3ArNAdwB/wWOBcoB/wbNAf8CygH/
CMoEVwH/Ac0E/wHNAlcBzQLcAv8BzQH/BFcGTAH/CtwB/wZMBrcB/wrNAf8GtwXQAv8B3APNAdwB/wHQ
Af8B3AH/B9AEXAH/Ac0C/wLcAc0CXAHNBP8BzQH/BFwGTQH/Cc0B3AH/Bk0GtwH/AdwIzQHcAf8GtwfQ
A/8CzQHcAf8B3ALNAf8G0ARcAf8BzQXcAs0B3AP/AdwBzQH/BFwGTQH/Cc0B3AH/Bk0HtwL/BtwC/we3
CtAB/wLNAdwCzQH/AdwB/wXQBVwB/wHNBdwF/wHNAf8FXAZNAf8JzQHcAf8GTQi3Af8B3ATNAdwB/wi3
C9AB/wPNAf8B3ALNAf8E0AVcAf8BzQXcBP8B3AHNAf8FXAZNAv8I3AL/Bk0HtwH/AdwGzQHcAf8HtwzQ
Af8CzQHcAs0B/wXQBlwB/wHNA9wE/wHcAc0B/wZcB00B/wfNAdwB/wdNBrcB/wHcCM0B3AH/BrcN0AH/
A80B/wbQB1wB/wLNAdwC/wHcAs0B/wdcB00B/wfNAdwB/wdNBrcB/wHcCM0B3AH/BrcO0AH/Ac0B/wfQ
CFwC/wTNAv8IXAdNAf8HzQHcAf8HTQe3Cv8Htw/QAf8I0ApcBP8KXAdNCv8HTRi3GNAYXBhNGLcY0Bhc
GE0BABa3AgAW0AIAFlwCABZNAwAUtwQAFNAEABRcBAAUTQIAAUIBTQE+BwABPgMAASgDAAFgAwABSAMA
AQEBAAEBBQABYAEDFgAD//8AIgABwAEAAQMBwAEAAQMBwAEAAQMBwAEAAQMBgAEAAQEBgAEAAQEBgAEA
AQEBgAEAAQHwAAGAAQABAQGAAQABAQGAAQABAQGAAQABAQHAAQABAwHAAQABAwHAAQABAwHAAQABAwHA
AQABAwHAAQABAwHAAQABAwHAAQABAwGAAQABAQGAAQABAQGAAQABAQGAAQABAfAAAYABAAEBAYABAAEB
AYABAAEBAYABAAEBAcABAAEDAcABAAEDAcABAAEDAcABAAEDCw==
</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

View File

@@ -13,7 +13,8 @@ public SAV_SimpleTrainer()
cba = new[] {CHK_1, CHK_2, CHK_3, CHK_4, CHK_5, CHK_6, CHK_7, CHK_8};
TB_OTName.MaxLength = SAV.OTLength;
B_MaxCash.Click += (sender, e) => MT_Money.Text = "9,999,999";
B_MaxCash.Click += (sender, e) => MT_Money.Text = SAV.MaxMoney.ToString();
MT_Money.Mask = "00000000000".Substring(0, SAV.MaxMoney.ToString().Length);
B_MaxCoins.Click += (sender, e) => MT_Coins.Text = "9999";
CB_Gender.Items.Clear();
@@ -55,6 +56,28 @@ public SAV_SimpleTrainer()
CB_TextSpeed.SelectedIndex = sav1.TextSpeed;
}
if (SAV is SAV2)
{
SAV2 sav2 = (SAV2)SAV;
MT_Coins.Text = sav2.Coin.ToString();
L_Started.Visible = L_Fame.Visible = false;
CAL_AdventureStartDate.Visible = CAL_HoFDate.Visible = false;
CAL_AdventureStartTime.Visible = CAL_HoFTime.Visible = false;
GB_Map.Visible = false;
GB_Options.Visible = true;
CB_BattleStyle.Items.AddRange(new[] { "Switch", "Set" });
CB_SoundType.Items.AddRange(new[] { "Mono", "Stereo" });
CB_TextSpeed.Items.AddRange(new[] { "0 (Instant)", "1 (Fast)", "2", "3 (Normal)", "4", "5 (Slow)", "6", "7" });
CHK_BattleEffects.Checked = sav2.BattleEffects;
CB_BattleStyle.SelectedIndex = sav2.BattleStyleSwitch ? 0 : 1;
CB_SoundType.SelectedIndex = sav2.Sound > 0 ? 1 : 0;
CB_TextSpeed.SelectedIndex = sav2.TextSpeed;
badgeval = sav2.Badges;
cba = new[] { CHK_1, CHK_2, CHK_3, CHK_4, CHK_6, CHK_5, CHK_7, CHK_8, CHK_H1, CHK_H2, CHK_H3, CHK_H4, CHK_H5, CHK_H6, CHK_H7, CHK_H8 };
}
if (SAV is SAV3)
{
GB_Map.Visible = false;
@@ -143,6 +166,18 @@ private void B_Save_Click(object sender, EventArgs e)
sav1.TextSpeed = CB_TextSpeed.SelectedIndex;
}
if (SAV is SAV2)
{
SAV2 sav2 = (SAV2)SAV;
sav2.Coin = (ushort)Util.ToUInt32(MT_Coins.Text);
sav2.Badges = badgeval & 0xFFFF;
sav2.BattleEffects = CHK_BattleEffects.Checked;
sav2.BattleStyleSwitch = CB_BattleStyle.SelectedIndex == 0;
sav2.Sound = CB_SoundType.SelectedIndex > 0 ? 2 : 0;
sav2.TextSpeed = CB_TextSpeed.SelectedIndex;
}
if (SAV is SAV4)
{
SAV4 s = (SAV4)SAV;

View File

@@ -468,7 +468,7 @@ private void pbBoxSlot_DragEnter(object sender, DragEventArgs e)
}
private int wc_slot = -1;
private static Image getSprite(MysteryGift gift)
internal static Image getSprite(MysteryGift gift)
{
Image img;
if (gift.IsPokémon)
@@ -487,7 +487,7 @@ private static string getDescription(MysteryGift gift)
if (gift.Empty)
return "Empty Slot. No data!";
string s = gift.getCardHeader();
string s = gift.getCardHeader() + Environment.NewLine;
if (gift.IsItem)
{
s += "Item: " + Main.itemlist[gift.Item] + Environment.NewLine + "Quantity: " + gift.Quantity;

View File

@@ -30,7 +30,7 @@ internal static uint SwapEndianness(uint val)
/// </summary>
/// <param name="val">Value to swap endianness of.</param>
/// <returns>The endianness-swapped value.</returns>
internal static int SwapEndianness(short val)
internal static short SwapEndianness(short val)
{
return (short)SwapEndianness((ushort)val);
}

View File

@@ -55,6 +55,13 @@ public static string[] getStringList(string f, string l)
rawlist[i] = rawlist[i].Trim();
return rawlist;
}
public static string[] getStringListFallback(string f, string l, string fallback)
{
string[] text = getStringList(f, l);
if (text.Length == 0)
text = getStringList(f, fallback);
return text;
}
internal static string[] getNulledStringArray(string[] SimpleStringList)
{
try