2014-06-28 21:22:05 +00:00
using System ;
using System.Collections.Generic ;
2016-01-03 04:22:53 +00:00
using System.Diagnostics ;
2014-06-28 21:22:05 +00:00
using System.Drawing ;
using System.IO ;
2015-02-13 04:26:23 +00:00
using System.Linq ;
2016-01-03 18:47:44 +00:00
using System.Media ;
2015-02-13 04:26:23 +00:00
using System.Text ;
using System.Threading ;
using System.Windows.Forms ;
2014-06-28 21:22:05 +00:00
namespace PKHeX
{
2015-09-21 03:34:09 +00:00
public partial class Main : Form
2014-06-28 21:22:05 +00:00
{
2015-09-21 03:34:09 +00:00
public Main ( )
2014-06-28 21:22:05 +00:00
{
#region Initialize Form
2016-01-24 18:19:30 +00:00
new Thread ( ( ) = > new SplashScreen ( ) . ShowDialog ( ) ) . Start ( ) ;
2014-06-28 21:22:05 +00:00
InitializeComponent ( ) ;
2015-10-24 03:13:32 +00:00
// Initialize SAV-Set Parameters in case compilation settings were changed.
SAV6 . SetUpdateDex = Menu_ModifyDex . Checked ;
SAV6 . SetUpdatePK6 = Menu_ModifyPK6 . Checked ;
2015-09-21 03:34:09 +00:00
SlotPictureBoxes = 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 ,
ppkx1 , ppkx2 , ppkx3 , ppkx4 , ppkx5 , ppkx6 ,
bbpkx1 , bbpkx2 , bbpkx3 , bbpkx4 , bbpkx5 , bbpkx6 ,
dcpkx1 , dcpkx2 , gtspkx , fusedpkx , subepkx1 , subepkx2 , subepkx3 ,
} ;
2014-12-20 04:22:15 +00:00
defaultControlWhite = CB_Species . BackColor ;
defaultControlText = Label_Species . ForeColor ;
2014-06-28 21:22:05 +00:00
CB_ExtraBytes . SelectedIndex = 0 ;
2015-01-01 19:38:37 +00:00
2015-01-25 01:57:42 +00:00
// Initialize Boxes
2015-10-24 03:13:32 +00:00
for ( int i = 0 ; i < 30 * 31 ; i + + )
2015-12-24 23:38:07 +00:00
SAV . setData ( blankEK6 , SAV . Box + i * PK6 . SIZE_STORED ) ;
2015-11-19 05:37:30 +00:00
2014-06-28 21:22:05 +00:00
// Set up Language Selection
2014-12-14 18:31:53 +00:00
foreach ( var cbItem in main_langlist )
CB_MainLanguage . Items . Add ( cbItem ) ;
2014-06-28 21:22:05 +00:00
2015-11-19 05:37:30 +00:00
// ToolTips for Drag&Drop
new ToolTip ( ) . SetToolTip ( dragout , "PK6 QuickSave" ) ;
// Box Drag & Drop
foreach ( PictureBox pb in PAN_Box . Controls )
2015-11-22 18:45:44 +00:00
{
2015-11-19 05:37:30 +00:00
pb . AllowDrop = true ;
2015-11-22 19:03:38 +00:00
// The PictureBoxes have their own drag&drop event handlers.
2015-11-22 18:45:44 +00:00
}
foreach ( TabPage tab in tabMain . TabPages )
{
tab . AllowDrop = true ;
tab . DragDrop + = tabMain_DragDrop ;
tab . DragEnter + = tabMain_DragEnter ;
}
foreach ( TabPage tab in tabBoxMulti . TabPages )
{
tab . AllowDrop = true ;
tab . DragDrop + = tabMain_DragDrop ;
tab . DragEnter + = tabMain_DragEnter ;
}
2015-11-19 05:37:30 +00:00
// Box to Tabs D&D
dragout . AllowDrop = true ;
2016-01-03 18:47:44 +00:00
string [ ] args = Environment . GetCommandLineArgs ( ) ;
string filename = args . Length > 0 ? Path . GetFileNameWithoutExtension ( args [ 0 ] ) : "" ;
2016-01-05 06:42:38 +00:00
HaX = filename . IndexOf ( "HaX" , StringComparison . Ordinal ) > = 0 ;
2015-11-19 05:37:30 +00:00
// Show Hacked Stuff if HaX
CHK_HackedStats . Enabled = CHK_HackedStats . Visible = DEV_Ability . Enabled = DEV_Ability . Visible =
MT_Level . Enabled = MT_Level . Visible = TB_AbilityNumber . Visible = MT_Form . Enabled = MT_Form . Visible = HaX ;
// Hide Regular Stuff if !HaX
TB_Level . Visible = CB_Ability . Visible = ! HaX ;
#endregion
#region Localize & Populate Fields
2014-06-28 21:22:05 +00:00
// Try and detect the language
2015-04-05 17:48:18 +00:00
int [ ] main_langnum = { 1 , 2 , 3 , 4 , 5 , 7 , 8 , 9 } ;
2016-01-24 18:19:30 +00:00
main_langnum = main_langnum . Concat ( Enumerable . Range ( 10 , lang_val . Length ) . Select ( i = > i ) ) . ToArray ( ) ;
2016-01-05 06:42:38 +00:00
string lastTwoChars = filename . Length > 2 ? filename . Substring ( filename . Length - 2 ) : "" ;
int lang = filename . Length > 2 ? Array . IndexOf ( lang_val , lastTwoChars ) : - 1 ;
CB_MainLanguage . SelectedIndex = lang > = 0 ? main_langnum [ lang ] - 1 : ( lastTwoChars = = "jp" ? 1 : 0 ) ;
2014-08-17 01:42:51 +00:00
2015-09-25 02:54:50 +00:00
InitializeFields ( ) ;
2016-01-05 06:42:38 +00:00
CB_Language . SelectedIndex = lang > = 0 & & lang < 7 ? main_langnum [ lang ] : 1 ;
2014-06-28 21:22:05 +00:00
#endregion
2015-11-19 05:37:30 +00:00
#region Load Initial File ( s )
2014-11-28 03:26:42 +00:00
// Load the arguments
2015-01-27 06:05:04 +00:00
pathSDF = Util . GetSDFLocation ( ) ;
2015-01-31 23:59:23 +00:00
path3DS = Util . get3DSLocation ( ) ;
2014-08-31 20:32:04 +00:00
if ( args . Length > 1 )
2015-09-13 16:10:44 +00:00
{
foreach ( string arg in args . Skip ( 1 ) . Where ( a = > a . Length > 4 ) )
openQuick ( arg ) ;
}
2015-11-04 02:35:27 +00:00
else if ( path3DS ! = null & & File . Exists ( Path . Combine ( Path . GetPathRoot ( path3DS ) , "ramsav.bin" ) ) )
openQuick ( Path . Combine ( Path . GetPathRoot ( path3DS ) , "ramsav.bin" ) ) ;
2015-09-12 05:17:13 +00:00
else if ( path3DS ! = null & & File . Exists ( Path . Combine ( Path . GetPathRoot ( path3DS ) , "SaveDataBackup" , "main" ) ) )
openQuick ( Path . Combine ( Path . GetPathRoot ( path3DS ) , "SaveDataBackup" , "main" ) ) ;
2015-01-27 06:05:04 +00:00
else if ( pathSDF ! = null )
openQuick ( Path . Combine ( pathSDF , "main" ) ) ;
2015-12-14 15:52:25 +00:00
else if ( File . Exists ( Util . NormalizePath ( Path . Combine ( Util . GetTempFolder ( ) , "root" , "main" ) ) ) )
openQuick ( Util . NormalizePath ( Path . Combine ( Util . GetTempFolder ( ) , "root" , "main" ) ) ) ;
2014-08-31 20:32:04 +00:00
2014-12-20 19:27:29 +00:00
GB_OT . Click + = clickGT ;
GB_nOT . Click + = clickGT ;
2014-12-28 21:56:59 +00:00
GB_Daycare . Click + = switchDaycare ;
2015-06-28 21:34:38 +00:00
GB_RelearnMoves . Click + = clickMoves ;
2015-01-31 06:37:38 +00:00
TB_Nickname . Font = PKX . getPKXFont ( 11 ) ;
TB_OT . Font = ( Font ) TB_Nickname . Font . Clone ( ) ;
TB_OTt2 . Font = ( Font ) TB_Nickname . Font . Clone ( ) ;
2015-11-06 06:59:55 +00:00
formInitialized = true ;
2015-02-28 03:03:36 +00:00
// Splash Screen closes on its own.
2015-03-11 01:44:51 +00:00
BringToFront ( ) ;
WindowState = FormWindowState . Minimized ;
Show ( ) ;
WindowState = FormWindowState . Normal ;
2015-02-28 03:03:36 +00:00
if ( HaX ) Util . Alert ( "Illegal mode activated." , "Please behave." ) ;
2014-06-28 21:22:05 +00:00
#endregion
}
2016-02-17 15:54:59 +00:00
#region Important Variables
2015-10-24 23:33:44 +00:00
public static readonly byte [ ] blankEK6 = PKX . encryptArray ( new byte [ PK6 . SIZE_PARTY ] ) ;
2015-12-27 05:17:23 +00:00
public static PK6 pk6 = new PK6 ( ) ; // Tab Pokemon Data Storage
2016-01-31 07:03:43 +00:00
public static SAV6 SAV = new SAV6 ( ) ; // Save File
2014-12-20 04:22:15 +00:00
public static Color defaultControlWhite ;
public static Color defaultControlText ;
2014-10-10 02:59:57 +00:00
public static string eggname = "" ;
2015-11-15 03:41:39 +00:00
public static string DatabasePath = "db" ;
2016-02-17 15:54:59 +00:00
public static string [ ] gendersymbols = { "♂" , "♀" , "-" } ;
public static string [ ] specieslist , movelist , itemlist , abilitylist , types , natures , forms ,
memories , genloc , trainingbags , trainingstage , characteristics ,
encountertypelist , gamelanguages , balllist , gamelist , pokeblocks = { } ;
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 = { } ;
public static string [ ] wallpapernames , puffs , itempouch = { } ;
public static string curlanguage = "en" ;
public static bool unicode ;
public static List < Util . cbItem > MoveDataSource , ItemDataSource , SpeciesDataSource , BallDataSource , NatureDataSource , AbilityDataSource , VersionDataSource ;
public static volatile bool formInitialized , fieldsInitialized , fieldsLoaded ;
private static int colorizedbox = 32 ;
private static Image colorizedcolor ;
private static int colorizedslot ;
private static string pathSDF ;
private static string path3DS ;
private static bool HaX ;
2016-02-23 06:52:48 +00:00
private LegalityAnalysis Legality = new LegalityAnalysis ( new PK6 ( ) ) ;
2016-02-17 15:54:59 +00:00
private static readonly Image mixedHighlight = Util . ChangeOpacity ( Properties . Resources . slotSet , 0.5 ) ;
private static readonly string BackupPath = "bak" ;
private static readonly string [ ] lang_val = { "en" , "ja" , "fr" , "it" , "de" , "es" , "ko" , "zh" , "pt" } ;
private static readonly string [ ] main_langlist =
2015-03-12 05:51:56 +00:00
{
"English" , // ENG
"日本語" , // JPN
"Français" , // FRE
"Italiano" , // ITA
"Deutsch" , // GER
"Español" , // SPA
"한국어" , // KOR
"中文" , // CHN
"Português" , // Portuguese
} ;
2016-02-17 15:54:59 +00:00
private static string origintrack ;
private readonly PictureBox [ ] SlotPictureBoxes ;
private readonly ToolTip Tip1 = new ToolTip ( ) , Tip2 = new ToolTip ( ) , Tip3 = new ToolTip ( ) , NatureTip = new ToolTip ( ) ;
2014-06-28 21:22:05 +00:00
#endregion
2014-12-13 22:48:34 +00:00
#region //// MAIN MENU FUNCTIONS ////
// Main Menu Strip UI Functions
2014-12-14 07:18:27 +00:00
private void mainMenuOpen ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2015-09-27 17:00:45 +00:00
OpenFileDialog ofd = new OpenFileDialog
{
Filter = "PKX File|*.pk6;*.pkx" +
"|EKX File|*.ek6;*.ekx" +
"|BIN File|*.bin" +
"|All Files|*.*" ,
2016-02-01 07:15:54 +00:00
RestoreDirectory = true ,
FilterIndex = 4 ,
FileName = "main" ,
2015-09-27 17:00:45 +00:00
} ;
2016-02-01 07:15:54 +00:00
// Detect main
string cyberpath = Util . GetTempFolder ( ) ;
pathSDF = Util . GetSDFLocation ( ) ;
path3DS = Util . get3DSLocation ( ) ;
2015-09-12 05:17:13 +00:00
if ( path3DS ! = null & & File . Exists ( Path . Combine ( Path . GetPathRoot ( path3DS ) , "SaveDataBackup" , "main" ) ) )
2015-09-27 17:00:45 +00:00
ofd . InitialDirectory = Path . Combine ( Path . GetPathRoot ( path3DS ) , "SaveDataBackup" ) ;
2015-09-11 02:59:44 +00:00
else if ( pathSDF ! = null )
2015-09-27 17:00:45 +00:00
ofd . InitialDirectory = pathSDF ;
2015-01-27 06:05:04 +00:00
else if ( path3DS ! = null )
2015-09-27 17:00:45 +00:00
ofd . InitialDirectory = Path . GetPathRoot ( path3DS ) ;
2014-12-13 22:48:34 +00:00
else if ( Directory . Exists ( Path . Combine ( cyberpath , "root" ) ) )
2015-09-27 17:00:45 +00:00
ofd . InitialDirectory = Path . Combine ( cyberpath , "root" ) ;
2014-12-13 22:48:34 +00:00
else if ( Directory . Exists ( cyberpath ) )
2015-09-27 17:00:45 +00:00
ofd . InitialDirectory = cyberpath ;
2016-02-01 07:15:54 +00:00
else if ( File . Exists ( Path . Combine ( ofd . InitialDirectory , "main" ) ) ) { }
else { ofd . RestoreDirectory = false ; ofd . FilterIndex = 1 ; ofd . FileName = "" ; }
2015-03-12 04:44:12 +00:00
2016-02-01 07:15:54 +00:00
if ( ofd . ShowDialog ( ) = = DialogResult . OK )
openQuick ( ofd . FileName ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-14 07:18:27 +00:00
private void mainMenuSave ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2016-01-24 18:19:30 +00:00
if ( ! verifiedPKX ( ) ) return ;
2015-09-27 17:00:45 +00:00
SaveFileDialog sfd = new SaveFileDialog
{
Filter = "PKX File|*.pk6;*.pkx" +
"|EKX File|*.ek6;*.ekx" +
"|BIN File|*.bin" +
"|All Files|*.*" ,
DefaultExt = "pk6" ,
FileName = TB_Nickname . Text + " - " + TB_PID . Text
} ;
if ( sfd . ShowDialog ( ) ! = DialogResult . OK ) return ;
string path = sfd . FileName ;
2015-03-11 01:44:51 +00:00
// Injection Dummy Override
2015-12-14 15:52:25 +00:00
if ( path . Contains ( "pokemon.ekx" ) ) path = Path . Combine ( Path . GetDirectoryName ( path ) , "pokemon.ekx" ) ;
2015-03-11 01:44:51 +00:00
string ext = Path . GetExtension ( path ) ;
2014-06-28 21:22:05 +00:00
2015-03-11 01:44:51 +00:00
if ( File . Exists ( path ) & & ! path . Contains ( "pokemon.ekx" ) )
{
// File already exists, save a .bak
byte [ ] backupfile = File . ReadAllBytes ( path ) ;
File . WriteAllBytes ( path + ".bak" , backupfile ) ;
}
2014-06-28 21:22:05 +00:00
2016-01-24 18:19:30 +00:00
PK6 pk = preparepkx ( ) ;
if ( new [ ] { ".ekx" , ".ek6" , ".bin" } . Contains ( ext ) )
File . WriteAllBytes ( path , pk . EncryptedPartyData ) ;
else if ( new [ ] { ".pkx" , ".pk6" } . Contains ( ext ) )
File . WriteAllBytes ( path , pk . Data ) ;
2015-03-11 01:44:51 +00:00
else
{
2016-01-17 21:27:24 +00:00
Util . Error ( $"Foreign File Extension: {ext}" , "Exporting as encrypted." ) ;
2016-01-24 18:19:30 +00:00
File . WriteAllBytes ( path , pk6 . EncryptedPartyData ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
}
2014-12-14 07:18:27 +00:00
private void mainMenuExit ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
2015-02-22 21:04:12 +00:00
if ( ModifierKeys = = ( Keys . Control | Keys . E ) ) // Hotkey Triggered
if ( DialogResult . Yes ! = Util . Prompt ( MessageBoxButtons . YesNo , "Quit PKHeX?" ) ) return ;
2015-03-11 01:44:51 +00:00
Close ( ) ;
2014-12-13 22:48:34 +00:00
}
2014-12-14 07:18:27 +00:00
private void mainMenuAbout ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
// Open a new form with the About details.
new About ( ) . ShowDialog ( ) ;
}
2016-01-03 04:22:53 +00:00
// Sub Menu Options
2014-12-14 07:18:27 +00:00
private void mainMenuCodeGen ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
// Open Code Generator
2016-01-24 18:19:30 +00:00
PK6 formdata = null ;
2015-03-14 02:59:51 +00:00
if ( verifiedPKX ( ) ) formdata = preparepkx ( ) ;
2016-01-24 18:19:30 +00:00
CodeGenerator CodeGen = new CodeGenerator ( formdata . Data ) ;
2014-12-13 22:48:34 +00:00
CodeGen . ShowDialog ( ) ;
2016-01-24 18:19:30 +00:00
2014-12-13 22:48:34 +00:00
byte [ ] data = CodeGen . returnArray ;
2015-03-11 01:44:51 +00:00
if ( data = = null ) return ;
byte [ ] decdata = PKX . decryptArray ( data ) ;
2015-10-24 03:13:32 +00:00
Array . Copy ( decdata , pk6 . Data , PK6 . SIZE_STORED ) ;
2016-01-24 18:19:30 +00:00
try { populateFields ( pk6 ) ; }
2015-03-11 01:44:51 +00:00
catch
2014-12-13 22:48:34 +00:00
{
2015-10-24 03:13:32 +00:00
Array . Copy ( new byte [ PK6 . SIZE_STORED ] , pk6 . Data , PK6 . SIZE_STORED ) ;
2016-01-24 18:19:30 +00:00
populateFields ( pk6 ) ;
2015-03-11 01:44:51 +00:00
Util . Error ( "Imported code did not decrypt properly" , "Please verify that what you imported was correct." ) ;
2014-12-13 22:48:34 +00:00
}
}
2014-12-14 07:18:27 +00:00
private void mainMenuBoxReport ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
2016-01-30 02:02:54 +00:00
if ( Application . OpenForms . Cast < Form > ( ) . Any ( form = > form . Name = = typeof ( frmReport ) . Name ) )
{ Util . Alert ( "Window is already open." ) ; return ; }
2014-12-13 22:48:34 +00:00
frmReport ReportForm = new frmReport ( ) ;
2015-02-11 22:47:59 +00:00
ReportForm . Show ( ) ;
2015-10-24 03:13:32 +00:00
ReportForm . PopulateData ( SAV . Data , SAV . Box ) ;
2014-12-13 22:48:34 +00:00
}
2016-01-30 02:02:54 +00:00
private void mainMenuDatabase ( object sender , EventArgs e )
{
if ( Application . OpenForms . Cast < Form > ( ) . Any ( form = > form . Name = = typeof ( SAV_Database ) . Name ) )
{ Util . Alert ( "Window is already open." ) ; return ; }
if ( Directory . Exists ( "db" ) )
new SAV_Database ( this ) . Show ( ) ;
else
Util . Alert ( "PKHeX's database was not found" ,
"Please dump all boxes from a save file, then ensure the 'db' folder exists." ) ;
}
2014-12-13 22:48:34 +00:00
private void mainMenuUnicode ( object sender , EventArgs e )
{
2016-01-30 01:27:20 +00:00
unicode = Menu_Unicode . Checked ;
updateUnicode ( ) ;
2014-12-13 22:48:34 +00:00
}
2015-10-25 01:16:22 +00:00
private void mainMenuModifyDex ( object sender , EventArgs e )
2015-10-24 03:13:32 +00:00
{
SAV6 . SetUpdateDex = Menu_ModifyDex . Checked ;
}
2015-10-25 01:16:22 +00:00
private void mainMenuModifyPK6 ( object sender , EventArgs e )
2015-10-24 03:13:32 +00:00
{
SAV6 . SetUpdatePK6 = Menu_ModifyPK6 . Checked ;
}
2016-01-03 04:22:53 +00:00
private void mainMenuBoxLoad ( object sender , EventArgs e )
2015-10-25 01:16:22 +00:00
{
string path = "" ;
2016-01-03 04:22:53 +00:00
if ( Directory . Exists ( DatabasePath ) )
2015-10-25 01:16:22 +00:00
{
2016-01-03 04:22:53 +00:00
DialogResult ld = Util . Prompt ( MessageBoxButtons . YesNo , "Load from PKHeX's database?" ) ;
if ( ld = = DialogResult . Yes )
path = DatabasePath ;
else if ( ld = = DialogResult . No )
2015-10-25 01:16:22 +00:00
{
2016-01-03 04:22:53 +00:00
// open folder dialog
FolderBrowserDialog fbd = new FolderBrowserDialog ( ) ;
if ( fbd . ShowDialog ( ) = = DialogResult . OK )
path = fbd . SelectedPath ;
2015-10-25 01:16:22 +00:00
}
2016-01-03 04:22:53 +00:00
else return ;
}
else
{
// open folder dialog
FolderBrowserDialog fbd = new FolderBrowserDialog ( ) ;
if ( fbd . ShowDialog ( ) = = DialogResult . OK )
path = fbd . SelectedPath ;
}
loadBoxesFromDB ( path ) ;
}
private void mainMenuBoxDump ( object sender , EventArgs e )
{
string path ;
bool dumptoboxes = false ;
// Dump all of box content to files.
DialogResult ld = Util . Prompt ( MessageBoxButtons . YesNo , "Save to PKHeX's database?" ) ;
if ( ld = = DialogResult . Yes )
{
path = DatabasePath ;
if ( ! Directory . Exists ( path ) )
Directory . CreateDirectory ( path ) ;
}
else if ( ld = = DialogResult . No )
{
dumptoboxes = DialogResult . Yes = = Util . Prompt ( MessageBoxButtons . YesNo , "Save each box separately?" ) ;
2015-10-25 01:16:22 +00:00
2016-01-03 04:22:53 +00:00
// open folder dialog
FolderBrowserDialog fbd = new FolderBrowserDialog ( ) ;
if ( fbd . ShowDialog ( ) ! = DialogResult . OK )
return ;
2015-10-25 01:16:22 +00:00
2016-01-03 04:22:53 +00:00
path = fbd . SelectedPath ;
}
else return ;
2015-10-25 01:16:22 +00:00
2016-01-03 04:22:53 +00:00
dumpBoxesToDB ( path , dumptoboxes ) ;
}
// Misc Options
private void clickShowdownImportPK6 ( object sender , EventArgs e )
{
if ( ! Clipboard . ContainsText ( ) )
{ Util . Alert ( "Clipboard does not contain text." ) ; return ; }
// Get Simulator Data
PKX . ShowdownSet Set = new PKX . ShowdownSet ( Clipboard . GetText ( ) ) ;
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 ( ) ) )
{ return ; }
// Set Species & Nickname
CB_Species . SelectedValue = Set . Species ;
2016-01-05 06:42:38 +00:00
CHK_Nicknamed . Checked = Set . Nickname ! = null ;
2016-01-03 04:22:53 +00:00
if ( Set . Nickname ! = null )
TB_Nickname . Text = Set . Nickname ;
if ( Set . Gender ! = null & & PKX . getGender ( Set . Gender ) ! = 2 & & PKX . getGender ( Set . Gender ) ! = 2 )
{
int Gender = PKX . getGender ( Set . Gender ) ;
Label_Gender . Text = gendersymbols [ Gender ] ;
Label_Gender . ForeColor = Gender = = 2 ? Label_Species . ForeColor : ( Gender = = 1 ? Color . Red : Color . Blue ) ;
2015-10-25 01:16:22 +00:00
}
2016-01-03 04:22:53 +00:00
// Set Form
string [ ] formStrings = PKX . getFormList ( Set . Species ,
Util . getStringList ( "Types" , "en" ) ,
Util . getStringList ( "Forms" , "en" ) , gendersymbols ) ;
int form = 0 ;
for ( int i = 0 ; i < formStrings . Length ; i + + )
if ( formStrings [ i ] . Contains ( Set . Form ? ? "" ) )
{ form = i ; break ; }
CB_Form . SelectedIndex = form ;
// Set Ability
byte [ ] abilities = PKX . getAbilities ( Set . Species , form ) ;
int ability = Array . IndexOf ( abilities , ( byte ) Set . Ability ) ;
if ( ability < 0 ) ability = 0 ;
CB_Ability . SelectedIndex = ability ;
ComboBox [ ] m = { CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 , } ;
for ( int i = 0 ; i < 4 ; i + + ) m [ i ] . SelectedValue = Set . Moves [ i ] ;
// Set Item and Nature
2016-01-05 06:42:38 +00:00
CB_HeldItem . SelectedValue = Set . Item < 0 ? 0 : Set . Item ;
CB_Nature . SelectedValue = Set . Nature < 0 ? 0 : Set . Nature ;
2016-01-03 04:22:53 +00:00
// Set IVs
TB_HPIV . Text = Set . IVs [ 0 ] . ToString ( ) ;
TB_ATKIV . Text = Set . IVs [ 1 ] . ToString ( ) ;
TB_DEFIV . Text = Set . IVs [ 2 ] . ToString ( ) ;
TB_SPAIV . Text = Set . IVs [ 3 ] . ToString ( ) ;
TB_SPDIV . Text = Set . IVs [ 4 ] . ToString ( ) ;
TB_SPEIV . Text = Set . IVs [ 5 ] . ToString ( ) ;
// Set EVs
TB_HPEV . Text = Set . EVs [ 0 ] . ToString ( ) ;
TB_ATKEV . Text = Set . EVs [ 1 ] . ToString ( ) ;
TB_DEFEV . Text = Set . EVs [ 2 ] . ToString ( ) ;
TB_SPAEV . Text = Set . EVs [ 3 ] . ToString ( ) ;
TB_SPDEV . Text = Set . EVs [ 4 ] . ToString ( ) ;
TB_SPEEV . Text = Set . EVs [ 5 ] . ToString ( ) ;
// Set Level and Friendship
TB_Level . Text = Set . Level . ToString ( ) ;
TB_Friendship . Text = Set . Friendship . ToString ( ) ;
// Reset IV/EVs
BTN_RerollPID . PerformClick ( ) ;
BTN_RerollEC . PerformClick ( ) ;
if ( Set . Shiny ) BTN_Shinytize . PerformClick ( ) ;
}
private void clickShowdownExportPK6 ( object sender , EventArgs e )
{
if ( ! verifiedPKX ( ) )
{ Util . Alert ( "Fix data before exporting." ) ; return ; }
2016-01-24 18:19:30 +00:00
Clipboard . SetText ( preparepkx ( ) . ShowdownText ) ;
2016-01-03 04:22:53 +00:00
Util . Alert ( "Exported Showdown Set to Clipboard:" , Clipboard . GetText ( ) ) ;
}
private void clickShowdownExportParty ( object sender , EventArgs e )
{
2016-01-27 02:52:08 +00:00
if ( SAV . PartyData . Length < = 0 ) return ;
2016-01-03 04:22:53 +00:00
try
{
Clipboard . SetText (
SAV . PartyData . Aggregate ( "" , ( current , pk ) = > current + pk . ShowdownText
+ Environment . NewLine + Environment . NewLine ) . Trim ( ) ) ;
Util . Alert ( "Showdown Team (Party) set to Clipboard." ) ;
}
catch { }
}
private void clickShowdownExportBattleBox ( object sender , EventArgs e )
{
2016-01-27 02:52:08 +00:00
if ( SAV . BattleBoxData . Length < = 0 ) return ;
2016-01-03 04:22:53 +00:00
try
{
Clipboard . SetText (
SAV . BattleBoxData . Aggregate ( "" , ( current , pk ) = > current + pk . ShowdownText
+ Environment . NewLine + Environment . NewLine ) . Trim ( ) ) ;
Util . Alert ( "Showdown Team (Battle Box) set to Clipboard." ) ;
}
catch { }
}
private void clickOpenTempFolder ( object sender , EventArgs e )
{
string path = Util . GetTempFolder ( ) ;
if ( Directory . Exists ( Path . Combine ( path , "root" ) ) )
Process . Start ( "explorer.exe" , @Path . Combine ( path , "root" ) ) ;
else if ( Directory . Exists ( path ) )
Process . Start ( "explorer.exe" , @path ) ;
else
Util . Alert ( "Can't find the temporary file." , "Make sure the Cyber Gadget software is paused." ) ;
}
private void clickOpenCacheFolder ( object sender , EventArgs e )
{
string path = Util . GetCacheFolder ( ) ;
if ( Directory . Exists ( path ) )
Process . Start ( "explorer.exe" , @path ) ;
else
Util . Alert ( "Can't find the cache folder." ) ;
}
private void clickOpenSDFFolder ( object sender , EventArgs e )
{
string path ;
if ( path3DS ! = null & & Directory . Exists ( path = Util . GetSDFLocation ( ) ) )
Process . Start ( "explorer.exe" , @path ) ;
else
Util . Alert ( "Can't find the SaveDataFiler folder." ) ;
}
private void clickOpenSDBFolder ( object sender , EventArgs e )
{
string path ;
if ( path3DS ! = null & & Directory . Exists ( path = Path . Combine ( Path . GetPathRoot ( path3DS ) , "SaveDataBackup" ) ) )
Process . Start ( "explorer.exe" , @path ) ;
else
Util . Alert ( "Can't find the SaveDataBackup folder." ) ;
2015-10-25 01:16:22 +00:00
}
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// Main Menu Subfunctions
private void openQuick ( string path )
{
// detect if it is a folder (load into boxes or not)
if ( Directory . Exists ( path ) )
{ loadBoxesFromDB ( path ) ; return ; }
2014-08-17 01:42:51 +00:00
2014-12-13 22:48:34 +00:00
string ext = Path . GetExtension ( path ) ;
FileInfo fi = new FileInfo ( path ) ;
if ( fi . Length > 0x10009C )
Util . Error ( "Input file is too large." , path ) ;
else
{
byte [ ] input ; try { input = File . ReadAllBytes ( path ) ; }
catch { Util . Error ( "File is in use by another program!" , path ) ; return ; }
try { openFile ( input , path , ext ) ; }
catch
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
try
{
2015-10-24 23:33:44 +00:00
byte [ ] blank = ( byte [ ] ) blankEK6 . Clone ( ) ;
2014-12-13 22:48:34 +00:00
2015-10-24 03:13:32 +00:00
for ( int i = 0 ; i < PK6 . SIZE_STORED ; i + + )
2015-01-15 04:48:46 +00:00
blank [ i ] ^ = input [ i ] ;
2014-12-13 22:48:34 +00:00
openFile ( blank , path , ext ) ;
}
catch { openFile ( input , path , ext ) ; }
2014-06-28 21:22:05 +00:00
}
}
2014-12-13 22:48:34 +00:00
}
private void openFile ( byte [ ] input , string path , string ext )
{
#region Powersaves Read - Only Conversion
if ( input . Length = = 0x10009C ) // Resize to 1MB
{
Array . Copy ( input , 0x9C , input , 0 , 0x100000 ) ;
Array . Resize ( ref input , 0x100000 ) ;
2014-06-28 21:22:05 +00:00
}
#endregion
2015-01-01 19:38:37 +00:00
2014-12-13 22:48:34 +00:00
#region Saves
2015-11-29 20:59:13 +00:00
if ( ( input . Length = = SAV6 . SIZE_ORAS ) & & BitConverter . ToUInt32 ( input , SAV6 . SIZE_ORAS - 0x1F0 ) = = SAV6 . BEEF ) // ORAS
2015-10-24 03:13:32 +00:00
openMAIN ( input , path ) ;
2015-11-29 20:59:13 +00:00
else if ( ( input . Length = = SAV6 . SIZE_XY ) & & BitConverter . ToUInt32 ( input , SAV6 . SIZE_XY - 0x1F0 ) = = SAV6 . BEEF ) // XY
2015-10-24 03:13:32 +00:00
openMAIN ( input , path ) ;
2015-12-30 06:03:27 +00:00
else if ( ( input . Length = = SAV6 . SIZE_ORASDEMO ) & & BitConverter . ToUInt32 ( input , SAV6 . SIZE_ORASDEMO - 0x1F0 ) = = SAV6 . BEEF ) // ORAS Demo
openMAIN ( input , path ) ;
2014-12-13 22:48:34 +00:00
// Verify the Data Input Size is Proper
else if ( input . Length = = 0x100000 )
{
2014-12-31 06:18:41 +00:00
if ( openXOR ( input , path ) ) // Check if we can load the save via xorpad
return ; // only if a save is loaded we abort
2015-03-11 01:44:51 +00:00
if ( BitConverter . ToUInt64 ( input , 0x10 ) ! = 0 ) // encrypted save
2016-02-09 23:44:59 +00:00
{ Util . Error ( "PKHeX only edits decrypted save files." + Environment . NewLine + "This save file is not decrypted." , path ) ; return ; }
2015-10-24 03:13:32 +00:00
DialogResult sdr = Util . Prompt ( MessageBoxButtons . YesNoCancel , "Press Yes to load the sav at 0x3000" , "Press No for the one at 0x82000" ) ;
if ( sdr = = DialogResult . Cancel )
return ;
2016-02-09 23:37:12 +00:00
int savshift = sdr = = DialogResult . Yes ? 0 : 0x7F000 ;
2015-11-29 20:59:13 +00:00
byte [ ] psdata = input . Skip ( 0x5400 + savshift ) . Take ( SAV6 . SIZE_ORAS ) . ToArray ( ) ;
if ( BitConverter . ToUInt32 ( psdata , psdata . Length - 0x1F0 ) ! = SAV6 . BEEF )
Array . Resize ( ref psdata , SAV6 . SIZE_XY ) ;
if ( BitConverter . ToUInt32 ( psdata , psdata . Length - 0x1F0 ) ! = SAV6 . BEEF )
2016-02-09 23:44:59 +00:00
{ Util . Error ( "The data file is not a valid save file" , path ) ; return ; }
2014-08-15 04:27:53 +00:00
2015-10-24 03:13:32 +00:00
openMAIN ( psdata , path ) ;
2014-08-15 04:27:53 +00:00
}
#endregion
2014-12-13 22:48:34 +00:00
#region PK6 / EK6
2015-12-27 00:05:26 +00:00
else if ( ( input . Length = = PK6 . SIZE_PARTY | | input . Length = = PK6 . SIZE_STORED ) & & ext ! = ".pgt" )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
// Check if Input is PKX
2016-01-31 07:03:43 +00:00
if ( new [ ] { ".pk6" , ".ek6" , ".pkx" , ".ekx" , "" } . Contains ( ext ) )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
// Check if Encrypted before Loading
2016-01-24 18:19:30 +00:00
populateFields ( new PK6 ( BitConverter . ToUInt16 ( input , 0xC8 ) = = 0 & & BitConverter . ToUInt16 ( input , 0x58 ) = = 0 ? input : PKX . decryptArray ( input ) ) ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
else
2016-01-17 21:27:24 +00:00
Util . Error ( "Unable to recognize file." + Environment . NewLine + "Only valid .pk* .ek* .bin supported." ,
$"File Loaded:{Environment.NewLine}{path}" ) ;
2014-06-28 21:22:05 +00:00
}
#endregion
2016-01-24 18:19:30 +00:00
#region PK3 / PK4 / PK5 Conversion
else if ( new [ ] { PK3 . SIZE_PARTY , PK3 . SIZE_STORED , PK4 . SIZE_PARTY , PK4 . SIZE_STORED , PK5 . SIZE_PARTY } . Contains ( input . Length ) )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
if ( ! PKX . verifychk ( input ) ) Util . Error ( "Invalid File (Checksum Error)" ) ;
try // to convert g5pkm
2014-06-28 21:22:05 +00:00
{
2016-01-24 18:19:30 +00:00
populateFields ( Converter . ConvertPKMtoPK6 ( input ) ) ;
2014-12-13 22:48:34 +00:00
}
catch
{
2016-01-24 18:19:30 +00:00
populateFields ( new PK6 ( ) ) ;
2014-12-13 22:48:34 +00:00
Util . Error ( "Attempted to load previous generation PKM." , "Conversion failed." ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
}
#endregion
2015-01-24 18:45:32 +00:00
#region Box Data
2015-10-24 03:13:32 +00:00
else if ( ( input . Length = = PK6 . SIZE_STORED * 30 | | input . Length = = PK6 . SIZE_STORED * 30 * 31 ) & & BitConverter . ToUInt16 ( input , 4 ) = = 0 & & BitConverter . ToUInt32 ( input , 8 ) > 0 )
2015-09-18 03:18:22 +00:00
{
2016-01-18 01:07:19 +00:00
int baseOffset = SAV . Box + PK6 . SIZE_STORED * 30 * ( input . Length = = PK6 . SIZE_STORED * 30 ? CB_BoxSelect . SelectedIndex : 0 ) ;
2015-10-24 03:13:32 +00:00
for ( int i = 0 ; i < input . Length / PK6 . SIZE_STORED ; i + + )
2015-09-18 03:18:22 +00:00
{
2015-10-24 03:13:32 +00:00
byte [ ] data = input . Skip ( PK6 . SIZE_STORED * i ) . Take ( PK6 . SIZE_STORED ) . ToArray ( ) ;
SAV . setEK6Stored ( data , baseOffset + i * PK6 . SIZE_STORED ) ;
}
2015-01-27 06:05:04 +00:00
setPKXBoxes ( ) ;
2015-12-28 05:26:07 +00:00
Util . Alert ( "Box Binary loaded." ) ;
2015-09-18 03:18:22 +00:00
}
2015-01-24 18:45:32 +00:00
#endregion
2015-02-24 07:52:32 +00:00
#region Battle Video
2015-02-25 04:10:47 +00:00
else if ( input . Length = = 0x2E60 & & BitConverter . ToUInt64 ( input , 0xE18 ) ! = 0 & & BitConverter . ToUInt16 ( input , 0xE12 ) = = 0 )
2015-02-24 07:52:32 +00:00
{
2015-05-07 02:30:31 +00:00
if ( Util . Prompt ( MessageBoxButtons . YesNo , "Load Batte Video Pokémon data to " + CB_BoxSelect . Text + "?" , "The first 24 slots will be overwritten." ) ! = DialogResult . Yes ) return ;
2015-02-24 07:52:32 +00:00
for ( int i = 0 ; i < 24 ; i + + )
2015-09-18 03:18:22 +00:00
{
2016-01-18 01:07:19 +00:00
byte [ ] data = input . Skip ( 0xE18 + PK6 . SIZE_PARTY * i + i / 6 * 8 ) . Take ( PK6 . SIZE_STORED ) . ToArray ( ) ;
2015-10-24 03:13:32 +00:00
SAV . setEK6Stored ( data , SAV . Box + i * PK6 . SIZE_STORED + CB_BoxSelect . SelectedIndex * 30 * PK6 . SIZE_STORED ) ;
2015-09-18 03:18:22 +00:00
}
2015-02-24 07:52:32 +00:00
setPKXBoxes ( ) ;
}
#endregion
2015-04-01 00:58:23 +00:00
#region Wondercard
2015-12-25 22:08:43 +00:00
else if ( input . Length = = WC6 . Size & & ext = = ".wc6" )
2015-11-26 15:49:44 +00:00
if ( ModifierKeys = = Keys . Control )
new SAV_Wondercard ( input ) . Show ( ) ;
else
2015-11-28 01:39:38 +00:00
{
PK6 pk = new WC6 ( input ) . convertToPK6 ( SAV ) ;
2015-11-29 06:53:46 +00:00
if ( pk = = null | | pk . Species = = 0 | | pk . Species > 721 )
{
Util . Error ( "Failed to convert Wondercard." ,
2016-01-18 01:07:19 +00:00
pk = = null ? "Not a Pokémon Wondercard." : "Invalid species." ) ;
2015-11-29 06:53:46 +00:00
return ;
}
2016-01-24 18:19:30 +00:00
populateFields ( pk ) ;
2015-11-28 01:39:38 +00:00
}
2015-12-25 22:08:43 +00:00
else if ( input . Length = = PGF . Size & & ext = = ".pgf" )
{
PK5 pk = new PGF ( input ) . convertToPK5 ( SAV ) ;
if ( pk = = null | | pk . Species = = 0 | | pk . Species > 721 )
{
Util . Error ( "Failed to convert PGF." ,
2016-01-18 01:07:19 +00:00
pk = = null ? "Not a Pokémon PGF." : "Invalid species." ) ;
2015-12-25 22:08:43 +00:00
return ;
}
2015-12-28 05:26:07 +00:00
populateFields ( Converter . ConvertPKMtoPK6 ( pk . Data ) ) ;
2015-12-25 22:08:43 +00:00
}
2016-01-18 01:07:19 +00:00
else if ( input . Length = = PGT . Size & & ext = = ".pgt" )
2015-12-27 00:05:26 +00:00
{
PGT pgt = new PGT ( input ) ;
PK4 pk = pgt . convertToPK4 ( SAV ) ;
if ( pk = = null | | pk . Species = = 0 | | pk . Species > 721 )
{
Util . Error ( "Failed to convert PGT." ,
2016-01-18 01:07:19 +00:00
pk = = null ? "Not a Pokémon PGT." : "Invalid species." ) ;
2015-12-27 00:05:26 +00:00
return ;
}
2015-12-28 05:26:07 +00:00
populateFields ( Converter . ConvertPKMtoPK6 ( pk . Data ) ) ;
2015-12-27 00:05:26 +00:00
}
else if ( input . Length = = PCD . Size & & ext = = ".pcd" )
{
PCD pcd = new PCD ( input ) ;
PGT pgt = pcd . Gift ;
PK4 pk = pgt . convertToPK4 ( SAV ) ;
if ( pk = = null | | pk . Species = = 0 | | pk . Species > 721 )
{
Util . Error ( "Failed to convert PCD." ,
2016-01-18 01:07:19 +00:00
pk = = null ? "Not a Pokémon PCD." : "Invalid species." ) ;
2015-12-27 00:05:26 +00:00
return ;
}
2015-12-28 05:26:07 +00:00
populateFields ( Converter . ConvertPKMtoPK6 ( pk . Data ) ) ;
2015-12-27 00:05:26 +00:00
}
2015-04-01 00:58:23 +00:00
#endregion
2014-12-13 22:48:34 +00:00
else
2016-01-17 21:27:24 +00:00
Util . Error ( "Attempted to load an unsupported file type/size." ,
$"File Loaded:{Environment.NewLine}{path}" ,
$"File Size:{Environment.NewLine}{input.Length} bytes (0x{input.Length.ToString(" X4 ")})" ) ;
2014-12-13 22:48:34 +00:00
}
2014-12-31 06:18:41 +00:00
private bool openXOR ( byte [ ] input , string path )
{
// Detection of stored Decryption XORpads:
2015-03-11 01:44:51 +00:00
if ( ModifierKeys = = Keys . Control ) return false ; // no xorpad compatible
2015-11-29 20:59:13 +00:00
byte [ ] savID = input . Take ( 0x10 ) . ToArray ( ) ;
2015-03-11 01:44:51 +00:00
string exepath = Application . StartupPath ;
string xorpath = exepath . Clone ( ) . ToString ( ) ;
string [ ] XORpads = Directory . GetFiles ( xorpath ) ;
2014-12-31 06:18:41 +00:00
2015-12-13 07:39:43 +00:00
int loop = 0 ;
2016-01-03 06:31:04 +00:00
check :
2015-03-11 01:44:51 +00:00
foreach ( byte [ ] data in from file in XORpads let fi = new FileInfo ( file ) where ( fi . Name . ToLower ( ) . Contains ( "xorpad" ) | | fi . Name . ToLower ( ) . Contains ( "key" ) ) & & ( fi . Length = = 0x10009C | | fi . Length = = 0x100000 ) select File . ReadAllBytes ( file ) )
{
// Fix xorpad alignment
byte [ ] xorpad = data ;
2015-11-29 20:59:13 +00:00
if ( xorpad . Length = = 0x10009C ) // Trim off Powersaves' header
xorpad = xorpad . Skip ( 0x9C ) . ToArray ( ) ; // returns 0x100000
if ( ! xorpad . Take ( 0x10 ) . SequenceEqual ( savID ) ) continue ;
2015-03-11 01:44:51 +00:00
// Set up Decrypted File
2015-11-29 20:59:13 +00:00
byte [ ] decryptedPS = input . Skip ( 0x5400 ) . Take ( SAV6 . SIZE_ORAS ) . ToArray ( ) ;
2015-03-11 01:44:51 +00:00
// xor through and decrypt
2015-11-29 20:59:13 +00:00
for ( int z = 0 ; z < decryptedPS . Length ; z + + )
2015-03-11 01:44:51 +00:00
decryptedPS [ z ] ^ = xorpad [ 0x5400 + z ] ;
// Weakly check the validity of the decrypted content
2015-11-29 20:59:13 +00:00
if ( BitConverter . ToUInt32 ( decryptedPS , SAV6 . SIZE_ORAS - 0x1F0 ) ! = SAV6 . BEEF ) // Not OR/AS
if ( BitConverter . ToUInt32 ( decryptedPS , SAV6 . SIZE_XY - 0x1F0 ) ! = SAV6 . BEEF ) // Not X/Y
continue ;
2015-03-11 01:44:51 +00:00
else
2015-11-29 20:59:13 +00:00
Array . Resize ( ref decryptedPS , SAV6 . SIZE_XY ) ; // set to X/Y size
else Array . Resize ( ref decryptedPS , SAV6 . SIZE_ORAS ) ; // set to ORAS size just in case
2015-03-11 01:44:51 +00:00
2015-10-24 03:13:32 +00:00
// Save file is now decrypted!
2015-03-11 01:44:51 +00:00
// Trigger Loading of the decrypted save file.
2015-10-24 03:13:32 +00:00
openMAIN ( decryptedPS , path ) ;
2015-03-11 01:44:51 +00:00
// Abort the opening of a non-cyber file.
return true ;
2014-12-31 06:18:41 +00:00
}
2015-03-11 01:44:51 +00:00
// End file check loop, check the input path for xorpads too if it isn't the same as the EXE (quite common).
2015-12-13 07:39:43 +00:00
if ( xorpath ! = exepath | | loop + + > 0 ) return false ; // no xorpad compatible
2015-03-11 01:44:51 +00:00
xorpath = Path . GetDirectoryName ( path ) ; goto check ;
2014-12-31 06:18:41 +00:00
}
2016-01-28 04:24:32 +00:00
private void openMAIN ( byte [ ] input , string path )
2014-12-13 22:48:34 +00:00
{
2016-02-12 05:41:31 +00:00
SAV = new SAV6 ( input )
{
FilePath = Path . GetDirectoryName ( path ) ,
FileName = Path . GetExtension ( path ) = = ".bak"
? Path . GetFileName ( path ) . Split ( new [ ] { " [" } , StringSplitOptions . None ) [ 0 ]
: Path . GetFileName ( path )
} ;
L_Save . Text = "SAV: " + Path . GetFileNameWithoutExtension ( Util . CleanFileName ( SAV . BAKName ) ) ; // more descriptive
2016-01-03 06:31:04 +00:00
2014-12-13 22:48:34 +00:00
// Enable Secondary Tools
2016-01-28 04:24:32 +00:00
GB_SAVtools . Enabled = B_JPEG . Enabled = true ;
Menu_ExportSAV . Enabled = B_VerifyCHK . Enabled = SAV . Exportable ;
2014-06-28 21:22:05 +00:00
2015-09-21 03:34:09 +00:00
DaycareSlot = 0 ;
2015-05-07 02:30:31 +00:00
2014-12-13 22:48:34 +00:00
setBoxNames ( ) ; // Display the Box Names
setPKXBoxes ( ) ; // Reload all of the PKX Windows
// Version Exclusive Editors
2015-12-30 06:03:27 +00:00
GB_SUBE . Visible = ! SAV . ORAS ;
B_OpenSecretBase . Visible = SAV . ORAS ;
2015-10-24 03:13:32 +00:00
2015-12-30 06:03:27 +00:00
if ( SAV . Box > - 1 )
{
int startBox = SAV . CurrentBox ; // FF if BattleBox
if ( startBox > 30 ) { tabBoxMulti . SelectedIndex = 1 ; CB_BoxSelect . SelectedIndex = 0 ; }
else { tabBoxMulti . SelectedIndex = 0 ; CB_BoxSelect . SelectedIndex = startBox ; }
}
2015-05-07 02:30:31 +00:00
2015-12-17 03:33:58 +00:00
TB_GameSync . Enabled = SAV . GameSyncID ! = 0 ;
TB_GameSync . Text = SAV . GameSyncID . ToString ( "X16" ) ;
2015-12-28 21:52:08 +00:00
TB_Secure1 . Text = SAV . Secure1 . ToString ( "X16" ) ;
TB_Secure2 . Text = SAV . Secure2 . ToString ( "X16" ) ;
2015-12-18 03:56:21 +00:00
PB_Locked . Visible = SAV . BattleBoxLocked ;
2015-12-17 03:33:58 +00:00
2015-12-30 06:03:27 +00:00
// Hide content if not present in game.
PAN_Box . Visible = CB_BoxSelect . Visible = B_BoxLeft . Visible = B_BoxRight . Visible = SAV . Box > - 1 ;
2016-01-03 04:22:53 +00:00
Menu_LoadBoxes . Enabled = Menu_Report . Enabled = Menu_Modify . Enabled = B_SaveBoxBin . Enabled = SAV . Box > - 1 ;
2015-12-30 06:03:27 +00:00
PAN_BattleBox . Visible = L_BattleBox . Visible = L_ReadOnlyPBB . Visible = SAV . BattleBox > - 1 ;
GB_Daycare . Visible = SAV . Daycare > - 1 ;
GB_Fused . Visible = SAV . Fused > - 1 ;
GB_GTS . Visible = SAV . GTS > - 1 ;
B_OpenSecretBase . Enabled = SAV . SecretBase > - 1 ;
B_OpenPokepuffs . Enabled = SAV . Puff > - 1 ;
B_OUTPasserby . Enabled = SAV . PSS > - 1 ;
B_OpenBoxLayout . Enabled = SAV . BoxWallpapers > - 1 ;
B_OpenWondercards . Enabled = SAV . WondercardFlags > - 1 ;
B_OpenSuperTraining . Enabled = SAV . SuperTrain > - 1 ;
B_OpenHallofFame . Enabled = SAV . HoF > - 1 ;
B_OpenOPowers . Enabled = SAV . OPower > - 1 ;
B_OpenPokedex . Enabled = SAV . PokeDex > - 1 ;
B_OpenBerryField . Enabled = SAV . BerryField > - 1 ;
B_JPEG . Enabled = SAV . JPEG > - 1 ;
2016-01-03 04:22:53 +00:00
// Refresh PK#->PK6 conversion info
Converter . updateConfig ( SAV . SubRegion , SAV . Country , SAV . ConsoleRegion , SAV . OT , SAV . Gender ) ;
2015-09-21 03:34:09 +00:00
2014-12-13 22:48:34 +00:00
// Indicate audibly the save is loaded
2016-01-03 18:47:44 +00:00
SystemSounds . Beep . Play ( ) ;
2016-02-12 05:41:31 +00:00
// If backup folder exists, save a backup.
string backupName = Path . Combine ( BackupPath , Util . CleanFileName ( SAV . BAKName ) ) ;
if ( SAV . Exportable & & Directory . Exists ( BackupPath ) & & ! File . Exists ( backupName ) )
File . WriteAllBytes ( backupName , SAV . BAK ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
// Language Translation
private void changeMainLanguage ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2016-01-24 18:19:30 +00:00
PK6 pk = fieldsInitialized ? preparepkx ( ) : pk6 ;
2015-12-26 18:26:42 +00:00
bool alreadyInit = fieldsInitialized ;
2015-11-06 06:59:55 +00:00
fieldsInitialized = false ;
2014-12-13 22:48:34 +00:00
Menu_Options . DropDown . Close ( ) ;
InitializeStrings ( ) ;
InitializeLanguage ( ) ;
2016-01-17 23:35:02 +00:00
Util . TranslateInterface ( this , lang_val [ CB_MainLanguage . SelectedIndex ] ) ; // Translate the UI to language.
2016-01-24 18:19:30 +00:00
populateFields ( pk ) ; // put data back in form
2015-12-27 05:17:23 +00:00
fieldsInitialized | = alreadyInit ;
2014-12-13 22:48:34 +00:00
}
private void InitializeStrings ( )
{
2015-03-12 05:51:56 +00:00
if ( CB_MainLanguage . SelectedIndex < 8 )
curlanguage = lang_val [ CB_MainLanguage . SelectedIndex ] ;
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
string l = curlanguage ;
natures = Util . getStringList ( "Natures" , l ) ;
types = Util . getStringList ( "Types" , l ) ;
abilitylist = Util . getStringList ( "Abilities" , l ) ;
movelist = Util . getStringList ( "Moves" , l ) ;
itemlist = Util . getStringList ( "Items" , l ) ;
characteristics = Util . getStringList ( "Character" , l ) ;
specieslist = Util . getStringList ( "Species" , l ) ;
wallpapernames = Util . getStringList ( "Wallpaper" , l ) ;
itempouch = Util . getStringList ( "ItemPouch" , l ) ;
2014-12-14 07:18:27 +00:00
encountertypelist = Util . getStringList ( "EncounterType" , l ) ;
gamelist = Util . getStringList ( "Games" , l ) ;
2016-02-09 23:27:24 +00:00
gamelanguages = Util . getNulledStringArray ( Util . getStringList ( "languages" ) ) ;
2015-01-01 19:38:37 +00:00
2014-12-26 18:46:18 +00:00
balllist = new string [ Legal . Items_Ball . Length ] ;
for ( int i = 0 ; i < balllist . Length ; i + + )
balllist [ i ] = itemlist [ Legal . Items_Ball [ i ] ] ;
2015-01-01 19:38:37 +00:00
2015-11-06 06:59:55 +00:00
if ( ( l ! = "zh" ) | | ( l = = "zh" & & ! fieldsInitialized ) ) // load initial binaries
2014-12-13 22:48:34 +00:00
{
2016-01-23 21:00:44 +00:00
pokeblocks = Util . getStringList ( "Pokeblock" , l ) ;
2014-12-13 22:48:34 +00:00
forms = Util . getStringList ( "Forms" , l ) ;
memories = Util . getStringList ( "Memories" , l ) ;
genloc = Util . getStringList ( "GenLoc" , l ) ;
trainingbags = Util . getStringList ( "TrainingBag" , l ) ;
trainingstage = Util . getStringList ( "SuperTraining" , l ) ;
puffs = Util . getStringList ( "Puff" , l ) ;
}
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// Fix Item Names (Duplicate entries)
itemlist [ 456 ] + = " (OLD)" ; // S.S. Ticket
itemlist [ 463 ] + = " (OLD)" ; // Storage Key
itemlist [ 478 ] + = " (OLD)" ; // Basement Key
itemlist [ 626 ] + = " (2)" ; // Xtransceiver
itemlist [ 629 ] + = " (2)" ; // DNA Splicers
itemlist [ 637 ] + = " (2)" ; // Dropped Item
itemlist [ 707 ] + = " (2)" ; // Travel Trunk
itemlist [ 713 ] + = " (2)" ; // Alt Bike
itemlist [ 714 ] + = " (2)" ; // Holo Caster
itemlist [ 729 ] + = " (1)" ; // Meteorite
itemlist [ 740 ] + = " (2)" ; // Contest Costume
itemlist [ 751 ] + = " (2)" ; // Meteorite
itemlist [ 771 ] + = " (3)" ; // Meteorite
itemlist [ 772 ] + = " (4)" ; // Meteorite
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// Get the Egg Name and then replace it with --- for the comboboxes.
eggname = specieslist [ 0 ] ;
specieslist [ 0 ] = "---" ;
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// Get the met locations... for all of the games...
metHGSS_00000 = Util . getStringList ( "hgss_00000" , l ) ;
metHGSS_02000 = Util . getStringList ( "hgss_02000" , l ) ;
metHGSS_03000 = Util . getStringList ( "hgss_03000" , l ) ;
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
metBW2_00000 = Util . getStringList ( "bw2_00000" , l ) ;
metBW2_30000 = Util . getStringList ( "bw2_30000" , l ) ;
metBW2_40000 = Util . getStringList ( "bw2_40000" , l ) ;
metBW2_60000 = Util . getStringList ( "bw2_60000" , l ) ;
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
metXY_00000 = Util . getStringList ( "xy_00000" , l ) ;
metXY_30000 = Util . getStringList ( "xy_30000" , l ) ;
metXY_40000 = Util . getStringList ( "xy_40000" , l ) ;
metXY_60000 = Util . getStringList ( "xy_60000" , l ) ;
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// Fix up some of the Location strings to make them more descriptive:
metHGSS_02000 [ 1 ] + = " (NPC)" ; // Anything from an NPC
metHGSS_02000 [ 2 ] + = " (" + eggname + ")" ; // Egg From Link Trade
metBW2_00000 [ 36 ] = metBW2_00000 [ 84 ] + "/" + metBW2_00000 [ 36 ] ; // Cold Storage in BW = PWT in BW2
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// BW2 Entries from 76 to 105 are for Entralink in BW
for ( int i = 76 ; i < 106 ; i + + )
metBW2_00000 [ i ] = metBW2_00000 [ i ] + "●" ;
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// Localize the Poketransfer to the language (30001)
string [ ] ptransp = { "Poké Transfer" , "ポケシフター" , "Poké Fret" , "Pokétrasporto" , "Poképorter" , "Pokétransfer" , "포케시프터" , "ポケシフター" } ;
2015-03-12 05:51:56 +00:00
metBW2_30000 [ 1 - 1 ] = ptransp [ Array . IndexOf ( lang_val , curlanguage ) ] ;
2014-12-13 22:48:34 +00:00
metBW2_30000 [ 2 - 1 ] + = " (NPC)" ; // Anything from an NPC
metBW2_30000 [ 3 - 1 ] + = " (" + eggname + ")" ; // Egg From Link Trade
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// Zorua/Zoroark events
metBW2_30000 [ 10 - 1 ] = specieslist [ 251 ] + " (" + specieslist [ 570 ] + " 1)" ; // Celebi's Zorua Event
metBW2_30000 [ 11 - 1 ] = specieslist [ 251 ] + " (" + specieslist [ 570 ] + " 2)" ; // Celebi's Zorua Event
metBW2_30000 [ 12 - 1 ] = specieslist [ 571 ] + " (" + "1)" ; // Zoroark
metBW2_30000 [ 13 - 1 ] = specieslist [ 571 ] + " (" + "2)" ; // Zoroark
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
metBW2_60000 [ 3 - 1 ] + = " (" + eggname + ")" ; // Egg Treasure Hunter/Breeder, whatever...
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
metXY_00000 [ 104 ] + = " (X/Y)" ; // Victory Road
metXY_00000 [ 298 ] + = " (OR/AS)" ; // Victory Road
metXY_30000 [ 0 ] + = " (NPC)" ; // Anything from an NPC
metXY_30000 [ 1 ] + = " (" + eggname + ")" ; // Egg From Link Trade
2014-11-30 01:47:17 +00:00
2014-12-13 22:48:34 +00:00
// Set the first entry of a met location to "" (nothing)
// Fix (None) tags
abilitylist [ 0 ] = itemlist [ 0 ] = movelist [ 0 ] = metXY_00000 [ 0 ] = metBW2_00000 [ 0 ] = metHGSS_00000 [ 0 ] = "(" + itemlist [ 0 ] + ")" ;
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// Force an update to the met locations
origintrack = "" ;
2014-06-28 21:22:05 +00:00
2015-11-06 06:59:55 +00:00
if ( fieldsInitialized )
2014-12-13 22:48:34 +00:00
updateIVs ( null , null ) ; // Prompt an update for the characteristics
}
#endregion
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
#region //// PKX WINDOW FUNCTIONS ////
private void InitializeFields ( )
{
// Now that the ComboBoxes are ready, load the data.
2015-11-06 06:59:55 +00:00
fieldsInitialized = true ;
2015-11-06 07:17:06 +00:00
pk6 . Species = 493 ;
2015-11-06 06:59:55 +00:00
pk6 . Move1 = 1 ;
2015-10-12 06:43:07 +00:00
pk6 . RefreshChecksum ( ) ;
2015-11-06 06:59:55 +00:00
// Load Data
2016-01-24 18:19:30 +00:00
populateFields ( pk6 ) ;
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
TB_OT . Text = "PKHeX" ;
TB_TID . Text = 12345. ToString ( ) ;
TB_SID . Text = 54321. ToString ( ) ;
2014-12-14 04:39:31 +00:00
CB_GameOrigin . SelectedIndex = 0 ;
CB_Language . SelectedIndex = 0 ;
2015-05-07 02:30:31 +00:00
CB_BoxSelect . SelectedIndex = 0 ;
2014-12-14 07:18:27 +00:00
CB_GameOrigin . SelectedIndex = 0 ;
2014-12-13 22:48:34 +00:00
CB_PPu1 . SelectedIndex = CB_PPu2 . SelectedIndex = CB_PPu3 . SelectedIndex = CB_PPu4 . SelectedIndex = 0 ;
CB_Ball . SelectedIndex = 0 ;
CB_Country . SelectedIndex = 0 ;
2014-12-24 07:29:57 +00:00
setAbilityList ( TB_AbilityNumber , Util . getIndex ( CB_Species ) , CB_Ability , CB_Form ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
}
private void InitializeLanguage ( )
{
2014-12-14 07:18:27 +00:00
// Set the Display
2015-01-31 18:36:06 +00:00
CB_Country . DisplayMember =
CB_SubRegion . DisplayMember =
CB_3DSReg . DisplayMember =
2015-01-01 19:38:37 +00:00
CB_Language . DisplayMember =
CB_Ball . DisplayMember =
CB_HeldItem . DisplayMember =
CB_Species . DisplayMember =
2014-12-14 07:18:27 +00:00
DEV_Ability . DisplayMember =
CB_Nature . DisplayMember =
2014-12-14 07:22:07 +00:00
CB_EncounterType . DisplayMember =
2015-03-09 00:41:13 +00:00
CB_GameOrigin . DisplayMember =
CB_HPType . DisplayMember = "Text" ;
2014-12-14 07:18:27 +00:00
// Set the Value
2015-01-31 18:36:06 +00:00
CB_Country . ValueMember =
CB_SubRegion . ValueMember =
CB_3DSReg . ValueMember =
2015-01-01 19:38:37 +00:00
CB_Language . ValueMember =
CB_Ball . ValueMember =
CB_HeldItem . ValueMember =
2014-12-14 07:18:27 +00:00
CB_Species . ValueMember =
DEV_Ability . ValueMember =
2014-12-14 07:22:07 +00:00
CB_Nature . ValueMember =
CB_EncounterType . ValueMember =
2015-03-09 00:41:13 +00:00
CB_GameOrigin . ValueMember =
CB_HPType . ValueMember = "Value" ;
2014-12-14 07:18:27 +00:00
2014-12-14 18:31:53 +00:00
// Set the various ComboBox DataSources up with their allowed entries
2015-01-31 18:36:06 +00:00
setCountrySubRegion ( CB_Country , "countries" ) ;
2014-12-14 18:31:53 +00:00
CB_3DSReg . DataSource = Util . getUnsortedCBList ( "regions3ds" ) ;
CB_Language . DataSource = Util . getUnsortedCBList ( "languages" ) ;
2015-03-11 01:44:51 +00:00
int [ ] ball_nums = { 7 , 576 , 13 , 492 , 497 , 14 , 495 , 493 , 496 , 494 , 11 , 498 , 8 , 6 , 12 , 15 , 9 , 5 , 499 , 10 , 1 , 16 } ;
int [ ] ball_vals = { 7 , 25 , 13 , 17 , 22 , 14 , 20 , 18 , 21 , 19 , 11 , 23 , 8 , 6 , 12 , 15 , 9 , 5 , 24 , 10 , 1 , 16 } ;
2016-02-10 08:33:42 +00:00
BallDataSource = Util . getVariedCBList ( itemlist , ball_nums , ball_vals ) ;
2015-11-26 06:20:09 +00:00
ItemDataSource = Util . getCBList ( itemlist , DEV_Ability . Enabled ? null : Legal . Items_Held ) ;
2015-09-21 03:34:09 +00:00
SpeciesDataSource = Util . getCBList ( specieslist , null ) ;
NatureDataSource = Util . getCBList ( natures , null ) ;
2015-10-08 03:19:34 +00:00
AbilityDataSource = Util . getCBList ( abilitylist , null ) ;
VersionDataSource = Util . getCBList ( gamelist , Legal . Games_6oras , Legal . Games_6xy , Legal . Games_5 , Legal . Games_4 , Legal . Games_4e , Legal . Games_4r , Legal . Games_3 , Legal . Games_3e , Legal . Games_3r , Legal . Games_3s ) ;
2015-09-21 03:34:09 +00:00
CB_Ball . DataSource = new BindingSource ( BallDataSource , null ) ;
CB_Species . DataSource = new BindingSource ( SpeciesDataSource , null ) ;
CB_HeldItem . DataSource = new BindingSource ( ItemDataSource , null ) ;
CB_Nature . DataSource = new BindingSource ( NatureDataSource , null ) ;
2015-10-08 03:19:34 +00:00
DEV_Ability . DataSource = new BindingSource ( AbilityDataSource , null ) ;
2015-03-11 01:44:51 +00:00
CB_EncounterType . DataSource = Util . getCBList ( encountertypelist , new [ ] { 0 } , Legal . Gen4EncounterTypes ) ;
2015-10-08 03:19:34 +00:00
CB_GameOrigin . DataSource = new BindingSource ( VersionDataSource , null ) ;
2015-12-14 15:52:25 +00:00
CB_HPType . DataSource = Util . getCBList ( types . Skip ( 1 ) . Take ( 16 ) . ToArray ( ) , null ) ;
2015-03-09 00:41:13 +00:00
2014-12-14 07:18:27 +00:00
// Set the Move ComboBoxes too..
2014-06-28 21:22:05 +00:00
{
2015-09-21 03:34:09 +00:00
MoveDataSource = Util . getCBList ( movelist , null ) ;
2015-03-11 01:44:51 +00:00
foreach ( ComboBox cb in new [ ] { CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 , CB_RelearnMove1 , CB_RelearnMove2 , CB_RelearnMove3 , CB_RelearnMove4 } )
2014-12-13 22:48:34 +00:00
{
2014-12-14 07:18:27 +00:00
cb . DisplayMember = "Text" ; cb . ValueMember = "Value" ;
2015-09-21 03:34:09 +00:00
cb . DataSource = new BindingSource ( MoveDataSource , null ) ;
2014-12-13 22:48:34 +00:00
}
2014-08-07 00:10:29 +00:00
}
2014-06-28 21:22:05 +00:00
}
2016-01-24 18:19:30 +00:00
public void populateFields ( PK6 pk , bool focus = true )
2014-06-28 21:22:05 +00:00
{
2016-01-24 18:19:30 +00:00
pk6 = pk ? ? new PK6 ( ) ;
2015-11-06 06:59:55 +00:00
if ( fieldsInitialized & ! PKX . verifychk ( pk6 . Data ) )
2015-09-24 03:29:31 +00:00
Util . Alert ( "PKX File has an invalid checksum." ) ;
2015-03-14 02:59:51 +00:00
2015-09-24 03:29:31 +00:00
// Reset a little.
2015-11-06 06:59:55 +00:00
bool oldInit = fieldsInitialized ;
2016-02-17 15:54:59 +00:00
fieldsInitialized = fieldsLoaded = false ;
2014-12-13 22:48:34 +00:00
CAL_EggDate . Value = new DateTime ( 2000 , 01 , 01 ) ;
2015-10-12 06:36:20 +00:00
if ( focus )
Tab_Main . Focus ( ) ;
2014-12-13 22:48:34 +00:00
2015-09-25 02:54:50 +00:00
// Do first
pk6 . Stat_Level = PKX . getLevel ( pk6 . Species , pk6 . EXP ) ;
if ( pk6 . Stat_Level = = 100 )
pk6 . EXP = PKX . getEXP ( pk6 . Stat_Level , pk6 . Species ) ;
CB_Species . SelectedValue = pk6 . Species ;
TB_Level . Text = pk6 . Stat_Level . ToString ( ) ;
TB_EXP . Text = pk6 . EXP . ToString ( ) ;
// Load rest
2015-09-24 03:29:31 +00:00
TB_EC . Text = pk6 . EncryptionConstant . ToString ( "X8" ) ;
CHK_Fateful . Checked = pk6 . FatefulEncounter ;
CHK_IsEgg . Checked = pk6 . IsEgg ;
CHK_Nicknamed . Checked = pk6 . IsNicknamed ;
Label_OTGender . Text = gendersymbols [ pk6 . OT_Gender ] ;
2016-01-05 06:42:38 +00:00
Label_OTGender . ForeColor = pk6 . OT_Gender = = 1 ? Color . Red : Color . Blue ;
2015-09-24 03:29:31 +00:00
CHK_Circle . Checked = pk6 . Circle ;
CHK_Triangle . Checked = pk6 . Triangle ;
CHK_Square . Checked = pk6 . Square ;
CHK_Heart . Checked = pk6 . Heart ;
CHK_Star . Checked = pk6 . Star ;
CHK_Diamond . Checked = pk6 . Diamond ;
TB_PID . Text = pk6 . PID . ToString ( "X8" ) ;
CB_HeldItem . SelectedValue = pk6 . HeldItem ;
setAbilityList ( TB_AbilityNumber , pk6 . Species , CB_Ability , CB_Form ) ;
TB_AbilityNumber . Text = pk6 . AbilityNumber . ToString ( ) ;
2016-01-05 06:42:38 +00:00
CB_Ability . SelectedIndex = pk6 . AbilityNumber < 6 ? pk6 . AbilityNumber > > 1 : 0 ; // with some simple error handling
2015-09-24 03:29:31 +00:00
CB_Nature . SelectedValue = pk6 . Nature ;
TB_TID . Text = pk6 . TID . ToString ( "00000" ) ;
TB_SID . Text = pk6 . SID . ToString ( "00000" ) ;
TB_Nickname . Text = pk6 . Nickname ;
TB_OT . Text = pk6 . OT_Name ;
TB_OTt2 . Text = pk6 . HT_Name ;
2015-10-24 18:57:07 +00:00
TB_Friendship . Text = pk6 . CurrentFriendship . ToString ( ) ;
2015-09-24 03:29:31 +00:00
if ( pk6 . CurrentHandler = = 1 ) // HT
{
2015-02-26 04:22:53 +00:00
GB_nOT . BackgroundImage = mixedHighlight ;
GB_OT . BackgroundImage = null ;
2014-12-04 01:26:12 +00:00
}
2015-02-26 04:22:53 +00:00
else // = 0
2014-12-04 01:26:12 +00:00
{
2015-02-26 04:22:53 +00:00
GB_OT . BackgroundImage = mixedHighlight ;
2015-02-26 06:39:29 +00:00
GB_nOT . BackgroundImage = null ;
2014-12-04 01:26:12 +00:00
}
2015-09-24 03:29:31 +00:00
CB_Language . SelectedValue = pk6 . Language ;
CB_Country . SelectedValue = pk6 . Country ;
CB_SubRegion . SelectedValue = pk6 . Region ;
CB_3DSReg . SelectedValue = pk6 . ConsoleRegion ;
CB_GameOrigin . SelectedValue = pk6 . Version ;
2016-01-05 06:42:38 +00:00
CB_EncounterType . SelectedValue = pk6 . Gen4 ? pk6 . EncounterType : 0 ;
2015-09-24 03:29:31 +00:00
CB_Ball . SelectedValue = pk6 . Ball ;
if ( pk6 . Met_Month = = 0 ) { pk6 . Met_Month = 1 ; }
if ( pk6 . Met_Day = = 0 ) { pk6 . Met_Day = 1 ; }
try { CAL_MetDate . Value = new DateTime ( pk6 . Met_Year + 2000 , pk6 . Met_Month , pk6 . Met_Day ) ; }
2014-12-13 22:48:34 +00:00
catch { CAL_MetDate . Value = new DateTime ( 2000 , 1 , 1 ) ; }
2014-06-28 21:22:05 +00:00
2015-09-24 03:29:31 +00:00
if ( pk6 . Egg_Location ! = 0 )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
// Was obtained initially as an egg.
CHK_AsEgg . Checked = true ;
GB_EggConditions . Enabled = true ;
2014-06-28 21:22:05 +00:00
2015-09-24 03:29:31 +00:00
CB_EggLocation . SelectedValue = pk6 . Egg_Location ;
try { CAL_EggDate . Value = new DateTime ( pk6 . Egg_Year + 2000 , pk6 . Egg_Month , pk6 . Egg_Day ) ; }
2014-12-13 22:48:34 +00:00
catch { CAL_MetDate . Value = new DateTime ( 2000 , 1 , 1 ) ; }
}
else { CHK_AsEgg . Checked = GB_EggConditions . Enabled = false ; CB_EggLocation . SelectedValue = 0 ; }
2014-12-11 06:50:40 +00:00
2015-09-24 03:29:31 +00:00
CB_MetLocation . SelectedValue = pk6 . Met_Location ;
2014-06-28 21:22:05 +00:00
2014-12-27 17:43:38 +00:00
// Set CT Gender to None if no CT, else set to gender symbol.
2015-12-02 07:08:16 +00:00
Label_CTGender . Text = pk6 . HT_Name = = "" ? "" : gendersymbols [ pk6 . HT_Gender ] ;
Label_CTGender . ForeColor = pk6 . HT_Gender = = 1 ? Color . Red : Color . Blue ;
2014-06-28 21:22:05 +00:00
2015-09-24 03:29:31 +00:00
TB_MetLevel . Text = pk6 . Met_Level . ToString ( ) ;
2014-06-28 21:22:05 +00:00
2014-12-27 17:43:38 +00:00
// Reset Label and ComboBox visibility, as well as non-data checked status.
2015-09-24 03:29:31 +00:00
Label_PKRS . Visible = CB_PKRSStrain . Visible = CHK_Infected . Checked = pk6 . PKRS_Strain ! = 0 ;
Label_PKRSdays . Visible = CB_PKRSDays . Visible = pk6 . PKRS_Days ! = 0 ;
2014-12-27 17:43:38 +00:00
// Set SelectedIndexes for PKRS
2015-09-24 03:29:31 +00:00
CB_PKRSStrain . SelectedIndex = pk6 . PKRS_Strain ;
2016-01-05 06:42:38 +00:00
CHK_Cured . Checked = pk6 . PKRS_Strain > 0 & & pk6 . PKRS_Days = = 0 ;
2015-09-24 03:29:31 +00:00
CB_PKRSDays . SelectedIndex = Math . Min ( CB_PKRSDays . Items . Count - 1 , pk6 . PKRS_Days ) ; // to strip out bad hacked 'rus
TB_Cool . Text = pk6 . CNT_Cool . ToString ( ) ;
TB_Beauty . Text = pk6 . CNT_Beauty . ToString ( ) ;
TB_Cute . Text = pk6 . CNT_Cute . ToString ( ) ;
TB_Smart . Text = pk6 . CNT_Smart . ToString ( ) ;
TB_Tough . Text = pk6 . CNT_Tough . ToString ( ) ;
TB_Sheen . Text = pk6 . CNT_Sheen . ToString ( ) ;
TB_HPIV . Text = pk6 . IV_HP . ToString ( ) ;
TB_ATKIV . Text = pk6 . IV_ATK . ToString ( ) ;
TB_DEFIV . Text = pk6 . IV_DEF . ToString ( ) ;
TB_SPEIV . Text = pk6 . IV_SPE . ToString ( ) ;
TB_SPAIV . Text = pk6 . IV_SPA . ToString ( ) ;
TB_SPDIV . Text = pk6 . IV_SPD . ToString ( ) ;
2015-09-25 02:54:50 +00:00
CB_HPType . SelectedValue = pk6 . HPType ;
2015-09-24 03:29:31 +00:00
TB_HPEV . Text = pk6 . EV_HP . ToString ( ) ;
TB_ATKEV . Text = pk6 . EV_ATK . ToString ( ) ;
TB_DEFEV . Text = pk6 . EV_DEF . ToString ( ) ;
TB_SPEEV . Text = pk6 . EV_SPE . ToString ( ) ;
TB_SPAEV . Text = pk6 . EV_SPA . ToString ( ) ;
TB_SPDEV . Text = pk6 . EV_SPD . ToString ( ) ;
CB_Move1 . SelectedValue = pk6 . Move1 ;
CB_Move2 . SelectedValue = pk6 . Move2 ;
CB_Move3 . SelectedValue = pk6 . Move3 ;
CB_Move4 . SelectedValue = pk6 . Move4 ;
CB_RelearnMove1 . SelectedValue = pk6 . RelearnMove1 ;
CB_RelearnMove2 . SelectedValue = pk6 . RelearnMove2 ;
CB_RelearnMove3 . SelectedValue = pk6 . RelearnMove3 ;
CB_RelearnMove4 . SelectedValue = pk6 . RelearnMove4 ;
CB_PPu1 . SelectedIndex = pk6 . Move1_PPUps ;
CB_PPu2 . SelectedIndex = pk6 . Move2_PPUps ;
CB_PPu3 . SelectedIndex = pk6 . Move3_PPUps ;
CB_PPu4 . SelectedIndex = pk6 . Move4_PPUps ;
TB_PP1 . Text = pk6 . Move1_PP . ToString ( ) ;
TB_PP2 . Text = pk6 . Move2_PP . ToString ( ) ;
TB_PP3 . Text = pk6 . Move3_PP . ToString ( ) ;
TB_PP4 . Text = pk6 . Move4_PP . ToString ( ) ;
2016-02-17 15:54:59 +00:00
2014-12-27 17:43:38 +00:00
// Set Form if count is enough, else if count is more than 1 set equal to max else zero.
2016-01-05 06:42:38 +00:00
CB_Form . SelectedIndex = CB_Form . Items . Count > pk6 . AltForm ? pk6 . AltForm : ( CB_Form . Items . Count > 1 ? CB_Form . Items . Count - 1 : 0 ) ;
2014-12-13 22:48:34 +00:00
// Load Extrabyte Value
2015-09-24 03:29:31 +00:00
TB_ExtraByte . Text = pk6 . Data [ Convert . ToInt32 ( CB_ExtraBytes . Text , 16 ) ] . ToString ( ) ;
2015-01-01 19:38:37 +00:00
2014-06-28 21:22:05 +00:00
updateStats ( ) ;
2014-12-13 22:48:34 +00:00
setIsShiny ( ) ;
2014-12-17 02:56:08 +00:00
2015-12-02 07:27:16 +00:00
CB_EncounterType . Visible = Label_EncounterType . Visible = pk6 . Gen4 ;
2014-12-17 02:56:08 +00:00
2015-11-06 06:59:55 +00:00
fieldsInitialized = oldInit ;
2015-09-25 02:54:50 +00:00
updateIVs ( null , null ) ;
2014-12-26 18:46:18 +00:00
updatePKRSInfected ( null , null ) ;
updatePKRSCured ( null , null ) ;
2014-06-28 21:22:05 +00:00
2015-09-25 02:54:50 +00:00
TB_EXP . Text = pk6 . EXP . ToString ( ) ;
Label_Gender . Text = gendersymbols [ pk6 . Gender ] ;
2015-12-02 07:08:16 +00:00
Label_Gender . ForeColor = pk6 . Gender = = 2 ? Label_Species . ForeColor : ( pk6 . Gender = = 1 ? Color . Red : Color . Blue ) ;
2016-02-17 15:54:59 +00:00
2014-12-13 22:48:34 +00:00
if ( HaX ) // DEV Illegality
2014-06-28 21:22:05 +00:00
{
2015-09-24 03:29:31 +00:00
DEV_Ability . SelectedValue = pk6 . Ability ;
MT_Level . Text = pk6 . Stat_Level . ToString ( ) ;
MT_Form . Text = pk6 . AltForm . ToString ( ) ;
2014-06-28 21:22:05 +00:00
}
2016-02-17 15:54:59 +00:00
2014-12-27 17:43:38 +00:00
// Set the Preview Box
2015-10-12 06:34:11 +00:00
dragout . Image = pk6 . Sprite ;
2014-12-27 17:43:38 +00:00
2015-02-07 20:22:09 +00:00
// Highlight the Current Handler
2015-12-02 07:08:16 +00:00
clickGT ( pk6 . CurrentHandler = = 1 ? GB_nOT : GB_OT , null ) ;
2016-02-17 15:54:59 +00:00
fieldsLoaded = true ;
updateValidMoves ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-25 00:20:39 +00:00
// General Use Functions shared by other Forms //
2015-09-21 03:34:09 +00:00
internal static void setCountrySubRegion ( ComboBox CB , string type )
2014-06-28 21:22:05 +00:00
{
2015-01-31 23:59:23 +00:00
int index = CB . SelectedIndex ;
2014-12-24 07:29:57 +00:00
// fix for Korean / Chinese being swapped
string cl = curlanguage + "" ;
2016-01-05 06:42:38 +00:00
cl = cl = = "zh" ? "ko" : cl = = "ko" ? "zh" : cl ;
2014-06-28 21:22:05 +00:00
2014-12-24 07:29:57 +00:00
CB . DataSource = Util . getCBList ( type , cl ) ;
2015-11-06 06:59:55 +00:00
if ( index > 0 & & index < CB . Items . Count & & fieldsInitialized )
2015-01-31 23:59:23 +00:00
CB . SelectedIndex = index ;
2014-12-13 22:48:34 +00:00
}
2015-09-21 03:34:09 +00:00
internal static void setForms ( int species , ComboBox cb , Label l = null )
2014-12-13 22:48:34 +00:00
{
// Form Tables
2015-01-26 00:30:44 +00:00
cb . DisplayMember = "Text" ;
cb . ValueMember = "Value" ;
2015-12-07 06:40:11 +00:00
bool hasForms = PKX . Personal [ species ] . HasFormes | | new [ ] { 664 , 665 , 414 , } . Contains ( species ) ;
2015-03-08 08:48:57 +00:00
cb . Enabled = cb . Visible = hasForms ;
if ( l ! = null ) l . Visible = hasForms ;
2015-03-17 02:25:59 +00:00
cb . DataSource = PKX . getFormList ( species , types , forms , gendersymbols ) . ToList ( ) ;
2014-12-13 22:48:34 +00:00
}
2015-09-21 03:34:09 +00:00
internal static void setAbilityList ( MaskedTextBox tb_abil , int species , ComboBox cb_abil , ComboBox cb_forme )
2014-12-24 07:29:57 +00:00
{
2016-02-03 04:05:46 +00:00
if ( ! fieldsInitialized & & string . IsNullOrWhiteSpace ( tb_abil . Text ) )
2014-12-24 07:29:57 +00:00
return ;
int newabil = Convert . ToInt16 ( tb_abil . Text ) > > 1 ;
int form = cb_forme . SelectedIndex ;
byte [ ] abils = PKX . getAbilities ( species , form ) ;
// Build Ability List
2015-03-11 01:44:51 +00:00
List < string > ability_list = new List < string >
{
abilitylist [ abils [ 0 ] ] + " (1)" ,
abilitylist [ abils [ 1 ] ] + " (2)" ,
abilitylist [ abils [ 2 ] ] + " (H)"
} ;
2014-12-24 07:29:57 +00:00
cb_abil . DataSource = ability_list ;
2015-03-11 01:44:51 +00:00
cb_abil . SelectedIndex = newabil < 3 ? newabil : 0 ;
2014-12-24 07:29:57 +00:00
}
// PKX Data Calculation Functions //
private void setIsShiny ( )
{
2016-01-09 20:39:18 +00:00
bool isShiny = PKX . getIsShiny ( Util . getHEXval ( TB_PID . Text ) , Util . ToUInt32 ( TB_TID . Text ) , Util . ToUInt32 ( TB_SID . Text ) ) ;
2015-01-01 19:38:37 +00:00
2014-12-24 07:29:57 +00:00
// Set the Controls
BTN_Shinytize . Visible = BTN_Shinytize . Enabled = ! isShiny ;
Label_IsShiny . Visible = isShiny ;
// Refresh Markings (for Shiny Star if applicable)
setMarkings ( ) ;
}
2014-12-13 22:48:34 +00:00
private void setMarkings ( )
{
PictureBox [ ] pba = { PB_Mark1 , PB_Mark2 , PB_Mark3 , PB_Mark4 , PB_Mark5 , PB_Mark6 } ;
CheckBox [ ] cba = { CHK_Circle , CHK_Triangle , CHK_Square , CHK_Heart , CHK_Star , CHK_Diamond } ;
for ( int i = 0 ; i < 6 ; i + + )
2015-09-24 03:29:31 +00:00
pba [ i ] . Image = Util . ChangeOpacity ( pba [ i ] . InitialImage , ( cba [ i ] . Checked ? 1 : 0 ) * 0.9 + 0.1 ) ;
PB_MarkShiny . Image = Util . ChangeOpacity ( PB_MarkShiny . InitialImage , ( ! BTN_Shinytize . Enabled ? 1 : 0 ) * 0.9 + 0.1 ) ;
PB_MarkCured . Image = Util . ChangeOpacity ( PB_MarkCured . InitialImage , ( CHK_Cured . Checked ? 1 : 0 ) * 0.9 + 0.1 ) ;
2014-06-28 21:22:05 +00:00
2015-10-10 17:01:52 +00:00
int Version = Util . getIndex ( CB_GameOrigin ) ; // 24,25 = XY, 26,27 = ORAS, 28,29 = ???
2016-01-18 01:07:19 +00:00
PB_MarkPentagon . Image = Util . ChangeOpacity ( PB_MarkPentagon . InitialImage , ( Version > = 24 & & Version < = 29 ? 1 : 0 ) * 0.9 + 0.1 ) ;
2014-12-13 22:48:34 +00:00
}
2015-02-25 04:10:47 +00:00
// Clicked Label Shortcuts //
private void clickQR ( object sender , EventArgs e )
{
2015-02-27 08:40:57 +00:00
if ( ModifierKeys = = Keys . Alt )
{
// Fetch data from QR code...
2015-03-14 02:59:51 +00:00
byte [ ] ekx = Util . getQRData ( ) ;
if ( ekx = = null ) return ;
2016-01-17 21:27:24 +00:00
if ( ekx . Length ! = PK6 . SIZE_STORED ) { Util . Alert ( $"Decoded data not {PK6.SIZE_STORED} bytes." , $"QR Data Size: {ekx.Length}" ) ; }
2015-03-14 02:59:51 +00:00
else try
{
2016-01-24 18:19:30 +00:00
PK6 pk = new PK6 ( PKX . decryptArray ( ekx ) ) ;
if ( pk . ChecksumValid ) { populateFields ( pk ) ; }
2015-02-27 08:40:57 +00:00
else Util . Alert ( "Invalid checksum in QR data." ) ;
2015-03-14 02:59:51 +00:00
}
catch { Util . Alert ( "Error loading decrypted data." ) ; }
2015-02-26 06:39:29 +00:00
}
2015-02-27 08:40:57 +00:00
else
2015-02-26 07:12:38 +00:00
{
2015-02-27 08:40:57 +00:00
if ( ! verifiedPKX ( ) ) return ;
2016-01-24 18:19:30 +00:00
PK6 pkx = preparepkx ( ) ;
byte [ ] ekx = pkx . EncryptedBoxData ;
2015-03-11 01:44:51 +00:00
const string server = "http://loadcode.projectpokemon.org/b1s1.html#" ; // Rehosted with permission from LC/MS -- massive thanks!
2015-03-14 02:59:51 +00:00
Image qr = Util . getQRImage ( ekx , server ) ;
if ( qr = = null ) return ;
2015-02-27 08:40:57 +00:00
2016-01-24 18:19:30 +00:00
string [ ] r = pkx . QRText ;
2015-03-14 02:59:51 +00:00
new QR ( qr , dragout . Image , r [ 0 ] , r [ 1 ] , r [ 2 ] , "PKHeX @ ProjectPokemon.org" ) . ShowDialog ( ) ;
2015-02-26 07:12:38 +00:00
}
2015-02-25 04:10:47 +00:00
}
2014-12-14 19:06:17 +00:00
private void clickFriendship ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
if ( ModifierKeys = = Keys . Control ) // prompt to reset
2015-09-24 03:29:31 +00:00
TB_Friendship . Text = pk6 . CurrentHandler = = 0 ? pk6 . OT_Friendship . ToString ( ) : pk6 . HT_Friendship . ToString ( ) ;
2015-03-11 01:44:51 +00:00
else
2015-09-24 03:29:31 +00:00
TB_Friendship . Text = TB_Friendship . Text = = "255" ? PKX . getBaseFriendship ( pk6 . Species ) . ToString ( ) : "255" ;
2014-12-13 22:48:34 +00:00
}
2014-12-14 19:06:17 +00:00
private void clickGender ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
// Get Gender Threshold
2015-11-26 06:20:09 +00:00
int gt = PKX . Personal [ Util . getIndex ( CB_Species ) ] . Gender ;
2014-12-13 22:48:34 +00:00
if ( gt = = 255 | | gt = = 0 | | gt = = 254 ) // Single gender/genderless
return ;
2015-03-11 01:44:51 +00:00
if ( gt > = 255 ) return ;
2015-08-07 04:16:25 +00:00
// If not a single gender(less) species: (should be <254 but whatever, 255 never happens)
2015-09-24 03:29:31 +00:00
pk6 . Gender = PKX . getGender ( Label_Gender . Text ) ^ 1 ;
Label_Gender . Text = gendersymbols [ pk6 . Gender ] ;
2016-01-18 01:07:19 +00:00
Label_Gender . ForeColor = pk6 . Gender = = 2 ? Label_Species . ForeColor : ( pk6 . Gender = = 1 ? Color . Red : Color . Blue ) ;
2014-12-13 22:48:34 +00:00
2015-03-11 01:44:51 +00:00
if ( PKX . getGender ( CB_Form . Text ) < 2 ) // Gendered Forms
CB_Form . SelectedIndex = PKX . getGender ( Label_Gender . Text ) ;
2015-02-28 05:51:19 +00:00
2015-03-11 01:44:51 +00:00
getQuickFiller ( dragout ) ;
2014-12-13 22:48:34 +00:00
}
2014-12-14 19:06:17 +00:00
private void clickPPUps ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
2016-01-05 06:42:38 +00:00
CB_PPu1 . SelectedIndex = ModifierKeys ! = Keys . Control & & Util . getIndex ( CB_Move1 ) > 0 ? 3 : 0 ;
CB_PPu2 . SelectedIndex = ModifierKeys ! = Keys . Control & & Util . getIndex ( CB_Move2 ) > 0 ? 3 : 0 ;
CB_PPu3 . SelectedIndex = ModifierKeys ! = Keys . Control & & Util . getIndex ( CB_Move3 ) > 0 ? 3 : 0 ;
CB_PPu4 . SelectedIndex = ModifierKeys ! = Keys . Control & & Util . getIndex ( CB_Move4 ) > 0 ? 3 : 0 ;
2014-12-13 22:48:34 +00:00
}
2014-12-14 19:06:17 +00:00
private void clickMarking ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
PictureBox [ ] pba = { PB_Mark1 , PB_Mark2 , PB_Mark3 , PB_Mark4 , PB_Mark5 , PB_Mark6 } ;
CheckBox [ ] cba = { CHK_Circle , CHK_Triangle , CHK_Square , CHK_Heart , CHK_Star , CHK_Diamond } ;
2016-02-24 22:59:03 +00:00
cba [ Array . IndexOf ( pba , sender ) ] . Checked ^ = true ;
2014-12-13 22:48:34 +00:00
setMarkings ( ) ;
}
2015-09-27 17:00:45 +00:00
private void clickStatLabel ( object sender , MouseEventArgs e )
2015-09-26 04:56:15 +00:00
{
if ( ! ( ModifierKeys = = Keys . Control | | ModifierKeys = = Keys . Alt ) )
return ;
2016-02-24 22:59:03 +00:00
int index = Array . IndexOf ( new [ ] { Label_HP , Label_ATK , Label_DEF , Label_SPA , Label_SPD , Label_SPE } , sender ) ;
2015-09-26 04:56:15 +00:00
if ( ModifierKeys = = Keys . Alt ) // EV
{
var arrayEV = new [ ] { TB_HPEV , TB_ATKEV , TB_DEFEV , TB_SPAEV , TB_SPDEV , TB_SPEEV } ;
2016-01-05 06:42:38 +00:00
arrayEV [ index ] . Text = ( e . Button = = MouseButtons . Left
2016-01-09 20:39:18 +00:00
? Math . Min ( Math . Max ( 510 - Util . ToInt32 ( TB_EVTotal . Text ) + Util . ToInt32 ( arrayEV [ index ] . Text ) , 0 ) , 252 )
2015-09-26 04:56:15 +00:00
: 0 ) . ToString ( ) ;
}
else
2015-10-24 23:33:44 +00:00
new [ ] { TB_HPIV , TB_ATKIV , TB_DEFIV , TB_SPAIV , TB_SPDIV , TB_SPEIV } [ index ] . Text =
2016-01-18 01:07:19 +00:00
( e . Button = = MouseButtons . Left ? 31 : 0 ) . ToString ( ) ;
2015-09-26 04:56:15 +00:00
}
2015-09-27 17:00:45 +00:00
private void clickIV ( object sender , EventArgs e )
{
if ( ModifierKeys = = Keys . Control )
( sender as MaskedTextBox ) . Text = 31. ToString ( ) ;
else if ( ModifierKeys = = Keys . Alt )
( sender as MaskedTextBox ) . Text = 0. ToString ( ) ;
}
private void clickEV ( object sender , EventArgs e )
{
if ( ModifierKeys = = Keys . Control ) // EV
2016-01-09 20:39:18 +00:00
( sender as MaskedTextBox ) . Text = Math . Min ( Math . Max ( 510 - Util . ToInt32 ( TB_EVTotal . Text ) + Util . ToInt32 ( ( sender as MaskedTextBox ) . Text ) , 0 ) , 252 ) . ToString ( ) ;
2015-09-27 17:00:45 +00:00
else if ( ModifierKeys = = Keys . Alt )
( sender as MaskedTextBox ) . Text = 0. ToString ( ) ;
}
2014-12-14 19:06:17 +00:00
private void clickOT ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
2016-01-31 07:03:43 +00:00
if ( ! SAV . Exportable )
return ;
2015-10-24 03:13:32 +00:00
// Get Save Information
2016-01-31 07:03:43 +00:00
TB_OT . Text = SAV . OT ;
Label_OTGender . Text = gendersymbols [ SAV . Gender % 2 ] ;
2015-10-24 03:13:32 +00:00
TB_TID . Text = SAV . TID . ToString ( ) ;
TB_SID . Text = SAV . SID . ToString ( ) ;
CB_GameOrigin . SelectedValue = SAV . Game ;
CB_SubRegion . SelectedValue = SAV . SubRegion ;
CB_Country . SelectedValue = SAV . Country ;
CB_3DSReg . SelectedValue = SAV . ConsoleRegion ;
CB_Language . SelectedValue = SAV . Language ;
2015-03-11 01:44:51 +00:00
updateNickname ( null , null ) ;
2014-12-13 22:48:34 +00:00
}
2014-12-14 19:06:17 +00:00
private void clickCT ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
2014-12-20 19:27:29 +00:00
if ( TB_OTt2 . Text . Length > 0 )
2016-01-31 07:03:43 +00:00
Label_CTGender . Text = gendersymbols [ SAV . Gender % 2 ] ;
2014-12-20 19:27:29 +00:00
}
private void clickGT ( object sender , EventArgs e )
{
2016-01-24 18:19:30 +00:00
if ( sender = = GB_OT )
2014-12-20 19:27:29 +00:00
{
2015-09-24 03:29:31 +00:00
pk6 . CurrentHandler = 0 ;
TB_Friendship . Text = pk6 . OT_Friendship . ToString ( ) ;
2014-12-20 19:27:29 +00:00
GB_OT . BackgroundImage = mixedHighlight ;
GB_nOT . BackgroundImage = null ;
}
else if ( TB_OTt2 . Text . Length > 0 )
{
2015-09-24 03:29:31 +00:00
pk6 . CurrentHandler = 1 ;
TB_Friendship . Text = pk6 . HT_Friendship . ToString ( ) ;
2014-12-20 19:27:29 +00:00
GB_OT . BackgroundImage = null ;
GB_nOT . BackgroundImage = mixedHighlight ;
}
2014-12-13 22:48:34 +00:00
}
2014-12-14 19:06:17 +00:00
private void clickTRGender ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
Label lbl = sender as Label ;
2016-02-03 04:05:46 +00:00
if ( ! string . IsNullOrWhiteSpace ( lbl ? . Text ) ) // set gender label (toggle M/F)
2015-08-07 04:16:25 +00:00
{
int gender = PKX . getGender ( lbl . Text ) ^ 1 ;
lbl . Text = gendersymbols [ gender ] ;
2016-01-05 06:42:38 +00:00
lbl . ForeColor = gender = = 1 ? Color . Red : Color . Blue ;
2015-08-07 04:16:25 +00:00
}
2014-12-13 22:48:34 +00:00
}
2015-06-28 21:34:38 +00:00
private void clickMoves ( object sender , EventArgs e )
{
if ( DialogResult . Yes ! = Util . Prompt ( MessageBoxButtons . YesNo , "Copy current moves to Relearn Moves?" ) )
return ;
2016-01-24 18:19:30 +00:00
CB_RelearnMove1 . SelectedIndex = CB_Move1 . SelectedIndex > - 1 ? CB_Move1 . SelectedIndex : 0 ;
CB_RelearnMove2 . SelectedIndex = CB_Move2 . SelectedIndex > - 1 ? CB_Move2 . SelectedIndex : 0 ;
CB_RelearnMove3 . SelectedIndex = CB_Move3 . SelectedIndex > - 1 ? CB_Move3 . SelectedIndex : 0 ;
CB_RelearnMove4 . SelectedIndex = CB_Move4 . SelectedIndex > - 1 ? CB_Move4 . SelectedIndex : 0 ;
2015-06-28 21:34:38 +00:00
}
2014-12-13 22:48:34 +00:00
// Prompted Updates of PKX Functions //
2015-03-11 01:44:51 +00:00
private bool changingFields ;
2014-12-13 22:48:34 +00:00
private void updateEXPLevel ( object sender , EventArgs e )
{
2015-03-09 00:41:13 +00:00
if ( changingFields ) return ;
2014-12-20 04:22:15 +00:00
2016-02-01 04:44:30 +00:00
changingFields = true ;
2016-01-31 07:03:43 +00:00
if ( sender = = TB_EXP )
2014-12-13 22:48:34 +00:00
{
// Change the Level
2016-01-09 20:39:18 +00:00
uint EXP = Util . ToUInt32 ( TB_EXP . Text ) ;
2015-09-25 02:54:50 +00:00
int Species = Util . getIndex ( CB_Species ) ;
2016-02-01 04:44:30 +00:00
int Level = PKX . getLevel ( Species , EXP ) ;
2015-09-25 02:54:50 +00:00
if ( Level = = 100 )
2016-02-01 04:44:30 +00:00
EXP = PKX . getEXP ( 100 , Species ) ;
2014-12-20 04:22:15 +00:00
2015-09-25 02:54:50 +00:00
TB_Level . Text = Level . ToString ( ) ;
2014-12-20 04:22:15 +00:00
if ( ! MT_Level . Visible )
2015-09-25 02:54:50 +00:00
TB_EXP . Text = EXP . ToString ( ) ;
2014-12-20 04:22:15 +00:00
else
2015-09-25 02:54:50 +00:00
MT_Level . Text = Level . ToString ( ) ;
2014-12-13 22:48:34 +00:00
}
2014-12-20 04:22:15 +00:00
else
2014-12-13 22:48:34 +00:00
{
// Change the XP
2015-09-25 02:54:50 +00:00
int Level = Util . ToInt32 ( ( MT_Level . Focused ? MT_Level : TB_Level ) . Text ) ;
if ( Level > 100 ) TB_Level . Text = "100" ;
2016-01-03 04:22:53 +00:00
if ( Level > byte . MaxValue ) MT_Level . Text = "255" ;
2014-12-13 22:48:34 +00:00
2015-09-25 02:54:50 +00:00
TB_EXP . Text = PKX . getEXP ( Level , Util . getIndex ( CB_Species ) ) . ToString ( ) ;
2014-12-13 22:48:34 +00:00
}
2015-03-09 00:41:13 +00:00
changingFields = false ;
2014-12-13 22:48:34 +00:00
updateStats ( ) ;
2016-02-17 15:54:59 +00:00
updateValidMoves ( ) ;
2014-12-13 22:48:34 +00:00
}
2015-03-09 00:41:13 +00:00
private void updateHPType ( object sender , EventArgs e )
{
2015-11-06 06:59:55 +00:00
if ( changingFields | | ! fieldsInitialized ) return ;
2015-03-09 00:41:13 +00:00
changingFields = true ;
2015-09-25 02:54:50 +00:00
int [ ] ivs =
{
Util . ToInt32 ( TB_HPIV . Text ) , Util . ToInt32 ( TB_ATKIV . Text ) , Util . ToInt32 ( TB_DEFIV . Text ) ,
Util . ToInt32 ( TB_SPAIV . Text ) , Util . ToInt32 ( TB_SPDIV . Text ) , Util . ToInt32 ( TB_SPEIV . Text )
} ;
2015-03-09 00:41:13 +00:00
2015-09-25 02:54:50 +00:00
// Change IVs to match the new Hidden Power
int [ ] newIVs = PKX . setHPIVs ( Util . getIndex ( CB_HPType ) , ivs ) ;
TB_HPIV . Text = newIVs [ 0 ] . ToString ( ) ;
TB_ATKIV . Text = newIVs [ 1 ] . ToString ( ) ;
TB_DEFIV . Text = newIVs [ 2 ] . ToString ( ) ;
2015-03-09 00:41:13 +00:00
2015-09-25 02:54:50 +00:00
TB_SPAIV . Text = newIVs [ 3 ] . ToString ( ) ;
TB_SPDIV . Text = newIVs [ 4 ] . ToString ( ) ;
TB_SPEIV . Text = newIVs [ 5 ] . ToString ( ) ;
// Refresh View
2015-03-09 00:41:13 +00:00
changingFields = false ;
updateIVs ( null , null ) ;
}
2014-12-13 22:48:34 +00:00
private void updateIVs ( object sender , EventArgs e )
{
2015-11-06 06:59:55 +00:00
if ( changingFields | | ! fieldsInitialized ) return ;
2016-01-27 05:06:53 +00:00
if ( sender ! = null & & Util . ToInt32 ( ( sender as MaskedTextBox ) . Text ) > 31 )
( sender as MaskedTextBox ) . Text = "31" ;
2014-06-28 21:22:05 +00:00
2015-03-09 00:41:13 +00:00
changingFields = true ;
2014-06-28 21:22:05 +00:00
2015-09-24 03:29:31 +00:00
// Update IVs
2016-01-09 20:39:18 +00:00
pk6 . IV_HP = Util . ToInt32 ( TB_HPIV . Text ) ;
pk6 . IV_ATK = Util . ToInt32 ( TB_ATKIV . Text ) ;
pk6 . IV_DEF = Util . ToInt32 ( TB_DEFIV . Text ) ;
pk6 . IV_SPE = Util . ToInt32 ( TB_SPEIV . Text ) ;
pk6 . IV_SPA = Util . ToInt32 ( TB_SPAIV . Text ) ;
pk6 . IV_SPD = Util . ToInt32 ( TB_SPDIV . Text ) ;
2015-09-25 02:54:50 +00:00
2015-09-24 03:29:31 +00:00
CB_HPType . SelectedValue = pk6 . HPType ;
changingFields = false ;
2014-06-28 21:22:05 +00:00
2015-09-24 03:29:31 +00:00
// Potential Reading
2016-01-05 06:42:38 +00:00
L_Potential . Text = ( ! unicode
2015-09-24 03:29:31 +00:00
? new [ ] { "★☆☆☆" , "★★☆☆" , "★★★☆" , "★★★★" }
: new [ ] { "+" , "++" , "+++" , "++++" }
) [ pk6 . PotentialRating ] ;
TB_IVTotal . Text = pk6 . IVs . Sum ( ) . ToString ( ) ;
2014-06-28 21:22:05 +00:00
2015-09-24 03:29:31 +00:00
L_Characteristic . Text = characteristics [ pk6 . Characteristic ] ;
2014-12-13 22:48:34 +00:00
updateStats ( ) ;
}
private void updateEVs ( object sender , EventArgs e )
{
if ( sender ! = null )
if ( Util . ToInt32 ( ( sender as MaskedTextBox ) . Text ) > 252 )
( sender as MaskedTextBox ) . Text = "252" ;
2015-09-24 03:29:31 +00:00
changingFields = true ;
2015-09-25 02:54:50 +00:00
int EV_HP = Util . ToInt32 ( TB_HPEV . Text ) ;
int EV_ATK = Util . ToInt32 ( TB_ATKEV . Text ) ;
int EV_DEF = Util . ToInt32 ( TB_DEFEV . Text ) ;
int EV_SPA = Util . ToInt32 ( TB_SPAEV . Text ) ;
int EV_SPD = Util . ToInt32 ( TB_SPDEV . Text ) ;
int EV_SPE = Util . ToInt32 ( TB_SPEEV . Text ) ;
2014-12-13 22:48:34 +00:00
2015-09-25 02:54:50 +00:00
int evtotal = EV_HP + EV_ATK + EV_DEF + EV_SPA + EV_SPD + EV_SPE ;
2014-12-13 22:48:34 +00:00
if ( evtotal > 510 ) // Background turns Red
2015-01-01 19:38:37 +00:00
TB_EVTotal . BackColor = Color . Red ;
2014-12-13 22:48:34 +00:00
else if ( evtotal = = 510 ) // Maximum EVs
2015-01-01 19:38:37 +00:00
TB_EVTotal . BackColor = Color . Honeydew ;
2015-09-24 03:29:31 +00:00
else if ( evtotal = = 508 ) // Fishy EVs
TB_EVTotal . BackColor = Color . LightYellow ;
2014-12-13 22:48:34 +00:00
else TB_EVTotal . BackColor = Color . WhiteSmoke ;
TB_EVTotal . Text = evtotal . ToString ( ) ;
2015-09-24 03:29:31 +00:00
changingFields = false ;
2014-12-13 22:48:34 +00:00
updateStats ( ) ;
}
private void updateRandomIVs ( object sender , EventArgs e )
{
2015-09-24 03:29:31 +00:00
changingFields = true ;
2015-03-12 15:25:27 +00:00
if ( ModifierKeys = = Keys . Control | | ModifierKeys = = Keys . Shift )
2014-12-13 22:48:34 +00:00
{
// Max IVs
TB_HPIV . Text = 31. ToString ( ) ;
TB_ATKIV . Text = 31. ToString ( ) ;
TB_DEFIV . Text = 31. ToString ( ) ;
TB_SPAIV . Text = 31. ToString ( ) ;
TB_SPDIV . Text = 31. ToString ( ) ;
TB_SPEIV . Text = 31. ToString ( ) ;
}
else
{
TB_HPIV . Text = ( Util . rnd32 ( ) & 0x1F ) . ToString ( ) ;
TB_ATKIV . Text = ( Util . rnd32 ( ) & 0x1F ) . ToString ( ) ;
TB_DEFIV . Text = ( Util . rnd32 ( ) & 0x1F ) . ToString ( ) ;
TB_SPAIV . Text = ( Util . rnd32 ( ) & 0x1F ) . ToString ( ) ;
TB_SPDIV . Text = ( Util . rnd32 ( ) & 0x1F ) . ToString ( ) ;
TB_SPEIV . Text = ( Util . rnd32 ( ) & 0x1F ) . ToString ( ) ;
}
2015-09-24 03:29:31 +00:00
changingFields = false ;
2016-01-27 05:06:53 +00:00
updateIVs ( null , null ) ;
2014-12-13 22:48:34 +00:00
}
private void updateRandomEVs ( object sender , EventArgs e )
{
2015-03-12 15:25:27 +00:00
if ( ModifierKeys = = Keys . Control | | ModifierKeys = = Keys . Shift )
2014-12-13 22:48:34 +00:00
{
// Max IVs
TB_HPEV . Text = 0. ToString ( ) ;
TB_ATKEV . Text = 0. ToString ( ) ;
TB_DEFEV . Text = 0. ToString ( ) ;
TB_SPAEV . Text = 0. ToString ( ) ;
TB_SPDEV . Text = 0. ToString ( ) ;
TB_SPEEV . Text = 0. ToString ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
else
{
byte [ ] evs = PKX . getRandomEVs ( ) ;
TB_HPEV . Text = evs [ 0 ] . ToString ( ) ;
TB_ATKEV . Text = evs [ 1 ] . ToString ( ) ;
TB_DEFEV . Text = evs [ 2 ] . ToString ( ) ;
TB_SPAEV . Text = evs [ 3 ] . ToString ( ) ;
TB_SPDEV . Text = evs [ 4 ] . ToString ( ) ;
TB_SPEEV . Text = evs [ 5 ] . ToString ( ) ;
}
}
private void updateRandomPID ( object sender , EventArgs e )
{
2015-09-25 02:54:50 +00:00
TB_PID . Text = PKX . getRandomPID ( Util . getIndex ( CB_Species ) , PKX . getGender ( Label_Gender . Text ) ) . ToString ( "X8" ) ;
2014-12-14 20:15:53 +00:00
getQuickFiller ( dragout ) ;
2014-12-13 22:48:34 +00:00
}
private void updateRandomEC ( object sender , EventArgs e )
{
TB_EC . Text = Util . rnd32 ( ) . ToString ( "X8" ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
private void updateHackedStats ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
Stat_HP . Enabled =
Stat_ATK . Enabled =
Stat_DEF . Enabled =
Stat_SPA . Enabled =
Stat_SPD . Enabled =
Stat_SPE . Enabled = CHK_HackedStats . Checked ;
2014-06-28 21:22:05 +00:00
}
2016-01-03 04:22:53 +00:00
private void updateHackedStatText ( object sender , EventArgs e )
{
2016-01-17 21:27:24 +00:00
if ( ! CHK_HackedStats . Checked | | ! ( sender is TextBox ) )
2016-01-03 04:22:53 +00:00
return ;
2016-01-17 21:27:24 +00:00
string text = ( ( TextBox ) sender ) . Text ;
2016-01-27 05:04:17 +00:00
if ( string . IsNullOrWhiteSpace ( text ) )
2016-01-17 21:27:24 +00:00
( ( TextBox ) sender ) . Text = "0" ;
2016-01-03 04:22:53 +00:00
if ( Convert . ToUInt32 ( text ) > ushort . MaxValue )
2016-01-17 21:27:24 +00:00
( ( TextBox ) sender ) . Text = "65535" ;
2016-01-03 04:22:53 +00:00
}
2014-12-13 22:48:34 +00:00
private void update255_MTB ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2016-02-01 04:44:30 +00:00
if ( Util . ToInt32 ( ( sender as MaskedTextBox ) . Text ) > byte . MaxValue )
2014-12-13 22:48:34 +00:00
( sender as MaskedTextBox ) . Text = "255" ;
2014-07-12 01:39:24 +00:00
}
2014-12-13 22:48:34 +00:00
private void updateForm ( object sender , EventArgs e )
2014-12-12 05:44:05 +00:00
{
2014-12-13 22:48:34 +00:00
updateStats ( ) ;
// Repopulate Abilities if Species Form has different abilities
2014-12-24 07:29:57 +00:00
setAbilityList ( TB_AbilityNumber , Util . getIndex ( CB_Species ) , CB_Ability , CB_Form ) ;
2014-12-13 22:48:34 +00:00
// Gender Forms
2015-01-28 06:59:53 +00:00
if ( PKX . getGender ( CB_Form . Text ) < 2 & & Util . getIndex ( CB_Species ) ! = 201 ) // don't do this for Unown
2014-12-13 22:48:34 +00:00
Label_Gender . Text = CB_Form . Text ;
2016-01-12 05:19:01 +00:00
if ( changingFields )
return ;
changingFields = true ;
2016-01-22 06:55:20 +00:00
MT_Form . Text = CB_Form . SelectedIndex . ToString ( ) ;
2016-01-12 05:19:01 +00:00
changingFields = false ;
}
private void updateHaXForm ( object sender , EventArgs e )
{
if ( changingFields )
return ;
changingFields = true ;
int form = Util . ToInt32 ( MT_Form . Text ) ;
CB_Form . SelectedIndex = CB_Form . Items . Count > form ? form : - 1 ;
changingFields = false ;
2014-12-12 05:44:05 +00:00
}
2014-12-13 22:48:34 +00:00
private void updatePP ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2015-12-02 07:08:16 +00:00
TB_PP1 . Text = PKX . getMovePP ( Util . getIndex ( CB_Move1 ) , CB_PPu1 . SelectedIndex ) . ToString ( ) ;
TB_PP2 . Text = PKX . getMovePP ( Util . getIndex ( CB_Move2 ) , CB_PPu2 . SelectedIndex ) . ToString ( ) ;
TB_PP3 . Text = PKX . getMovePP ( Util . getIndex ( CB_Move3 ) , CB_PPu3 . SelectedIndex ) . ToString ( ) ;
TB_PP4 . Text = PKX . getMovePP ( Util . getIndex ( CB_Move4 ) , CB_PPu4 . SelectedIndex ) . ToString ( ) ;
2014-12-13 22:48:34 +00:00
}
private void updatePKRSstrain ( object sender , EventArgs e )
{
2015-03-14 02:59:51 +00:00
// Change the PKRS Days to the legal bounds.
int currentDuration = CB_PKRSDays . SelectedIndex ;
CB_PKRSDays . Items . Clear ( ) ;
2015-12-02 07:08:16 +00:00
foreach ( int day in Enumerable . Range ( 0 , CB_PKRSStrain . SelectedIndex % 4 + 2 ) ) CB_PKRSDays . Items . Add ( day ) ;
2015-03-14 02:59:51 +00:00
// Set the days back if they're legal, else set it to 1. (0 always passes).
2016-01-05 06:42:38 +00:00
CB_PKRSDays . SelectedIndex = currentDuration < CB_PKRSDays . Items . Count ? currentDuration : 1 ;
2015-03-14 02:59:51 +00:00
2015-03-12 04:44:12 +00:00
if ( CB_PKRSStrain . SelectedIndex ! = 0 ) return ;
2015-03-14 02:59:51 +00:00
2015-03-12 04:44:12 +00:00
// Never Infected
2015-04-03 01:44:03 +00:00
CB_PKRSDays . SelectedIndex = 0 ;
2015-03-12 04:44:12 +00:00
CHK_Cured . Checked = false ;
CHK_Infected . Checked = false ;
}
private void updatePKRSdays ( object sender , EventArgs e )
{
if ( CB_PKRSDays . SelectedIndex ! = 0 ) return ;
// If no days are selected
2014-12-13 22:48:34 +00:00
if ( CB_PKRSStrain . SelectedIndex = = 0 )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
// Never Infected
CHK_Cured . Checked = false ;
CHK_Infected . Checked = false ;
2014-06-28 21:22:05 +00:00
}
2015-03-12 04:44:12 +00:00
else CHK_Cured . Checked = true ;
2014-06-28 21:22:05 +00:00
}
2014-12-26 18:46:18 +00:00
private void updatePKRSCured ( object sender , EventArgs e )
{
2015-11-06 06:59:55 +00:00
if ( ! fieldsInitialized ) return ;
2014-12-26 18:46:18 +00:00
// Cured PokeRus is toggled
if ( CHK_Cured . Checked )
{
// Has Had PokeRus
Label_PKRSdays . Visible = CB_PKRSDays . Visible = false ;
CB_PKRSDays . SelectedIndex = 0 ;
Label_PKRS . Visible = CB_PKRSStrain . Visible = true ;
CHK_Infected . Checked = true ;
// If we're cured we have to have a strain infection.
if ( CB_PKRSStrain . SelectedIndex = = 0 )
CB_PKRSStrain . SelectedIndex = 1 ;
}
else if ( ! CHK_Infected . Checked )
{
// Not Infected, Disable the other
Label_PKRS . Visible = CB_PKRSStrain . Visible = false ;
CB_PKRSStrain . SelectedIndex = 0 ;
}
else
{
// Still Infected for a duration
Label_PKRSdays . Visible = CB_PKRSDays . Visible = true ;
CB_PKRSDays . SelectedValue = 1 ;
}
// if not cured yet, days > 0
if ( ! CHK_Cured . Checked & & CHK_Infected . Checked & & CB_PKRSDays . SelectedIndex = = 0 )
CB_PKRSDays . SelectedIndex + + ;
setMarkings ( ) ;
}
private void updatePKRSInfected ( object sender , EventArgs e )
{
2015-11-06 06:59:55 +00:00
if ( ! fieldsInitialized ) return ;
2015-01-27 06:05:04 +00:00
if ( CHK_Cured . Checked & & ! CHK_Infected . Checked ) { CHK_Cured . Checked = false ; return ; }
2015-03-11 01:44:51 +00:00
if ( CHK_Cured . Checked ) return ;
2014-12-26 18:46:18 +00:00
Label_PKRS . Visible = CB_PKRSStrain . Visible = CHK_Infected . Checked ;
if ( ! CHK_Infected . Checked ) { CB_PKRSStrain . SelectedIndex = 0 ; CB_PKRSDays . SelectedIndex = 0 ; Label_PKRSdays . Visible = CB_PKRSDays . Visible = false ; }
2015-06-30 03:09:34 +00:00
else if ( CB_PKRSStrain . SelectedIndex = = 0 ) { CB_PKRSStrain . SelectedIndex = 1 ; Label_PKRSdays . Visible = CB_PKRSDays . Visible = true ; updatePKRSCured ( sender , e ) ; }
2014-12-26 18:46:18 +00:00
// if not cured yet, days > 0
2015-03-11 01:44:51 +00:00
if ( CHK_Infected . Checked & & CB_PKRSDays . SelectedIndex = = 0 ) CB_PKRSDays . SelectedIndex + + ;
2014-12-26 18:46:18 +00:00
}
2014-12-24 07:29:57 +00:00
private void updateCountry ( object sender , EventArgs e )
{
if ( Util . getIndex ( sender as ComboBox ) > 0 )
setCountrySubRegion ( CB_SubRegion , "sr_" + Util . getIndex ( sender as ComboBox ) . ToString ( "000" ) ) ;
}
2014-12-13 22:48:34 +00:00
private void updateSpecies ( object sender , EventArgs e )
{
// Change Species Prompted
2015-09-25 02:54:50 +00:00
int Species = Util . getIndex ( CB_Species ) ;
int Level = Util . ToInt32 ( TB_Level . Text ) ;
if ( MT_Level . Visible ) Level = Util . ToInt32 ( MT_Level . Text ) ;
2014-12-13 22:48:34 +00:00
// Get Forms for Given Species
2015-09-25 02:54:50 +00:00
setForms ( Species , CB_Form , Label_Form ) ;
2014-12-13 22:48:34 +00:00
// Recalculate EXP for Given Level
2015-09-25 02:54:50 +00:00
uint EXP = PKX . getEXP ( Level , Species ) ;
TB_EXP . Text = EXP . ToString ( ) ;
2014-12-13 22:48:34 +00:00
// Check for Gender Changes
// Get Gender Threshold
2015-11-26 06:20:09 +00:00
int gt = PKX . Personal [ Species ] . Gender ;
2015-01-03 01:07:29 +00:00
int genderflag ;
2014-12-13 22:48:34 +00:00
if ( gt = = 255 ) // Genderless
genderflag = 2 ;
else if ( gt = = 254 ) // Female Only
genderflag = 1 ;
else if ( gt = = 0 ) // Male Only
genderflag = 0 ;
else // get gender from old PID correlation
2016-01-09 20:39:18 +00:00
genderflag = ( Util . getHEXval ( TB_PID . Text ) & 0xFF ) < = gt ? 1 : 0 ;
2014-12-13 22:48:34 +00:00
2015-09-25 02:54:50 +00:00
int Gender = genderflag ;
Label_Gender . Text = gendersymbols [ Gender ] ;
2015-12-02 07:08:16 +00:00
Label_Gender . ForeColor = Gender = = 2 ? Label_Species . ForeColor : ( Gender = = 1 ? Color . Red : Color . Blue ) ;
2015-09-25 02:54:50 +00:00
setAbilityList ( TB_AbilityNumber , Species , CB_Ability , CB_Form ) ;
2014-12-13 22:48:34 +00:00
updateForm ( null , null ) ;
// If species changes and no nickname, set the new name == speciesName.
if ( ! CHK_Nicknamed . Checked )
updateNickname ( sender , e ) ;
2016-02-17 15:54:59 +00:00
updateValidMoves ( ) ;
2014-12-13 22:48:34 +00:00
}
private void updateOriginGame ( object sender , EventArgs e )
{
2015-09-25 02:54:50 +00:00
int Version = Util . getIndex ( CB_GameOrigin ) ;
2014-12-13 22:48:34 +00:00
2015-09-25 02:54:50 +00:00
if ( Version < 24 & & origintrack ! = "Past" )
2014-06-28 21:22:05 +00:00
{
2014-12-24 07:29:57 +00:00
// Load Past Gen Locations
#region B2W2 Met Locations
2014-12-13 22:48:34 +00:00
{
2014-12-14 18:31:53 +00:00
// Build up our met list
2015-03-11 01:44:51 +00:00
var met_list = Util . getCBList ( metBW2_00000 , new [ ] { 0 } ) ;
met_list = Util . getOffsetCBList ( met_list , metBW2_60000 , 60001 , new [ ] { 60002 } ) ;
met_list = Util . getOffsetCBList ( met_list , metBW2_30000 , 30001 , new [ ] { 30003 } ) ;
2014-12-14 18:31:53 +00:00
met_list = Util . getOffsetCBList ( met_list , metBW2_00000 , 00000 , Legal . Met_BW2_0 ) ;
met_list = Util . getOffsetCBList ( met_list , metBW2_30000 , 30001 , Legal . Met_BW2_3 ) ;
met_list = Util . getOffsetCBList ( met_list , metBW2_40000 , 40001 , Legal . Met_BW2_4 ) ;
met_list = Util . getOffsetCBList ( met_list , metBW2_60000 , 60001 , Legal . Met_BW2_6 ) ;
2014-12-13 22:48:34 +00:00
CB_MetLocation . DisplayMember = "Text" ;
CB_MetLocation . ValueMember = "Value" ;
2015-01-31 18:36:06 +00:00
CB_MetLocation . DataSource = met_list ;
2014-12-13 22:48:34 +00:00
CB_EggLocation . DisplayMember = "Text" ;
CB_EggLocation . ValueMember = "Value" ;
2015-01-31 18:36:06 +00:00
CB_EggLocation . DataSource = new BindingSource ( met_list , null ) ;
2014-12-13 22:48:34 +00:00
CB_EggLocation . SelectedValue = 0 ;
2015-09-25 02:54:50 +00:00
CB_MetLocation . SelectedValue = Version < 20 ? 30001 : 60001 ;
2014-12-14 18:31:53 +00:00
origintrack = "Past" ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
#endregion
2014-06-28 21:22:05 +00:00
}
2015-09-25 02:54:50 +00:00
else if ( Version > 23 & & ( origintrack ! = "XY" ) )
2014-06-28 21:22:05 +00:00
{
2014-12-24 07:29:57 +00:00
// Load X/Y/OR/AS locations
#region ORAS Met Locations
2014-12-13 22:48:34 +00:00
{
2014-12-14 18:31:53 +00:00
// Build up our met list
2015-03-11 01:44:51 +00:00
var met_list = Util . getCBList ( metXY_00000 , new [ ] { 0 } ) ;
met_list = Util . getOffsetCBList ( met_list , metXY_60000 , 60001 , new [ ] { 60002 } ) ;
met_list = Util . getOffsetCBList ( met_list , metXY_30000 , 30001 , new [ ] { 30002 } ) ;
2014-12-14 18:31:53 +00:00
met_list = Util . getOffsetCBList ( met_list , metXY_00000 , 00000 , Legal . Met_XY_0 ) ;
met_list = Util . getOffsetCBList ( met_list , metXY_30000 , 30001 , Legal . Met_XY_3 ) ;
met_list = Util . getOffsetCBList ( met_list , metXY_40000 , 40001 , Legal . Met_XY_4 ) ;
met_list = Util . getOffsetCBList ( met_list , metXY_60000 , 60001 , Legal . Met_XY_6 ) ;
2014-12-13 22:48:34 +00:00
CB_MetLocation . DisplayMember = "Text" ;
CB_MetLocation . ValueMember = "Value" ;
2015-01-31 18:36:06 +00:00
CB_MetLocation . DataSource = met_list ;
2014-12-13 22:48:34 +00:00
CB_EggLocation . DisplayMember = "Text" ;
CB_EggLocation . ValueMember = "Value" ;
2015-01-31 18:36:06 +00:00
CB_EggLocation . DataSource = new BindingSource ( met_list , null ) ;
2014-12-13 22:48:34 +00:00
CB_EggLocation . SelectedValue = 0 ;
CB_MetLocation . SelectedValue = 0 ;
2014-12-14 18:31:53 +00:00
origintrack = "XY" ;
2014-12-13 22:48:34 +00:00
}
#endregion
}
2015-09-25 02:54:50 +00:00
if ( Version < 0x10 & & origintrack ! = "Gen4" )
2014-12-24 07:29:57 +00:00
{
// Load Gen 4 egg locations if Gen 4 Origin.
2014-12-13 22:48:34 +00:00
#region HGSS Met Locations
2015-03-11 01:44:51 +00:00
var met_list = Util . getCBList ( metHGSS_00000 , new [ ] { 0 } ) ;
met_list = Util . getOffsetCBList ( met_list , metHGSS_02000 , 2000 , new [ ] { 2000 } ) ;
met_list = Util . getOffsetCBList ( met_list , metHGSS_02000 , 2000 , new [ ] { 2002 } ) ;
met_list = Util . getOffsetCBList ( met_list , metHGSS_03000 , 3000 , new [ ] { 3001 } ) ;
2014-12-14 18:31:53 +00:00
met_list = Util . getOffsetCBList ( met_list , metHGSS_00000 , 0000 , Legal . Met_HGSS_0 ) ;
met_list = Util . getOffsetCBList ( met_list , metHGSS_02000 , 2000 , Legal . Met_HGSS_2 ) ;
met_list = Util . getOffsetCBList ( met_list , metHGSS_03000 , 3000 , Legal . Met_HGSS_3 ) ;
2014-12-13 22:48:34 +00:00
CB_EggLocation . DisplayMember = "Text" ;
CB_EggLocation . ValueMember = "Value" ;
2015-01-31 18:36:06 +00:00
CB_EggLocation . DataSource = met_list ;
2014-12-13 22:48:34 +00:00
CB_EggLocation . SelectedValue = 0 ;
2014-12-14 18:31:53 +00:00
origintrack = "Gen4" ;
2014-12-13 22:48:34 +00:00
#endregion
2014-06-28 21:22:05 +00:00
}
2014-12-17 02:56:08 +00:00
2014-12-24 07:29:57 +00:00
// Visibility logic for Gen 4 encounter type; only show for Gen 4 Pokemon.
2015-09-25 02:54:50 +00:00
CB_EncounterType . Visible = Label_EncounterType . Visible = ! ( Version > 12 | | Version < 7 ) ;
2014-12-24 07:29:57 +00:00
// If not Gen 4, set Encounter Type to 0 after it set !visible.
2015-09-25 02:54:50 +00:00
if ( Version > 12 | | Version < 7 )
2014-12-17 02:56:08 +00:00
CB_EncounterType . SelectedValue = 0 ;
2014-12-24 07:29:57 +00:00
setMarkings ( ) ; // Set/Remove KB marking
2016-02-26 00:19:59 +00:00
pk6 . Met_Location = Util . getIndex ( CB_MetLocation ) ;
pk6 . Egg_Location = Util . getIndex ( CB_EggLocation ) ;
2016-02-17 15:54:59 +00:00
updateValidMoves ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
private void updateExtraByteValue ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
// Changed Extra Byte's Value
2016-01-03 04:22:53 +00:00
if ( Util . ToInt32 ( ( sender as MaskedTextBox ) . Text ) > byte . MaxValue )
2014-12-13 22:48:34 +00:00
( sender as MaskedTextBox ) . Text = "255" ;
int value = Util . ToInt32 ( TB_ExtraByte . Text ) ;
int offset = Convert . ToInt32 ( CB_ExtraBytes . Text , 16 ) ;
2015-09-24 03:29:31 +00:00
pk6 . Data [ offset ] = ( byte ) value ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
private void updateExtraByteIndex ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
// Byte changed, need to refresh the Text box for the byte's value.
2015-09-24 03:29:31 +00:00
TB_ExtraByte . Text = pk6 . Data [ Convert . ToInt32 ( CB_ExtraBytes . Text , 16 ) ] . ToString ( ) ;
2014-06-28 21:22:05 +00:00
}
2015-09-21 03:34:09 +00:00
private void updateNatureModification ( object sender , EventArgs e )
{
2016-01-31 07:03:43 +00:00
if ( sender ! = CB_Nature ) return ;
2015-09-21 03:34:09 +00:00
int nature = Util . getIndex ( CB_Nature ) ;
int incr = nature / 5 ;
int decr = nature % 5 ;
Label [ ] labarray = { Label_ATK , Label_DEF , Label_SPE , Label_SPA , Label_SPD } ;
// Reset Label Colors
foreach ( Label label in labarray )
label . ForeColor = defaultControlText ;
// Set Colored StatLabels only if Nature isn't Neutral
NatureTip . SetToolTip ( CB_Nature ,
incr ! = decr
2016-01-17 21:27:24 +00:00
? $"+{labarray[incr].Text} / -{labarray[decr].Text}" . Replace ( ":" , "" )
2015-09-21 03:34:09 +00:00
: "-/-" ) ;
}
2014-12-13 22:48:34 +00:00
private void updateNickname ( object sender , EventArgs e )
2014-08-15 22:28:33 +00:00
{
2016-01-15 05:05:05 +00:00
if ( fieldsInitialized & & ModifierKeys = = Keys . Control & & sender ! = null ) // Import Showdown
2015-12-10 03:44:43 +00:00
{
2016-01-03 04:22:53 +00:00
clickShowdownImportPK6 ( sender , e ) ;
2015-12-10 03:44:43 +00:00
return ;
}
2016-01-15 05:05:05 +00:00
if ( fieldsInitialized & & ModifierKeys = = Keys . Alt & & sender ! = null ) // Export Showdown
2015-12-10 03:44:43 +00:00
{
2016-01-03 04:22:53 +00:00
clickShowdownExportPK6 ( sender , e ) ;
2015-12-10 03:44:43 +00:00
return ;
}
2016-01-18 01:07:19 +00:00
if ( ! fieldsInitialized | | CHK_Nicknamed . Checked ) return ;
2015-03-11 01:44:51 +00:00
// Fetch Current Species and set it as Nickname Text
int species = Util . getIndex ( CB_Species ) ;
if ( species = = 0 | | species > 721 )
TB_Nickname . Text = "" ;
else
2014-08-15 22:28:33 +00:00
{
2015-03-11 01:44:51 +00:00
// get language
int lang = Util . getIndex ( CB_Language ) ;
if ( CHK_IsEgg . Checked ) species = 0 ; // Set species to 0 to get the egg name.
2015-12-02 07:08:16 +00:00
TB_Nickname . Text = PKX . getSpeciesName ( CHK_IsEgg . Checked ? 0 : species , lang ) ;
2014-08-15 22:28:33 +00:00
}
}
2014-12-13 22:48:34 +00:00
private void updateNicknameClick ( object sender , MouseEventArgs e )
2014-08-15 22:28:33 +00:00
{
2016-01-05 06:42:38 +00:00
TextBox tb = ! ( sender is TextBox ) ? TB_Nickname : sender as TextBox ;
2014-12-13 22:48:34 +00:00
// Special Character Form
2016-01-31 07:03:43 +00:00
if ( ModifierKeys ! = Keys . Control )
return ;
if ( Application . OpenForms . Cast < Form > ( ) . Any ( form = > form . Name = = typeof ( f2_Text ) . Name ) )
{ Util . Alert ( "Window is already open." ) ; return ; }
new f2_Text ( tb ) . Show ( ) ;
2014-08-15 22:28:33 +00:00
}
2014-12-13 22:48:34 +00:00
private void updateNotOT ( object sender , EventArgs e )
2014-08-31 20:32:04 +00:00
{
2016-02-03 04:05:46 +00:00
if ( string . IsNullOrWhiteSpace ( TB_OTt2 . Text ) )
2014-08-31 20:32:04 +00:00
{
2015-02-07 20:22:09 +00:00
clickGT ( GB_OT , null ) ; // Switch CT over to OT.
2014-12-13 22:48:34 +00:00
Label_CTGender . Text = "" ;
2015-09-24 03:29:31 +00:00
TB_Friendship . Text = pk6 . OT_Friendship . ToString ( ) ;
2014-08-31 20:32:04 +00:00
}
2016-02-03 04:05:46 +00:00
else if ( string . IsNullOrWhiteSpace ( Label_CTGender . Text ) )
2014-12-13 22:48:34 +00:00
Label_CTGender . Text = gendersymbols [ 0 ] ;
2014-08-31 20:32:04 +00:00
}
2014-12-13 22:48:34 +00:00
private void updateIsEgg ( object sender , EventArgs e )
{
if ( CHK_IsEgg . Checked )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
CHK_Nicknamed . Checked = false ;
TB_Friendship . Text = "1" ;
2014-12-12 05:44:05 +00:00
2014-12-13 22:48:34 +00:00
// If we are an egg, it won't have a met location.
CHK_AsEgg . Checked = true ;
GB_EggConditions . Enabled = true ;
CAL_MetDate . Value = new DateTime ( 2000 , 01 , 01 ) ;
CB_MetLocation . SelectedIndex = 2 ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
else // Not Egg
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
if ( ! CHK_Nicknamed . Checked )
updateNickname ( null , null ) ;
TB_Friendship . Text = PKX . getBaseFriendship ( Util . getIndex ( CB_Species ) ) . ToString ( ) ;
2015-01-01 19:38:37 +00:00
2014-12-13 22:48:34 +00:00
if ( CB_EggLocation . SelectedIndex = = 0 )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
CAL_EggDate . Value = new DateTime ( 2000 , 01 , 01 ) ;
CHK_AsEgg . Checked = false ;
GB_EggConditions . Enabled = false ;
2014-06-28 21:22:05 +00:00
}
}
2014-12-13 22:48:34 +00:00
// Display hatch counter if it is an egg, Display Friendship if it is not.
Label_HatchCounter . Visible = CHK_IsEgg . Checked ;
Label_Friendship . Visible = ! CHK_IsEgg . Checked ;
2014-12-20 19:27:29 +00:00
// Update image to (not) show egg.
2015-11-06 06:59:55 +00:00
if ( ! fieldsInitialized ) return ;
2015-03-11 01:44:51 +00:00
updateNickname ( null , null ) ;
getQuickFiller ( dragout ) ;
2014-12-13 22:48:34 +00:00
}
private void updateMetAsEgg ( object sender , EventArgs e )
{
GB_EggConditions . Enabled = CHK_AsEgg . Checked ;
2015-03-11 01:44:51 +00:00
if ( CHK_AsEgg . Checked ) return ;
// Remove egg met data
CHK_IsEgg . Checked = false ;
CAL_EggDate . Value = new DateTime ( 2000 , 01 , 01 ) ;
CB_EggLocation . SelectedValue = 0 ;
2016-02-17 15:54:59 +00:00
updateValidMoves ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-13 22:48:34 +00:00
private void updateShinyPID ( object sender , EventArgs e )
2014-11-15 05:08:00 +00:00
{
2016-01-09 20:39:18 +00:00
uint PID = Util . getHEXval ( TB_PID . Text ) ;
2016-01-05 06:42:38 +00:00
uint UID = PID > > 16 ;
uint LID = PID & 0xFFFF ;
2014-12-13 22:48:34 +00:00
uint PSV = UID ^ LID ;
2016-01-09 20:39:18 +00:00
uint TID = Util . ToUInt32 ( TB_TID . Text ) ;
uint SID = Util . ToUInt32 ( TB_SID . Text ) ;
2014-12-13 22:48:34 +00:00
uint TSV = TID ^ SID ;
uint XOR = TSV ^ PSV ;
2014-11-15 05:08:00 +00:00
2014-12-13 22:48:34 +00:00
// Preserve Gen5 Origin Ability bit just in case
XOR & = 0xFFFE ; XOR | = UID & 1 ;
2014-11-15 05:08:00 +00:00
2014-12-13 22:48:34 +00:00
// New XOR should be 0 or 1.
if ( XOR > 16 )
TB_PID . Text = ( ( ( UID ^ XOR ) < < 16 ) + LID ) . ToString ( "X8" ) ;
setIsShiny ( ) ;
2014-12-14 20:15:53 +00:00
getQuickFiller ( dragout ) ;
2014-11-15 05:08:00 +00:00
}
2015-09-21 03:34:09 +00:00
private void updateTSV ( object sender , EventArgs e )
{
2015-09-25 02:54:50 +00:00
ushort TID = ( ushort ) Util . ToUInt32 ( TB_TID . Text ) ;
ushort SID = ( ushort ) Util . ToUInt32 ( TB_SID . Text ) ;
2016-02-01 07:15:54 +00:00
uint TSV = PKX . getTSV ( TID , SID ) ;
2015-09-25 02:54:50 +00:00
Tip1 . SetToolTip ( TB_TID , "TSV: " + TSV . ToString ( "0000" ) ) ;
Tip2 . SetToolTip ( TB_SID , "TSV: " + TSV . ToString ( "0000" ) ) ;
2015-09-21 03:34:09 +00:00
2016-02-01 07:15:54 +00:00
uint PSV = PKX . getPSV ( Util . getHEXval ( TB_PID . Text ) ) ;
2015-09-25 02:54:50 +00:00
Tip3 . SetToolTip ( TB_PID , "PSV: " + PSV . ToString ( "0000" ) ) ;
2015-09-21 03:34:09 +00:00
}
2014-12-13 22:48:34 +00:00
private void update_ID ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2014-12-13 22:48:34 +00:00
// Trim out nonhex characters
2016-01-09 20:39:18 +00:00
TB_PID . Text = Util . getHEXval ( TB_PID . Text ) . ToString ( "X8" ) ;
TB_EC . Text = Util . getHEXval ( TB_EC . Text ) . ToString ( "X8" ) ;
2014-12-13 22:48:34 +00:00
2015-02-26 04:19:43 +00:00
// Max TID/SID is 65535
2016-01-03 04:22:53 +00:00
if ( Util . ToUInt32 ( TB_TID . Text ) > ushort . MaxValue ) TB_TID . Text = "65535" ;
if ( Util . ToUInt32 ( TB_SID . Text ) > ushort . MaxValue ) TB_SID . Text = "65535" ;
2015-01-01 19:38:37 +00:00
2014-12-13 22:48:34 +00:00
setIsShiny ( ) ;
2015-02-28 05:51:19 +00:00
getQuickFiller ( dragout ) ;
2014-12-13 22:48:34 +00:00
updateIVs ( null , null ) ; // If the PID is changed, PID%6 (Characteristic) might be changed.
TB_PID . Select ( 60 , 0 ) ; // position cursor at end of field
}
2016-01-03 04:22:53 +00:00
private void validateComboBox ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
2016-02-01 07:15:54 +00:00
if ( ! ( sender is ComboBox ) )
return ;
2014-12-13 22:48:34 +00:00
2016-02-01 07:15:54 +00:00
ComboBox cb = ( ComboBox ) sender ;
2014-12-13 22:48:34 +00:00
cb . SelectionLength = 0 ;
2015-03-11 01:44:51 +00:00
cb . BackColor = cb . SelectedValue = = null ? Color . DarkSalmon : defaultControlWhite ;
2014-12-14 20:15:53 +00:00
2015-11-06 06:59:55 +00:00
if ( fieldsInitialized )
2016-02-01 07:15:54 +00:00
getQuickFiller ( dragout ) ;
2014-12-13 22:48:34 +00:00
}
private void validateComboBox2 ( object sender , EventArgs e )
{
2016-01-03 04:22:53 +00:00
validateComboBox ( sender , e ) ;
2016-02-17 15:54:59 +00:00
if ( sender = = CB_Ability )
2014-12-13 22:48:34 +00:00
TB_AbilityNumber . Text = ( 1 < < CB_Ability . SelectedIndex ) . ToString ( ) ;
2015-09-21 03:34:09 +00:00
updateNatureModification ( sender , null ) ;
2014-12-13 22:48:34 +00:00
updateIVs ( null , null ) ; // updating Nature will trigger stats to update as well
}
2016-02-17 15:54:59 +00:00
private void validateMove ( object sender , EventArgs e )
{
2016-02-24 03:19:25 +00:00
if ( ! fieldsLoaded )
return ;
2016-02-17 15:54:59 +00:00
2016-02-24 03:19:25 +00:00
validateComboBox ( sender , e ) ;
2016-02-23 06:52:48 +00:00
int [ ] relearnMoves =
{
Util . getIndex ( CB_RelearnMove1 ) , Util . getIndex ( CB_RelearnMove2 ) ,
Util . getIndex ( CB_RelearnMove3 ) , Util . getIndex ( CB_RelearnMove4 )
} ;
2016-02-24 03:19:25 +00:00
if ( new [ ] { CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 } . Contains ( sender ) ) // Move
2016-02-17 15:54:59 +00:00
{
updatePP ( sender , e ) ;
2016-02-24 03:19:25 +00:00
int [ ] moves =
{
Util . getIndex ( CB_Move1 ) , Util . getIndex ( CB_Move2 ) ,
Util . getIndex ( CB_Move3 ) , Util . getIndex ( CB_Move4 )
} ;
2016-02-23 06:52:48 +00:00
PictureBox [ ] moveCB = { PB_WarnMove1 , PB_WarnMove2 , PB_WarnMove3 , PB_WarnMove4 } ;
2016-02-24 03:19:25 +00:00
bool [ ] legal = Legality . getMoveValidity ( moves , relearnMoves ) ;
2016-02-23 06:52:48 +00:00
for ( int i = 0 ; i < 4 ; i + + )
2016-02-24 03:19:25 +00:00
moveCB [ i ] . Visible = ! legal [ i ] ;
2016-02-17 15:54:59 +00:00
}
else
{
2016-02-24 03:19:25 +00:00
PictureBox [ ] moveCB = { PB_WarnRelearn1 , PB_WarnRelearn2 , PB_WarnRelearn3 , PB_WarnRelearn4 } ;
bool [ ] legal = Legality . getRelearnValidity ( relearnMoves ) ;
for ( int i = 0 ; i < 4 ; i + + )
moveCB [ i ] . Visible = ! legal [ i ] ;
// Refresh move states
2016-02-17 15:54:59 +00:00
foreach ( ComboBox c in new [ ] { CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 } )
validateMove ( c , e ) ;
}
}
2014-12-13 22:48:34 +00:00
private void removedropCB ( object sender , KeyEventArgs e )
{
( ( ComboBox ) sender ) . DroppedDown = false ;
}
2016-02-17 15:54:59 +00:00
private void updateValidMoves ( )
{
if ( ! fieldsLoaded )
return ;
2016-02-23 06:52:48 +00:00
Legality = new LegalityAnalysis ( pk6 ) ;
2016-02-17 15:54:59 +00:00
// refresh
foreach ( ComboBox cb in new [ ] { CB_RelearnMove1 , CB_RelearnMove2 , CB_RelearnMove3 , CB_RelearnMove4 } )
validateMove ( cb , null ) ;
}
2014-12-13 22:48:34 +00:00
private void updateStats ( )
{
// Gather the needed information.
2015-09-25 02:54:50 +00:00
int species = Util . getIndex ( CB_Species ) ;
2016-01-18 01:07:19 +00:00
int level = Util . ToInt32 ( MT_Level . Enabled ? MT_Level . Text : TB_Level . Text ) ;
2016-02-01 07:15:54 +00:00
if ( level = = 0 ) level = 1 ;
2015-09-25 02:54:50 +00:00
int form = CB_Form . SelectedIndex ;
int HP_IV = Util . ToInt32 ( TB_HPIV . Text ) ;
int ATK_IV = Util . ToInt32 ( TB_ATKIV . Text ) ;
int DEF_IV = Util . ToInt32 ( TB_DEFIV . Text ) ;
int SPA_IV = Util . ToInt32 ( TB_SPAIV . Text ) ;
int SPD_IV = Util . ToInt32 ( TB_SPDIV . Text ) ;
int SPE_IV = Util . ToInt32 ( TB_SPEIV . Text ) ;
int HP_EV = Util . ToInt32 ( TB_HPEV . Text ) ;
int ATK_EV = Util . ToInt32 ( TB_ATKEV . Text ) ;
int DEF_EV = Util . ToInt32 ( TB_DEFEV . Text ) ;
int SPA_EV = Util . ToInt32 ( TB_SPAEV . Text ) ;
int SPD_EV = Util . ToInt32 ( TB_SPDEV . Text ) ;
int SPE_EV = Util . ToInt32 ( TB_SPEEV . Text ) ;
2014-06-28 21:22:05 +00:00
2015-09-25 02:54:50 +00:00
int nature = Util . getIndex ( CB_Nature ) ;
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// Generate the stats.
2015-09-25 02:54:50 +00:00
ushort [ ] stats = PKX . getStats ( species , level , nature , form ,
HP_EV , ATK_EV , DEF_EV , SPA_EV , SPD_EV , SPE_EV ,
HP_IV , ATK_IV , DEF_IV , SPA_IV , SPD_IV , SPE_IV ) ;
2014-06-28 21:22:05 +00:00
2015-09-25 02:54:50 +00:00
Stat_HP . Text = stats [ 0 ] . ToString ( ) ;
Stat_ATK . Text = stats [ 1 ] . ToString ( ) ;
Stat_DEF . Text = stats [ 2 ] . ToString ( ) ;
Stat_SPA . Text = stats [ 4 ] . ToString ( ) ;
Stat_SPD . Text = stats [ 5 ] . ToString ( ) ;
Stat_SPE . Text = stats [ 3 ] . ToString ( ) ;
2014-06-28 21:22:05 +00:00
2014-12-13 22:48:34 +00:00
// Recolor the Stat Labels based on boosted stats.
{
2015-09-25 02:54:50 +00:00
int incr = nature / 5 ;
int decr = nature % 5 ;
2014-06-28 21:22:05 +00:00
2015-03-11 01:44:51 +00:00
Label [ ] labarray = { Label_ATK , Label_DEF , Label_SPE , Label_SPA , Label_SPD } ;
2014-12-13 22:48:34 +00:00
// Reset Label Colors
foreach ( Label label in labarray )
2014-12-20 04:22:15 +00:00
label . ForeColor = defaultControlText ;
2014-11-19 06:35:39 +00:00
2014-12-13 22:48:34 +00:00
// Set Colored StatLabels only if Nature isn't Neutral
2015-03-11 01:44:51 +00:00
if ( incr = = decr ) return ;
labarray [ incr ] . ForeColor = Color . Red ;
labarray [ decr ] . ForeColor = Color . Blue ;
2014-12-13 22:48:34 +00:00
}
2014-11-19 06:35:39 +00:00
}
2016-01-30 01:27:20 +00:00
private void updateUnicode ( )
{
if ( ! unicode )
{
gendersymbols = new [ ] { "M" , "F" , "-" } ;
BTN_Shinytize . Text = "*" ;
TB_Nickname . Font = TB_OT . Font = TB_OTt2 . Font = Label_TID . Font ;
}
else
{
gendersymbols = new [ ] { "♂" , "♀" , "-" } ;
BTN_Shinytize . Text = "☆" ;
TB_Nickname . Font = TB_OT . Font = TB_OTt2 . Font = PKX . getPKXFont ( 11 ) ;
}
// Switch active gender labels to new if they are active.
if ( PKX . getGender ( Label_Gender . Text ) < 2 )
Label_Gender . Text = gendersymbols [ PKX . getGender ( Label_Gender . Text ) ] ;
if ( PKX . getGender ( Label_OTGender . Text ) < 2 )
Label_OTGender . Text = gendersymbols [ PKX . getGender ( Label_OTGender . Text ) ] ;
if ( PKX . getGender ( Label_CTGender . Text ) < 2 )
Label_CTGender . Text = gendersymbols [ PKX . getGender ( Label_CTGender . Text ) ] ;
}
2014-06-28 21:22:05 +00:00
// Secondary Windows for Ribbons/Amie/Memories
2014-12-24 07:29:57 +00:00
private void openRibbons ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2015-09-21 03:34:09 +00:00
new RibbMedal ( ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-24 07:29:57 +00:00
private void openHistory ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2015-09-29 04:11:03 +00:00
// Write back current values
pk6 . Version = Util . getIndex ( CB_GameOrigin ) ;
pk6 . HT_Name = TB_OTt2 . Text ;
pk6 . OT_Name = TB_OT . Text ;
pk6 . IsEgg = CHK_IsEgg . Checked ;
2015-09-25 02:54:50 +00:00
if ( pk6 . CurrentHandler = = 0 )
pk6 . OT_Friendship = Util . ToInt32 ( TB_Friendship . Text ) ;
else // 1
pk6 . HT_Friendship = Util . ToInt32 ( TB_Friendship . Text ) ;
2015-09-29 04:11:03 +00:00
new MemoryAmie ( ) . ShowDialog ( ) ;
2015-09-25 02:54:50 +00:00
TB_Friendship . Text = ( pk6 . CurrentHandler = = 0 ? pk6 . OT_Friendship : pk6 . HT_Friendship ) . ToString ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-22 04:07:04 +00:00
// Open/Save Array Manipulation //
2015-11-15 03:41:39 +00:00
public bool verifiedPKX ( )
2014-06-28 21:22:05 +00:00
{
2014-11-29 19:07:01 +00:00
if ( ModifierKeys = = ( Keys . Control | Keys . Shift | Keys . Alt ) )
2014-11-15 05:08:00 +00:00
return true ; // Override
2014-06-28 21:22:05 +00:00
// Make sure the PKX Fields are filled out properly (color check)
2014-12-24 07:29:57 +00:00
#region ComboBoxes to verify they are set .
2014-06-28 21:22:05 +00:00
ComboBox [ ] cba = {
2014-12-13 22:48:34 +00:00
CB_Species , CB_Nature , CB_HeldItem , CB_Ability , // Main Tab
2014-06-28 21:22:05 +00:00
CB_MetLocation , CB_EggLocation , CB_Ball , // Met Tab
CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 , // Moves
2014-07-16 19:16:16 +00:00
CB_RelearnMove1 , CB_RelearnMove2 , CB_RelearnMove3 , CB_RelearnMove4 // Moves
2014-06-28 21:22:05 +00:00
} ;
for ( int i = 0 ; i < cba . Length ; i + + )
{
2014-11-28 04:47:50 +00:00
int back = cba [ i ] . BackColor . ToArgb ( ) ;
2015-03-11 01:44:51 +00:00
if ( 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 ;
2014-06-28 21:22:05 +00:00
}
2014-07-16 19:16:16 +00:00
#endregion
2014-07-12 01:39:24 +00:00
// Further logic checking
2014-08-15 04:27:53 +00:00
if ( Convert . ToUInt32 ( TB_EVTotal . Text ) > 510 & & ! CHK_HackedStats . Checked )
2014-12-06 02:14:04 +00:00
{ tabMain . SelectedIndex = 2 ; goto invalid ; }
2014-07-16 19:16:16 +00:00
// If no errors detected...
2015-03-14 02:59:51 +00:00
if ( Util . getIndex ( CB_Species ) ! = 0 ) return true ;
// Else
tabMain . SelectedIndex = 0 ;
// else...
2015-01-01 19:38:37 +00:00
invalid :
2016-01-03 18:47:44 +00:00
{ SystemSounds . Exclamation . Play ( ) ; return false ; }
2014-06-28 21:22:05 +00:00
}
2016-01-24 18:19:30 +00:00
public PK6 preparepkx ( bool click = true )
2014-06-28 21:22:05 +00:00
{
2014-12-14 20:15:53 +00:00
if ( click )
tabMain . Select ( ) ; // hack to make sure comboboxes are set (users scrolling through and immediately setting causes this)
2015-09-28 02:56:17 +00:00
2015-10-24 03:13:32 +00:00
// Repopulate PK6 with Edited Stuff
2014-10-10 02:59:57 +00:00
if ( Util . getIndex ( CB_GameOrigin ) < 24 )
2014-08-03 05:15:47 +00:00
{
2016-01-09 20:39:18 +00:00
uint EC = Util . getHEXval ( TB_EC . Text ) ;
uint PID = Util . getHEXval ( TB_PID . Text ) ;
2014-10-10 02:59:57 +00:00
uint SID = Util . ToUInt32 ( TB_TID . Text ) ;
uint TID = Util . ToUInt32 ( TB_TID . Text ) ;
2014-08-03 05:15:47 +00:00
uint LID = PID & 0xFFFF ;
uint HID = PID > > 16 ;
2016-01-05 06:42:38 +00:00
uint XOR = TID ^ LID ^ SID ^ HID ;
2014-08-03 05:15:47 +00:00
// Ensure we don't have a shiny.
2014-12-30 05:43:38 +00:00
if ( XOR > > 3 = = 1 ) // Illegal, fix. (not 16<XOR>=8)
2014-08-03 05:15:47 +00:00
{
// Keep as shiny, so we have to mod the PID
2014-12-30 05:43:38 +00:00
PID ^ = XOR ;
2014-08-03 05:15:47 +00:00
TB_PID . Text = PID . ToString ( "X8" ) ;
TB_EC . Text = PID . ToString ( "X8" ) ;
}
2014-12-30 05:43:38 +00:00
else if ( ( XOR ^ 0x8000 ) > > 3 = = 1 & & PID ! = EC )
2014-08-03 05:15:47 +00:00
TB_EC . Text = ( PID ^ 0x80000000 ) . ToString ( "X8" ) ;
else // Not Illegal, no fix.
TB_EC . Text = PID . ToString ( "X8" ) ;
}
2014-06-28 21:22:05 +00:00
2016-01-09 20:39:18 +00:00
pk6 . EncryptionConstant = Util . getHEXval ( TB_EC . Text ) ;
2015-09-24 03:29:31 +00:00
pk6 . Checksum = 0 ; // 0 CHK for now
2014-06-28 21:22:05 +00:00
// Block A
2015-09-24 03:29:31 +00:00
pk6 . Species = Util . getIndex ( CB_Species ) ;
pk6 . HeldItem = Util . getIndex ( CB_HeldItem ) ;
pk6 . TID = Util . ToInt32 ( TB_TID . Text ) ;
pk6 . SID = Util . ToInt32 ( TB_SID . Text ) ;
pk6 . EXP = Util . ToUInt32 ( TB_EXP . Text ) ;
2016-01-03 04:22:53 +00:00
pk6 . Ability = ( byte ) Array . IndexOf ( abilitylist , CB_Ability . Text . Remove ( CB_Ability . Text . Length - 4 ) ) ;
2015-09-24 03:29:31 +00:00
pk6 . AbilityNumber = Util . ToInt32 ( TB_AbilityNumber . Text ) ; // Number
2014-08-17 01:42:51 +00:00
// pkx[0x16], pkx[0x17] are handled by the Medals UI (Hits & Training Bag)
2016-01-09 20:39:18 +00:00
pk6 . PID = Util . getHEXval ( TB_PID . Text ) ;
2016-01-05 06:42:38 +00:00
pk6 . Nature = ( byte ) Util . getIndex ( CB_Nature ) ;
2015-09-24 03:29:31 +00:00
pk6 . FatefulEncounter = CHK_Fateful . Checked ;
pk6 . Gender = PKX . getGender ( Label_Gender . Text ) ;
2016-01-22 06:55:20 +00:00
pk6 . AltForm = ( MT_Form . Enabled ? Convert . ToInt32 ( MT_Form . Text ) : CB_Form . SelectedIndex ) & 0x1F ; // Form
2015-09-24 03:29:31 +00:00
pk6 . EV_HP = Util . ToInt32 ( TB_HPEV . Text ) ; // EVs
pk6 . EV_ATK = Util . ToInt32 ( TB_ATKEV . Text ) ;
pk6 . EV_DEF = Util . ToInt32 ( TB_DEFEV . Text ) ;
pk6 . EV_SPE = Util . ToInt32 ( TB_SPEEV . Text ) ;
pk6 . EV_SPA = Util . ToInt32 ( TB_SPAEV . Text ) ;
pk6 . EV_SPD = Util . ToInt32 ( TB_SPDEV . Text ) ;
pk6 . CNT_Cool = Util . ToInt32 ( TB_Cool . Text ) ; // CNT
pk6 . CNT_Beauty = Util . ToInt32 ( TB_Beauty . Text ) ;
pk6 . CNT_Cute = Util . ToInt32 ( TB_Cute . Text ) ;
pk6 . CNT_Smart = Util . ToInt32 ( TB_Smart . Text ) ;
pk6 . CNT_Tough = Util . ToInt32 ( TB_Tough . Text ) ;
pk6 . CNT_Sheen = Util . ToInt32 ( TB_Sheen . Text ) ;
pk6 . Circle = CHK_Circle . Checked ;
pk6 . Triangle = CHK_Triangle . Checked ;
pk6 . Square = CHK_Square . Checked ;
pk6 . Heart = CHK_Heart . Checked ;
pk6 . Star = CHK_Star . Checked ;
pk6 . Diamond = CHK_Diamond . Checked ;
pk6 . PKRS_Days = CB_PKRSDays . SelectedIndex ;
pk6 . PKRS_Strain = CB_PKRSStrain . SelectedIndex ;
2014-06-28 21:22:05 +00:00
// Already in buff (then transferred to new pkx)
// 0x2C, 0x2D, 0x2E, 0x2F
// 0x30, 0x31, 0x32, 0x33
// 0x34, 0x35, 0x36, 0x37
// 0x38, 0x39
// Unused
// 0x3A, 0x3B
// 0x3C, 0x3D, 0x3E, 0x3F
2014-07-26 21:56:06 +00:00
// Block B
2014-06-28 21:22:05 +00:00
// Convert Nickname field back to bytes
2015-09-24 03:29:31 +00:00
pk6 . Nickname = TB_Nickname . Text ;
pk6 . Move1 = Util . getIndex ( CB_Move1 ) ;
pk6 . Move2 = Util . getIndex ( CB_Move2 ) ;
pk6 . Move3 = Util . getIndex ( CB_Move3 ) ;
pk6 . Move4 = Util . getIndex ( CB_Move4 ) ;
2016-01-05 06:42:38 +00:00
pk6 . Move1_PP = Util . getIndex ( CB_Move1 ) > 0 ? Util . ToInt32 ( TB_PP1 . Text ) : 0 ;
pk6 . Move2_PP = Util . getIndex ( CB_Move2 ) > 0 ? Util . ToInt32 ( TB_PP2 . Text ) : 0 ;
pk6 . Move3_PP = Util . getIndex ( CB_Move3 ) > 0 ? Util . ToInt32 ( TB_PP3 . Text ) : 0 ;
pk6 . Move4_PP = Util . getIndex ( CB_Move4 ) > 0 ? Util . ToInt32 ( TB_PP4 . Text ) : 0 ;
pk6 . Move1_PPUps = Util . getIndex ( CB_Move1 ) > 0 ? CB_PPu1 . SelectedIndex : 0 ;
pk6 . Move2_PPUps = Util . getIndex ( CB_Move2 ) > 0 ? CB_PPu2 . SelectedIndex : 0 ;
pk6 . Move3_PPUps = Util . getIndex ( CB_Move3 ) > 0 ? CB_PPu3 . SelectedIndex : 0 ;
pk6 . Move4_PPUps = Util . getIndex ( CB_Move4 ) > 0 ? CB_PPu4 . SelectedIndex : 0 ;
2015-09-24 03:29:31 +00:00
pk6 . RelearnMove1 = Util . getIndex ( CB_RelearnMove1 ) ;
pk6 . RelearnMove2 = Util . getIndex ( CB_RelearnMove2 ) ;
pk6 . RelearnMove3 = Util . getIndex ( CB_RelearnMove3 ) ;
pk6 . RelearnMove4 = Util . getIndex ( CB_RelearnMove4 ) ;
2014-06-28 21:22:05 +00:00
// 0x72 - Ribbon editor sets this flag (Secret Super Training)
// 0x73
2015-09-24 03:29:31 +00:00
pk6 . IV_HP = Util . ToInt32 ( TB_HPIV . Text ) ;
pk6 . IV_ATK = Util . ToInt32 ( TB_ATKIV . Text ) ;
pk6 . IV_DEF = Util . ToInt32 ( TB_DEFIV . Text ) ;
pk6 . IV_SPE = Util . ToInt32 ( TB_SPEIV . Text ) ;
pk6 . IV_SPA = Util . ToInt32 ( TB_SPAIV . Text ) ;
pk6 . IV_SPD = Util . ToInt32 ( TB_SPDIV . Text ) ;
pk6 . IsEgg = CHK_IsEgg . Checked ;
pk6 . IsNicknamed = CHK_Nicknamed . Checked ;
2014-06-28 21:22:05 +00:00
2014-07-26 21:56:06 +00:00
// Block C
2015-03-19 03:45:06 +00:00
// Convert Latest OT field back to bytes
2015-09-24 03:29:31 +00:00
pk6 . HT_Name = TB_OTt2 . Text ;
2014-06-28 21:22:05 +00:00
2015-03-19 03:45:06 +00:00
// 0x90-0xAF
2015-09-24 03:29:31 +00:00
pk6 . HT_Gender = PKX . getGender ( Label_CTGender . Text ) ;
2015-03-19 03:45:06 +00:00
// Plus more, set by MemoryAmie (already in buff)
2014-06-28 21:22:05 +00:00
2014-07-26 21:56:06 +00:00
// Block D
2014-06-28 21:22:05 +00:00
// Convert OT field back to bytes
2015-09-24 03:29:31 +00:00
pk6 . OT_Name = TB_OT . Text ;
2014-06-28 21:22:05 +00:00
2015-10-24 18:57:07 +00:00
pk6 . CurrentFriendship = Util . ToInt32 ( TB_Friendship . Text ) ;
2014-06-28 21:22:05 +00:00
2015-10-24 03:13:32 +00:00
int egg_year = 2000 ; // Default Dates
2014-06-28 21:22:05 +00:00
int egg_month = 0 ;
int egg_day = 0 ;
int egg_location = 0 ;
if ( CHK_AsEgg . Checked ) // If encountered as an egg, load the Egg Met data from fields.
{
egg_year = CAL_EggDate . Value . Year ;
egg_month = CAL_EggDate . Value . Month ;
egg_day = CAL_EggDate . Value . Day ;
2014-10-10 02:59:57 +00:00
egg_location = Util . getIndex ( CB_EggLocation ) ;
2014-06-28 21:22:05 +00:00
}
// Egg Met Data
2015-09-24 03:29:31 +00:00
pk6 . Egg_Year = egg_year - 2000 ;
pk6 . Egg_Month = egg_month ;
pk6 . Egg_Day = egg_day ;
pk6 . Egg_Location = egg_location ;
2014-06-28 21:22:05 +00:00
// Met Data
2015-09-24 03:29:31 +00:00
pk6 . Met_Year = CAL_MetDate . Value . Year - 2000 ;
pk6 . Met_Month = CAL_MetDate . Value . Month ;
pk6 . Met_Day = CAL_MetDate . Value . Day ;
2015-10-24 03:13:32 +00:00
pk6 . Met_Location = Util . getIndex ( CB_MetLocation ) ;
2014-06-28 21:22:05 +00:00
2015-09-24 03:29:31 +00:00
if ( pk6 . IsEgg & & pk6 . Met_Location = = 0 ) // If still an egg, it has no hatch location/date. Zero it!
2016-01-02 05:18:23 +00:00
pk6 . Met_Year = pk6 . Met_Month = pk6 . Met_Day = 0 ;
2014-06-28 21:22:05 +00:00
// 0xD7 Unknown
2015-09-24 03:29:31 +00:00
pk6 . Ball = Util . getIndex ( CB_Ball ) ;
pk6 . Met_Level = Util . ToInt32 ( TB_MetLevel . Text ) ;
pk6 . OT_Gender = PKX . getGender ( Label_OTGender . Text ) ;
2016-01-22 06:40:59 +00:00
pk6 . EncounterType = Util . getIndex ( CB_EncounterType ) ;
2015-09-24 03:29:31 +00:00
pk6 . Version = Util . getIndex ( CB_GameOrigin ) ;
pk6 . Country = Util . getIndex ( CB_Country ) ;
pk6 . Region = Util . getIndex ( CB_SubRegion ) ;
pk6 . ConsoleRegion = Util . getIndex ( CB_3DSReg ) ;
pk6 . Language = Util . getIndex ( CB_Language ) ;
2014-06-28 21:22:05 +00:00
// 0xE4-0xE7
2015-09-28 02:56:17 +00:00
// Toss in Party Stats
2015-10-24 03:13:32 +00:00
Array . Resize ( ref pk6 . Data , PK6 . SIZE_PARTY ) ;
2015-09-28 02:56:17 +00:00
pk6 . Stat_Level = Util . ToInt32 ( TB_Level . Text ) ;
2016-01-03 04:22:53 +00:00
pk6 . Stat_HPCurrent = Util . ToInt32 ( Stat_HP . Text ) ;
pk6 . Stat_HPMax = Util . ToInt32 ( Stat_HP . Text ) ;
pk6 . Stat_ATK = Util . ToInt32 ( Stat_ATK . Text ) ;
pk6 . Stat_DEF = Util . ToInt32 ( Stat_DEF . Text ) ;
pk6 . Stat_SPE = Util . ToInt32 ( Stat_SPE . Text ) ;
pk6 . Stat_SPA = Util . ToInt32 ( Stat_SPA . Text ) ;
pk6 . Stat_SPD = Util . ToInt32 ( Stat_SPD . Text ) ;
2015-09-28 02:56:17 +00:00
// Unneeded Party Stats (Status, Flags, Unused)
pk6 . Data [ 0xE8 ] = pk6 . Data [ 0xE9 ] = pk6 . Data [ 0xEA ] = pk6 . Data [ 0xEB ] =
pk6 . Data [ 0xED ] = pk6 . Data [ 0xEE ] = pk6 . Data [ 0xEF ] =
pk6 . Data [ 0xFE ] = pk6 . Data [ 0xFF ] = pk6 . Data [ 0x100 ] =
pk6 . Data [ 0x101 ] = pk6 . Data [ 0x102 ] = pk6 . Data [ 0x103 ] = 0 ;
2014-06-28 21:22:05 +00:00
2014-08-17 01:42:51 +00:00
// Hax Illegality
2014-12-13 22:48:34 +00:00
if ( HaX )
2014-08-15 04:27:53 +00:00
{
2015-10-24 03:13:32 +00:00
pk6 . Ability = ( byte ) Util . getIndex ( DEV_Ability ) ;
2016-01-03 04:22:53 +00:00
pk6 . Stat_Level = ( byte ) Math . Min ( Convert . ToInt32 ( MT_Level . Text ) , byte . MaxValue ) ;
2014-10-11 07:22:22 +00:00
}
2015-09-28 02:56:17 +00:00
// Fix Moves if a slot is empty
pk6 . FixMoves ( ) ;
pk6 . FixRelearn ( ) ;
2014-10-11 07:22:22 +00:00
2015-09-29 04:11:03 +00:00
// Fix Handler (Memories & OT) -- no foreign memories for Pokemon without a foreign trainer (none for eggs)
2015-12-24 23:38:07 +00:00
if ( Menu_ModifyPK6 . Checked )
pk6 . FixMemories ( ) ;
2014-08-15 04:27:53 +00:00
2014-06-28 21:22:05 +00:00
// PKX is now filled
2016-01-24 18:19:30 +00:00
pk6 . RefreshChecksum ( ) ;
return pk6 ;
2014-06-28 21:22:05 +00:00
}
2014-10-11 07:22:22 +00:00
// Drag & Drop Events
2014-06-28 21:22:05 +00:00
private void tabMain_DragEnter ( object sender , DragEventArgs e )
{
if ( e . Data . GetDataPresent ( DataFormats . FileDrop ) ) e . Effect = DragDropEffects . Copy ;
}
private void tabMain_DragDrop ( object sender , DragEventArgs e )
{
string [ ] files = ( string [ ] ) e . Data . GetData ( DataFormats . FileDrop ) ;
2016-02-01 07:15:54 +00:00
openQuick ( files [ 0 ] ) ;
2014-06-28 21:22:05 +00:00
}
// Decrypted Export
private void dragout_MouseDown ( object sender , MouseEventArgs e )
{
2016-02-01 07:15:54 +00:00
if ( ! verifiedPKX ( ) ) return ;
2014-06-28 21:22:05 +00:00
{
// Create Temp File to Drag
Cursor . Current = Cursors . Hand ;
2014-11-30 18:59:10 +00:00
// Make a new file name
2016-01-24 18:19:30 +00:00
PK6 pkx = preparepkx ( ) ;
2016-01-18 01:07:19 +00:00
string filename = Path . GetFileNameWithoutExtension ( pkx . FileName ) + ( e . Button = = MouseButtons . Right ? ".ek6" : ".pk6" ) ;
2016-02-01 07:15:54 +00:00
byte [ ] dragdata = e . Button = = MouseButtons . Right ? pkx . EncryptedBoxData : pkx . DecryptedBoxData ;
2014-06-28 21:22:05 +00:00
// Make file
2015-11-14 22:19:40 +00:00
string newfile = Path . Combine ( Path . GetTempPath ( ) , Util . CleanFileName ( filename ) ) ;
2014-06-28 21:22:05 +00:00
try
{
2014-07-14 18:44:40 +00:00
File . WriteAllBytes ( newfile , dragdata ) ;
2015-11-14 22:19:40 +00:00
DoDragDrop ( new DataObject ( DataFormats . FileDrop , new [ ] { newfile } ) , DragDropEffects . Move ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-11 06:50:40 +00:00
catch ( Exception x )
{ Util . Error ( "Drag & Drop Error" , x . ToString ( ) ) ; }
2014-07-14 18:44:40 +00:00
File . Delete ( newfile ) ;
2014-06-28 21:22:05 +00:00
}
}
2014-12-14 20:15:53 +00:00
private void dragout_DragOver ( object sender , DragEventArgs e )
2014-06-28 21:22:05 +00:00
{
e . Effect = DragDropEffects . Move ;
}
2014-12-14 20:15:53 +00:00
// Dragout Display
2014-06-28 21:22:05 +00:00
private void dragoutHover ( object sender , EventArgs e )
{
2016-01-05 06:42:38 +00:00
dragout . BackgroundImage = Util . getIndex ( CB_Species ) > 0 ? Properties . Resources . slotSet : Properties . Resources . slotDel ;
2014-06-28 21:22:05 +00:00
}
private void dragoutLeave ( object sender , EventArgs e )
{
2014-12-14 20:15:53 +00:00
dragout . BackgroundImage = Properties . Resources . slotTrans ;
}
private void dragoutDrop ( object sender , DragEventArgs e )
{
openQuick ( ( ( string [ ] ) e . Data . GetData ( DataFormats . FileDrop ) ) [ 0 ] ) ;
2014-06-28 21:22:05 +00:00
}
#endregion
2014-12-22 04:07:04 +00:00
2014-06-28 21:22:05 +00:00
#region //// SAVE FILE FUNCTIONS ////
2014-12-14 19:06:17 +00:00
private void clickVerifyCHK ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2015-10-24 23:33:44 +00:00
if ( SAV . Edited ) { Util . Alert ( "Save has been edited. Cannot integrity check." ) ; return ; }
2014-06-28 21:22:05 +00:00
2016-02-09 23:30:10 +00:00
if ( SAV . ChecksumsValid ) { Util . Alert ( "Checksums are valid." ) ; return ; }
if ( DialogResult . Yes = = Util . Prompt ( MessageBoxButtons . YesNo , "Export Checksum Info to Clipboard?" ) )
Clipboard . SetText ( SAV . ChecksumInfo ) ;
2014-06-28 21:22:05 +00:00
}
2016-01-03 06:31:04 +00:00
private void clickExportSAVBAK ( object sender , EventArgs e )
2015-08-07 05:32:12 +00:00
{
2016-01-03 06:31:04 +00:00
SaveFileDialog sfd = new SaveFileDialog
2016-02-12 05:41:31 +00:00
{ FileName = Util . CleanFileName ( SAV . BAKName ) } ;
2016-01-03 06:31:04 +00:00
if ( sfd . ShowDialog ( ) ! = DialogResult . OK )
return ;
2015-12-18 02:55:59 +00:00
2016-01-03 06:31:04 +00:00
string path = sfd . FileName ;
2016-01-28 04:24:32 +00:00
File . WriteAllBytes ( path , SAV . BAK ) ;
2016-01-03 06:31:04 +00:00
Util . Alert ( "Saved Backup of current SAV to:" , path ) ;
2016-02-12 05:41:31 +00:00
if ( ! Directory . Exists ( BackupPath ) )
if ( DialogResult . Yes = = Util . Prompt ( MessageBoxButtons . YesNo ,
$"PKHeX can perform automatic backups if you create a folder with the name \" { BackupPath } \ " in the same folder as PKHeX's executable." ,
2016-02-12 07:42:42 +00:00
"Would you like to create the backup folder now and save backup of current save?" ) )
2016-02-12 05:41:31 +00:00
try { Directory . CreateDirectory ( BackupPath ) ; Util . Alert ( "Backup folder created!" ,
"If you wish to no longer automatically back up save files, delete the \"{BackupPath}\" folder." ) ; }
catch { Util . Error ( $"Unable to create backup folder @ {BackupPath}" ) ; }
2016-01-03 06:31:04 +00:00
}
private void clickExportSAV ( object sender , EventArgs e )
{
if ( ! Menu_ExportSAV . Enabled )
return ;
2015-12-18 02:55:59 +00:00
2015-09-21 03:34:09 +00:00
// Chunk Error Checking
2015-10-24 23:52:25 +00:00
string err = SAV . checkChunkFF ( ) ;
if ( err . Length > 0 & & Util . Prompt ( MessageBoxButtons . YesNo , err , "Continue saving?" ) ! = DialogResult . Yes )
return ;
2015-03-11 01:44:51 +00:00
2016-02-01 07:15:54 +00:00
SaveFileDialog main = new SaveFileDialog
{
Filter = "Main SAV|*.*" ,
2016-02-11 08:56:10 +00:00
FileName = SAV . FileName ,
2016-02-01 07:15:54 +00:00
RestoreDirectory = true
} ;
2016-02-11 08:56:10 +00:00
if ( Directory . Exists ( SAV . FilePath ) )
main . InitialDirectory = SAV . FilePath ;
2015-03-11 01:44:51 +00:00
2015-09-21 03:34:09 +00:00
// Export
2016-02-01 07:15:54 +00:00
if ( main . ShowDialog ( ) ! = DialogResult . OK ) return ;
2016-02-11 08:56:10 +00:00
if ( SAV . Box > - 1 )
SAV . CurrentBox = CB_BoxSelect . SelectedIndex ;
File . WriteAllBytes ( main . FileName , SAV . Write ( ) ) ;
Util . Alert ( "SAV exported to:" , main . FileName ) ;
2014-06-28 21:22:05 +00:00
}
2016-01-28 04:24:32 +00:00
2014-12-28 21:56:59 +00:00
// Box/SAV Functions //
2014-12-14 19:06:17 +00:00
private void clickBoxRight ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2015-05-07 02:30:31 +00:00
CB_BoxSelect . SelectedIndex = ( CB_BoxSelect . SelectedIndex + 1 ) % 31 ;
2014-06-28 21:22:05 +00:00
}
2014-12-14 19:06:17 +00:00
private void clickBoxLeft ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2015-05-07 02:30:31 +00:00
CB_BoxSelect . SelectedIndex = ( CB_BoxSelect . SelectedIndex + 30 ) % 31 ;
2014-06-28 21:22:05 +00:00
}
2016-02-09 07:57:25 +00:00
private void clickBoxSort ( object sender , EventArgs e )
{
if ( ModifierKeys ! = Keys . Control | | tabBoxMulti . SelectedIndex ! = 0 )
return ;
if ( DialogResult . Yes ! = Util . Prompt ( MessageBoxButtons . YesNo , "Sort Boxes?" ) )
return ;
SAV . sortBoxes ( ) ;
setPKXBoxes ( ) ;
CB_BoxSelect . SelectedIndex = 0 ;
Util . Alert ( "Boxes sorted!" ) ;
}
2014-12-24 07:29:57 +00:00
private void clickSlot ( object sender , EventArgs e )
{
2015-03-11 01:44:51 +00:00
switch ( ModifierKeys )
{
2016-01-18 01:07:19 +00:00
case Keys . Control | Keys . Alt : clickClone ( sender , e ) ; break ;
2015-03-11 01:44:51 +00:00
case Keys . Control : clickView ( sender , e ) ; break ;
case Keys . Shift : clickSet ( sender , e ) ; break ;
case Keys . Alt : clickDelete ( sender , e ) ; break ;
}
2014-12-24 07:29:57 +00:00
}
2014-12-14 19:06:17 +00:00
private void clickView ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
int slot = getSlot ( sender ) ;
int offset = getPKXOffset ( slot ) ;
2015-10-15 03:10:09 +00:00
if ( SlotPictureBoxes [ slot ] . Image = = null )
2016-01-03 18:47:44 +00:00
{ SystemSounds . Exclamation . Play ( ) ; return ; }
2014-06-28 21:22:05 +00:00
// Load the PKX file
2015-10-24 03:13:32 +00:00
PK6 pk = SAV . getPK6Stored ( offset ) ;
if ( pk . Sanity = = 0 & & pk . Species ! = 0 )
2014-06-28 21:22:05 +00:00
{
2016-01-28 04:24:32 +00:00
try { populateFields ( pk ) ; }
2014-06-28 21:22:05 +00:00
catch // If it fails, try XORing encrypted zeroes
{
try
{
2015-10-24 23:33:44 +00:00
byte [ ] blank = ( byte [ ] ) blankEK6 . Clone ( ) ;
2014-08-17 01:42:51 +00:00
2015-10-24 03:13:32 +00:00
for ( int i = 0 ; i < PK6 . SIZE_STORED ; i + + )
2015-09-24 03:29:31 +00:00
blank [ i ] = ( byte ) ( pk6 . Data [ i ] ^ blank [ i ] ) ;
2014-08-17 01:42:51 +00:00
2016-01-24 18:19:30 +00:00
populateFields ( new PK6 ( blank ) ) ;
2014-06-28 21:22:05 +00:00
}
catch // Still fails, just let the original errors occur.
2016-01-24 18:19:30 +00:00
{ populateFields ( pk6 ) ; }
2014-06-28 21:22:05 +00:00
}
// Visual to display what slot is currently loaded.
2014-08-01 23:53:09 +00:00
getSlotColor ( slot , Properties . Resources . slotView ) ;
2014-06-28 21:22:05 +00:00
}
2014-07-31 22:06:48 +00:00
else
2016-01-03 18:47:44 +00:00
SystemSounds . Exclamation . Play ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-14 19:06:17 +00:00
private void clickSet ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2016-02-01 07:15:54 +00:00
if ( ! verifiedPKX ( ) ) return ;
2014-06-28 21:22:05 +00:00
int slot = getSlot ( sender ) ;
2016-01-28 04:24:32 +00:00
if ( slot = = 30 & & ( CB_Species . SelectedIndex = = 0 | | CHK_IsEgg . Checked ) )
{ Util . Alert ( "Can't have empty/egg first slot." ) ; return ; }
2014-10-11 07:22:22 +00:00
2016-01-28 04:24:32 +00:00
int offset = getPKXOffset ( slot ) ;
2016-01-24 18:19:30 +00:00
PK6 pk = preparepkx ( ) ;
if ( ! SAV . ORAS )
2014-11-22 07:23:48 +00:00
{
// User Protection
2014-12-11 06:50:40 +00:00
string err = "" ;
2015-10-15 02:59:43 +00:00
if ( pk . Moves . Any ( m = > m > 617 ) )
2014-12-11 06:50:40 +00:00
err = "Move does not exist in X/Y." ;
2015-10-15 02:59:43 +00:00
else if ( pk . Ability > 188 )
2014-12-11 06:50:40 +00:00
err = "Ability does not exist in X/Y." ;
2015-10-15 02:59:43 +00:00
else if ( pk . HeldItem > 717 )
2014-12-11 06:50:40 +00:00
err = "Item does not exist in X/Y." ;
2016-01-24 18:19:30 +00:00
if ( err ! = "" & & Util . Prompt ( MessageBoxButtons . YesNo , err , "Continue?" ) ! = DialogResult . Yes )
2014-11-22 07:23:48 +00:00
return ;
}
2014-07-26 21:56:06 +00:00
if ( slot > = 30 & & slot < 36 ) // Party
2016-01-24 18:19:30 +00:00
SAV . setPK6Party ( pk , offset ) ;
2014-10-11 07:22:22 +00:00
else if ( slot < 30 | | ( slot > = 36 & & slot < 42 & & DEV_Ability . Enabled ) )
2016-01-24 18:19:30 +00:00
SAV . setPK6Stored ( pk , offset ) ;
2014-10-11 07:22:22 +00:00
else return ;
2015-09-21 06:05:54 +00:00
2015-10-24 03:13:32 +00:00
if ( slot > = 30 & & slot < 36 )
setParty ( ) ;
else
2016-01-24 18:19:30 +00:00
getQuickFiller ( SlotPictureBoxes [ slot ] , pk ) ;
2014-06-28 21:22:05 +00:00
2014-08-01 23:53:09 +00:00
getSlotColor ( slot , Properties . Resources . slotSet ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-14 19:06:17 +00:00
private void clickDelete ( object sender , EventArgs e )
2014-10-11 07:22:22 +00:00
{
int slot = getSlot ( sender ) ;
2015-10-24 03:13:32 +00:00
if ( slot = = 30 & & SAV . PartyCount = = 1 & & ! DEV_Ability . Enabled ) { Util . Alert ( "Can't delete first slot." ) ; return ; }
2014-10-11 07:22:22 +00:00
if ( slot > = 30 & & slot < 36 ) // Party
2016-01-24 18:19:30 +00:00
{ SAV . setData ( blankEK6 , getPKXOffset ( slot ) ) ; setParty ( ) ; return ; }
2015-03-11 01:44:51 +00:00
if ( slot < 30 | | ( slot > = 36 & & slot < 42 & & DEV_Ability . Enabled ) )
2016-01-24 18:19:30 +00:00
{ SAV . setEK6Stored ( blankEK6 , getPKXOffset ( slot ) ) ; }
2014-10-11 07:22:22 +00:00
else return ;
2015-10-15 03:10:09 +00:00
SlotPictureBoxes [ slot ] . Image = null ;
2014-10-11 07:22:22 +00:00
getSlotColor ( slot , Properties . Resources . slotDel ) ;
}
2014-12-14 19:06:17 +00:00
private void clickClone ( object sender , EventArgs e )
2014-11-29 19:07:01 +00:00
{
2014-12-06 02:14:04 +00:00
if ( getSlot ( sender ) > 30 ) return ; // only perform action if cloning to boxes
2016-02-01 07:15:54 +00:00
if ( ! verifiedPKX ( ) ) return ; // don't copy garbage to the box
2014-11-29 19:07:01 +00:00
2016-01-24 18:19:30 +00:00
PK6 pk ;
2015-05-07 02:30:31 +00:00
int box = CB_BoxSelect . SelectedIndex + 1 ; // get box we're cloning to
2015-01-01 19:38:37 +00:00
2016-01-17 21:27:24 +00:00
if ( Util . Prompt ( MessageBoxButtons . YesNo , $"Clone Pokemon from Editing Tabs to all slots in Box {box}?" ) = = DialogResult . Yes )
2016-01-24 18:19:30 +00:00
pk = preparepkx ( ) ;
2016-01-17 21:27:24 +00:00
else if ( Util . Prompt ( MessageBoxButtons . YesNo , $"Delete Pokemon from all slots in Box {box}?" ) = = DialogResult . Yes )
2016-01-24 18:19:30 +00:00
pk = new PK6 ( ) ;
2015-10-24 03:13:32 +00:00
else
return ; // abort clone/delete
2014-11-29 19:07:01 +00:00
2015-10-24 03:13:32 +00:00
for ( int i = 0 ; i < 30 ; i + + ) // write encrypted array to all box slots
{
2016-01-24 18:19:30 +00:00
SAV . setPK6Stored ( pk , getPKXOffset ( i ) ) ;
getQuickFiller ( SlotPictureBoxes [ i ] , pk ) ;
2015-10-24 03:13:32 +00:00
}
2014-11-29 19:07:01 +00:00
}
2015-09-16 06:33:02 +00:00
private void updateEggRNGSeed ( object sender , EventArgs e )
{
// Run through a LINQ filter for fun; works fine for GUI purposes, although LINQ may not be the fastest way to do it!
string filterText = TB_RNGSeed . Text . Select ( char . ToUpper ) . Where ( "0123456789ABCDEF" . Contains ) . Aggregate ( "" , ( str , c ) = > str + c ) ;
if ( filterText . Length ! = TB_RNGSeed . Text . Length )
{
Util . Alert ( "Expected HEX (0-9, A-F)." , "Received: " + Environment . NewLine + TB_RNGSeed . Text ) ;
// Reset to Stored Value
2015-10-24 03:13:32 +00:00
TB_RNGSeed . Text = SAV . DaycareRNGSeed . ToString ( "X16" ) ;
2015-09-16 06:33:02 +00:00
return ; // recursively triggers this method, no need to continue
}
if ( TB_RNGSeed . Text . Length = = 0 )
{
// Reset to 0
TB_RNGSeed . Text = 0. ToString ( "X16" ) ;
return ; // recursively triggers this method, no need to continue
}
// Write final value back to the save
2015-10-24 23:33:44 +00:00
ulong value = Convert . ToUInt64 ( TB_RNGSeed . Text , 16 ) ;
if ( value ! = SAV . DaycareRNGSeed )
{
SAV . DaycareRNGSeed = value ;
SAV . Edited = true ;
}
2015-09-21 03:34:09 +00:00
}
2015-12-17 03:33:58 +00:00
private void updateGameSync ( object sender , EventArgs e )
{
// Run through a LINQ filter for fun; works fine for GUI purposes, although LINQ may not be the fastest way to do it!
string filterText = TB_GameSync . Text . Select ( char . ToUpper ) . Where ( "0123456789ABCDEF" . Contains ) . Aggregate ( "" , ( str , c ) = > str + c ) ;
if ( filterText . Length ! = TB_GameSync . Text . Length )
{
2015-12-17 03:36:12 +00:00
Util . Alert ( "Expected HEX (0-9, A-F)." , "Received: " + Environment . NewLine + TB_GameSync . Text ) ;
2015-12-17 03:33:58 +00:00
// Reset to Stored Value
TB_GameSync . Text = SAV . GameSyncID . ToString ( "X16" ) ;
return ; // recursively triggers this method, no need to continue
}
if ( TB_GameSync . Text . Length = = 0 )
{
// Reset to 0
TB_GameSync . Text = 0. ToString ( "X16" ) ;
return ; // recursively triggers this method, no need to continue
}
// Write final value back to the save
ulong value = Convert . ToUInt64 ( TB_GameSync . Text , 16 ) ;
if ( value ! = SAV . GameSyncID )
{
SAV . GameSyncID = value ;
SAV . Edited = true ;
}
}
2015-12-28 21:52:08 +00:00
private void updateSecure1 ( object sender , EventArgs e )
{
// Run through a LINQ filter for fun; works fine for GUI purposes, although LINQ may not be the fastest way to do it!
string filterText = TB_Secure1 . Text . Select ( char . ToUpper ) . Where ( "0123456789ABCDEF" . Contains ) . Aggregate ( "" , ( str , c ) = > str + c ) ;
if ( filterText . Length ! = TB_Secure1 . Text . Length )
{
Util . Alert ( "Expected HEX (0-9, A-F)." , "Received: " + Environment . NewLine + TB_Secure1 . Text ) ;
// Reset to Stored Value
TB_Secure1 . Text = SAV . Secure1 . ToString ( "X16" ) ;
return ; // recursively triggers this method, no need to continue
}
if ( TB_Secure1 . Text . Length = = 0 )
{
// Reset to 0
TB_Secure1 . Text = 0. ToString ( "X16" ) ;
return ; // recursively triggers this method, no need to continue
}
// Write final value back to the save
ulong value = Convert . ToUInt64 ( TB_Secure1 . Text , 16 ) ;
if ( value ! = SAV . Secure1 )
{
SAV . Secure1 = value ;
SAV . Edited = true ;
}
}
private void updateSecure2 ( object sender , EventArgs e )
{
// Run through a LINQ filter for fun; works fine for GUI purposes, although LINQ may not be the fastest way to do it!
string filterText = TB_Secure2 . Text . Select ( char . ToUpper ) . Where ( "0123456789ABCDEF" . Contains ) . Aggregate ( "" , ( str , c ) = > str + c ) ;
if ( filterText . Length ! = TB_Secure2 . Text . Length )
{
Util . Alert ( "Expected HEX (0-9, A-F)." , "Received: " + Environment . NewLine + TB_Secure2 . Text ) ;
// Reset to Stored Value
TB_Secure2 . Text = SAV . Secure2 . ToString ( "X16" ) ;
return ; // recursively triggers this method, no need to continue
}
if ( TB_Secure2 . Text . Length = = 0 )
{
// Reset to 0
TB_Secure2 . Text = 0. ToString ( "X16" ) ;
return ; // recursively triggers this method, no need to continue
}
// Write final value back to the save
ulong value = Convert . ToUInt64 ( TB_Secure2 . Text , 16 ) ;
if ( value ! = SAV . Secure2 )
{
SAV . Secure2 = value ;
SAV . Edited = true ;
}
}
2015-10-24 03:13:32 +00:00
// Generic Subfunctions //
private void setParty ( )
2014-07-26 21:56:06 +00:00
{
2015-10-24 03:13:32 +00:00
SAV . setParty ( ) ;
2015-02-27 16:18:32 +00:00
// Refresh slots
for ( int i = 0 ; i < 6 ; i + + )
{
2016-01-24 18:19:30 +00:00
getQuickFiller ( SlotPictureBoxes [ i + 30 ] , SAV . getPK6Stored ( SAV . Party + PK6 . SIZE_PARTY * i ) ) ;
getQuickFiller ( SlotPictureBoxes [ i + 36 ] , SAV . getPK6Stored ( SAV . BattleBox + PK6 . SIZE_STORED * i ) ) ;
2015-02-27 16:18:32 +00:00
}
2014-06-28 21:22:05 +00:00
}
private int getPKXOffset ( int slot )
{
2016-01-31 07:03:43 +00:00
if ( slot < 30 ) // Box Slot
return SAV . Box + ( 30 * CB_BoxSelect . SelectedIndex + slot ) * PK6 . SIZE_STORED ;
if ( slot < 36 ) // Party Slot
return SAV . Party + ( slot - 30 ) * PK6 . SIZE_PARTY ;
if ( slot < 42 ) // Battle Box Slot
return SAV . BattleBox + ( slot - 36 ) * PK6 . SIZE_STORED ;
if ( slot < 44 ) // Daycare
return SAV . DaycareSlot [ DaycareSlot ] + 8 + ( slot - 42 ) * ( PK6 . SIZE_STORED + 8 ) ;
if ( slot < 45 ) // GTS
return SAV . GTS ;
if ( slot < 46 ) // Fused
return SAV . Fused ;
if ( slot < 50 ) // SUBE
return SAV . SUBE + ( slot - 46 ) * ( PK6 . SIZE_STORED + 4 ) ;
return - 1 ;
2014-06-28 21:22:05 +00:00
}
private int getSlot ( object sender )
{
2016-02-01 07:15:54 +00:00
sender = ( ( sender as ToolStripItem ) ? . Owner as ContextMenuStrip ) ? . SourceControl ? ? sender as PictureBox ;
2016-01-31 07:03:43 +00:00
return Array . IndexOf ( SlotPictureBoxes , sender ) ;
2014-06-28 21:22:05 +00:00
}
2015-11-15 02:17:54 +00:00
public void setPKXBoxes ( )
2014-06-28 21:22:05 +00:00
{
2015-12-30 06:03:27 +00:00
if ( SAV . Box > - 1 )
{
2016-01-18 01:07:19 +00:00
int boxoffset = SAV . Box + CB_BoxSelect . SelectedIndex * PK6 . SIZE_STORED * 30 ;
2015-12-30 06:03:27 +00:00
int boxbgval = SAV . getBoxWallpaper ( CB_BoxSelect . SelectedIndex ) ;
string imagename = "box_wp" + boxbgval . ToString ( "00" ) ; if ( SAV . ORAS & & boxbgval > 16 ) imagename + = "o" ;
PAN_Box . BackgroundImage = ( Image ) Properties . Resources . ResourceManager . GetObject ( imagename ) ;
2014-12-20 19:27:29 +00:00
2015-12-30 06:03:27 +00:00
for ( int i = 0 ; i < 30 ; i + + )
getSlotFiller ( boxoffset + PK6 . SIZE_STORED * i , SlotPictureBoxes [ i ] ) ;
}
2014-06-28 21:22:05 +00:00
// Reload Party
2015-12-30 06:03:27 +00:00
if ( SAV . Party > - 1 )
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < 6 ; i + + )
2015-10-24 03:13:32 +00:00
getSlotFiller ( SAV . Party + PK6 . SIZE_PARTY * i , SlotPictureBoxes [ i + 30 ] ) ;
2014-12-06 02:14:04 +00:00
2014-06-28 21:22:05 +00:00
// Reload Battle Box
2015-12-30 06:03:27 +00:00
if ( SAV . BattleBox > - 1 )
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < 6 ; i + + )
2015-10-24 03:13:32 +00:00
getSlotFiller ( SAV . BattleBox + PK6 . SIZE_STORED * i , SlotPictureBoxes [ i + 36 ] ) ;
2014-12-06 02:14:04 +00:00
2014-06-28 21:22:05 +00:00
// Reload Daycare
2015-12-30 06:03:27 +00:00
if ( SAV . Daycare > - 1 )
2014-06-28 21:22:05 +00:00
{
2015-12-30 06:03:27 +00:00
Label [ ] dclabela = { L_DC1 , L_DC2 , } ;
TextBox [ ] dctexta = { TB_Daycare1XP , TB_Daycare2XP } ;
2016-01-05 06:42:38 +00:00
uint [ ] exp = { SAV . DaycareEXP1 , SAV . DaycareEXP2 } ;
bool [ ] occ = { SAV . DaycareOccupied1 , SAV . DaycareOccupied2 } ;
2015-12-30 06:03:27 +00:00
for ( int i = 0 ; i < 2 ; i + + )
2014-06-28 21:22:05 +00:00
{
2015-12-30 06:03:27 +00:00
getSlotFiller ( SAV . DaycareSlot [ DaycareSlot ] + PK6 . SIZE_STORED * i + 8 * ( i + 1 ) , SlotPictureBoxes [ i + 42 ] ) ;
dctexta [ i ] . Text = exp [ i ] . ToString ( ) ;
if ( occ [ i ] ) // If Occupied
2016-01-18 01:07:19 +00:00
dclabela [ i ] . Text = $"{i + 1}: ✓" ;
2015-12-30 06:03:27 +00:00
else
{
2016-01-18 01:07:19 +00:00
dclabela [ i ] . Text = $"{i + 1}: ✘" ;
2015-12-30 06:03:27 +00:00
SlotPictureBoxes [ i + 42 ] . Image = Util . ChangeOpacity ( SlotPictureBoxes [ i + 42 ] . Image , 0.6 ) ;
}
2014-06-28 21:22:05 +00:00
}
2015-12-30 06:03:27 +00:00
DayCare_HasEgg . Checked = SAV . DaycareHasEgg ;
TB_RNGSeed . Text = SAV . DaycareRNGSeed . ToString ( "X16" ) ;
2014-06-28 21:22:05 +00:00
}
// GTS
2015-12-30 06:03:27 +00:00
if ( SAV . GTS > - 1 )
2015-10-24 03:13:32 +00:00
getSlotFiller ( SAV . GTS , SlotPictureBoxes [ 44 ] ) ;
2014-06-28 21:22:05 +00:00
// Fused
2015-12-30 06:03:27 +00:00
if ( SAV . Fused > - 1 )
2015-10-24 03:13:32 +00:00
getSlotFiller ( SAV . Fused , SlotPictureBoxes [ 45 ] ) ;
2014-06-28 21:22:05 +00:00
// SUBE
2015-12-30 06:03:27 +00:00
if ( SAV . SUBE > - 1 )
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < 3 ; i + + )
{
2015-10-24 03:13:32 +00:00
int offset = SAV . SUBE + i * ( PK6 . SIZE_STORED + 4 ) ;
if ( BitConverter . ToUInt64 ( SAV . Data , offset ) ! = 0 )
2015-09-21 03:34:09 +00:00
getSlotFiller ( offset , SlotPictureBoxes [ 46 + i ] ) ;
else SlotPictureBoxes [ 46 + i ] . Image = null ;
2014-06-28 21:22:05 +00:00
}
// Recoloring of a storage box slot (to not show for other storage boxes)
if ( colorizedslot < 32 )
2016-01-05 06:42:38 +00:00
SlotPictureBoxes [ colorizedslot ] . BackgroundImage = colorizedbox = = CB_BoxSelect . SelectedIndex ? colorizedcolor : null ;
2014-06-28 21:22:05 +00:00
}
2014-12-24 07:29:57 +00:00
private void setBoxNames ( )
2014-06-28 21:22:05 +00:00
{
2015-12-30 06:03:27 +00:00
if ( SAV . Box < 0 )
return ;
2015-05-07 02:30:31 +00:00
int selectedbox = CB_BoxSelect . SelectedIndex ; // precache selected box
2014-06-28 21:22:05 +00:00
// Build ComboBox Dropdown Items
try
{
2015-05-07 02:30:31 +00:00
CB_BoxSelect . Items . Clear ( ) ;
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < 31 ; i + + )
2015-10-24 23:33:44 +00:00
CB_BoxSelect . Items . Add ( SAV . getBoxName ( i ) ) ;
2014-06-28 21:22:05 +00:00
}
catch
{
2015-05-07 02:30:31 +00:00
CB_BoxSelect . Items . Clear ( ) ;
2015-11-22 03:27:50 +00:00
for ( int i = 0 ; i < 31 ; i + + )
2015-12-18 02:59:54 +00:00
CB_BoxSelect . Items . Add ( "BOX " + ( i + 1 ) ) ;
2014-06-28 21:22:05 +00:00
}
2016-02-03 04:05:46 +00:00
CB_BoxSelect . SelectedIndex = selectedbox ; // restore selected box
2014-06-28 21:22:05 +00:00
}
2016-01-24 18:19:30 +00:00
private void getQuickFiller ( PictureBox pb , PK6 pk = null )
2014-12-14 20:15:53 +00:00
{
2015-11-06 06:59:55 +00:00
if ( ! fieldsInitialized ) return ;
2016-01-24 18:19:30 +00:00
pk = pk ? ? preparepkx ( false ) ; // don't perform control loss click
2014-12-14 20:15:53 +00:00
2016-01-24 18:19:30 +00:00
if ( pb = = dragout ) L_QR . Visible = pk . Species ! = 0 ; // Species
pb . Image = pk . Sprite ;
2014-12-14 20:15:53 +00:00
}
2014-06-28 21:22:05 +00:00
private void getSlotFiller ( int offset , PictureBox pb )
{
2015-10-24 03:13:32 +00:00
if ( SAV . getData ( offset , PK6 . SIZE_STORED ) . SequenceEqual ( new byte [ PK6 . SIZE_STORED ] ) )
2015-10-15 01:33:51 +00:00
{
2015-12-02 07:08:16 +00:00
// 00s present in slot.
2015-10-15 01:33:51 +00:00
pb . Image = null ;
pb . BackColor = Color . Transparent ;
return ;
}
2015-10-24 03:13:32 +00:00
PK6 p = SAV . getPK6Stored ( offset ) ;
2016-01-24 18:19:30 +00:00
if ( p . Sanity ! = 0 | | ! p . ChecksumValid ) // Invalid
2014-08-07 00:10:29 +00:00
{
2015-04-28 14:39:50 +00:00
// Bad Egg present in slot.
2014-08-07 00:10:29 +00:00
pb . Image = null ;
pb . BackColor = Color . Red ;
return ;
}
2015-12-02 07:08:16 +00:00
// Something stored in slot. Only display if species is valid.
2015-10-15 03:10:09 +00:00
pb . Image = p . Species = = 0 ? null : p . Sprite ;
2015-12-02 07:08:16 +00:00
pb . BackColor = Color . Transparent ;
2014-06-28 21:22:05 +00:00
}
2014-08-01 23:53:09 +00:00
private void getSlotColor ( int slot , Image color )
2014-06-28 21:22:05 +00:00
{
2015-10-25 01:16:22 +00:00
foreach ( PictureBox t in SlotPictureBoxes )
2015-03-11 01:44:51 +00:00
t . BackgroundImage = null ;
2014-08-17 01:42:51 +00:00
2016-01-31 07:03:43 +00:00
if ( slot < 30 )
2015-05-07 02:30:31 +00:00
colorizedbox = CB_BoxSelect . SelectedIndex ;
2014-08-17 01:42:51 +00:00
2015-10-25 01:16:22 +00:00
SlotPictureBoxes [ slot ] . BackgroundImage = color ;
2014-06-28 21:22:05 +00:00
colorizedcolor = color ;
colorizedslot = slot ;
}
private void getBox ( object sender , EventArgs e )
{
2014-10-10 02:59:57 +00:00
setPKXBoxes ( ) ;
2014-06-28 21:22:05 +00:00
}
2015-02-21 20:59:22 +00:00
2015-09-21 03:34:09 +00:00
private int DaycareSlot ;
2014-12-28 21:56:59 +00:00
private void switchDaycare ( object sender , EventArgs e )
{
2015-10-24 03:13:32 +00:00
if ( ! SAV . ORAS ) return ;
2016-01-17 21:27:24 +00:00
if ( DialogResult . Yes = = Util . Prompt ( MessageBoxButtons . YesNo , "Would you like to switch the view to the other Daycare?" ,
$"Currently viewing daycare {DaycareSlot + 1}." ) )
2015-01-01 19:38:37 +00:00
// If ORAS, alter the daycare offset via toggle.
2015-09-21 03:34:09 +00:00
DaycareSlot ^ = 1 ;
2014-12-28 21:56:59 +00:00
// Refresh Boxes
setPKXBoxes ( ) ;
}
2015-10-24 03:13:32 +00:00
2015-10-13 00:06:30 +00:00
private void dumpBoxesToDB ( string path , bool individualBoxFolders )
{
2015-11-20 06:42:57 +00:00
PK6 [ ] boxdata = SAV . BoxData ;
2015-11-20 06:44:16 +00:00
for ( int i = 0 ; i < boxdata . Length ; i + + )
2015-10-13 00:06:30 +00:00
{
2015-11-20 06:42:57 +00:00
PK6 pk = boxdata [ i ] ;
2015-11-14 02:29:59 +00:00
if ( pk . Species = = 0 | | pk . Sanity ! = 0 )
continue ;
2015-10-13 00:06:30 +00:00
string fileName = Util . CleanFileName ( pk . FileName ) ;
string boxfolder = "" ;
if ( individualBoxFolders )
{
2016-01-18 01:07:19 +00:00
boxfolder = "BOX" + ( i / 30 + 1 ) ;
2015-10-13 00:06:30 +00:00
Directory . CreateDirectory ( Path . Combine ( path , boxfolder ) ) ;
2014-06-28 21:22:05 +00:00
}
2015-10-13 00:06:30 +00:00
if ( ! File . Exists ( Path . Combine ( Path . Combine ( path , boxfolder ) , fileName ) ) )
2015-10-24 03:13:32 +00:00
File . WriteAllBytes ( Path . Combine ( Path . Combine ( path , boxfolder ) , fileName ) , pk . Data . Take ( PK6 . SIZE_STORED ) . ToArray ( ) ) ;
2014-06-28 21:22:05 +00:00
}
}
private void loadBoxesFromDB ( string path )
{
2016-02-03 04:05:46 +00:00
if ( string . IsNullOrWhiteSpace ( path ) ) return ;
2015-10-24 03:13:32 +00:00
int offset = SAV . Box ;
2015-05-07 02:30:31 +00:00
int ctr = CB_BoxSelect . SelectedIndex * 30 ;
2014-09-05 06:23:05 +00:00
int pastctr = 0 ;
2014-08-31 20:32:04 +00:00
// Clear out the box data array.
2014-09-05 06:23:05 +00:00
// Array.Clear(savefile, offset, size * 30 * 31);
2014-12-14 04:39:31 +00:00
DialogResult dr = Util . Prompt ( MessageBoxButtons . YesNoCancel , "Clear subsequent boxes when importing data?" , "If you only want to overwrite for new data, press no." ) ;
if ( dr = = DialogResult . Cancel ) return ;
2015-03-11 01:44:51 +00:00
if ( dr = = DialogResult . Yes )
2014-09-06 19:52:36 +00:00
{
for ( int i = ctr ; i < 30 * 31 ; i + + )
2015-12-24 23:38:07 +00:00
SAV . setData ( blankEK6 , offset + i * PK6 . SIZE_STORED ) ;
2014-09-06 19:52:36 +00:00
}
2014-08-15 04:27:53 +00:00
string [ ] filepaths = Directory . GetFiles ( path , "*.*" , SearchOption . TopDirectoryOnly ) ;
2014-08-17 01:42:51 +00:00
2015-03-11 01:44:51 +00:00
foreach ( string t in filepaths )
2014-06-28 21:22:05 +00:00
{
2015-03-11 01:44:51 +00:00
long len = new FileInfo ( t ) . Length ;
2015-10-24 03:13:32 +00:00
if ( len > PK6 . SIZE_PARTY )
2014-12-13 22:48:34 +00:00
continue ;
2015-10-25 01:16:22 +00:00
2016-01-31 07:03:43 +00:00
if ( ! new [ ] { PK6 . SIZE_STORED , PK6 . SIZE_PARTY , PK5 . SIZE_STORED , PK5 . SIZE_PARTY , PK4 . SIZE_PARTY , PK3 . SIZE_STORED , PK3 . SIZE_PARTY } . Contains ( ( int ) len ) )
2014-06-28 21:22:05 +00:00
continue ;
2015-10-24 03:13:32 +00:00
byte [ ] data = new byte [ PK6 . SIZE_STORED ] ;
2015-04-28 14:39:50 +00:00
switch ( Path . GetExtension ( t ) ) // Filter all files by extension
2014-08-15 04:27:53 +00:00
{
2015-03-11 01:44:51 +00:00
case ".pk5" :
case ".pk4" :
case ".pk3" :
case ".3gpkm" :
case ".pkm" :
2014-08-15 04:27:53 +00:00
{
2015-03-11 01:44:51 +00:00
// Verify PKM (decrypted)
byte [ ] input = File . ReadAllBytes ( t ) ;
2015-04-28 14:39:50 +00:00
if ( ! PKX . verifychk ( input ) ) continue ;
2015-03-11 01:44:51 +00:00
{
try // to convert g5pkm
2016-01-24 18:19:30 +00:00
{ data = PKX . encryptArray ( Converter . ConvertPKMtoPK6 ( input ) . Data ) ; pastctr + + ; }
2015-04-28 14:39:50 +00:00
catch { continue ; }
2015-03-11 01:44:51 +00:00
}
2014-08-15 04:27:53 +00:00
}
2015-03-11 01:44:51 +00:00
break ;
case ".pk6" :
case ".pkx" :
2014-06-28 21:22:05 +00:00
{
2015-03-11 01:44:51 +00:00
byte [ ] input = File . ReadAllBytes ( t ) ;
if ( ( BitConverter . ToUInt16 ( input , 0xC8 ) = = 0 ) & & ( BitConverter . ToUInt16 ( input , 0x58 ) = = 0 ) )
{
if ( BitConverter . ToUInt16 ( input , 0x8 ) = = 0 ) // if species = 0
continue ;
2015-10-24 03:13:32 +00:00
Array . Resize ( ref input , PK6 . SIZE_STORED ) ;
2015-03-11 01:44:51 +00:00
2015-04-28 14:39:50 +00:00
if ( PKX . getCHK ( input ) ! = BitConverter . ToUInt16 ( input , 0x6 ) ) continue ;
2015-03-11 01:44:51 +00:00
data = PKX . encryptArray ( input ) ;
}
}
break ;
case ".ek6" :
case ".ekx" :
{
byte [ ] input = File . ReadAllBytes ( t ) ;
2015-10-24 03:13:32 +00:00
Array . Resize ( ref input , PK6 . SIZE_STORED ) ;
Array . Copy ( input , data , PK6 . SIZE_STORED ) ;
2015-03-11 01:44:51 +00:00
// check if it is good data
byte [ ] decrypteddata = PKX . decryptArray ( input ) ;
if ( BitConverter . ToUInt16 ( decrypteddata , 0xC8 ) ! = 0 & & BitConverter . ToUInt16 ( decrypteddata , 0x58 ) ! = 0 )
2015-10-25 01:16:22 +00:00
continue ;
if ( BitConverter . ToUInt16 ( decrypteddata , 0x8 ) = = 0 ) // if species = 0
continue ;
2015-04-28 14:39:50 +00:00
if ( PKX . getCHK ( input ) ! = BitConverter . ToUInt16 ( decrypteddata , 0x6 ) ) continue ;
2014-06-28 21:22:05 +00:00
}
2015-03-11 01:44:51 +00:00
break ;
default :
continue ;
2014-06-28 21:22:05 +00:00
}
2015-10-24 03:13:32 +00:00
SAV . setEK6Stored ( data , offset + ctr + + * PK6 . SIZE_STORED ) ;
2014-06-28 21:22:05 +00:00
if ( ctr = = 30 * 31 ) break ; // break out if we have written all 31 boxes
}
2016-02-12 08:01:15 +00:00
ctr - = 30 * CB_BoxSelect . SelectedIndex ; // actual imported count
2015-03-11 01:44:51 +00:00
if ( ctr < = 0 ) return ;
2016-01-03 04:22:53 +00:00
2015-03-11 01:44:51 +00:00
setPKXBoxes ( ) ;
2016-01-17 21:27:24 +00:00
string result = $"Loaded {ctr} files to boxes." ;
2015-03-11 01:44:51 +00:00
if ( pastctr > 0 )
2016-01-17 21:27:24 +00:00
Util . Alert ( result , $"Conversion successful for {pastctr} past generation files." ) ;
2015-03-11 01:44:51 +00:00
else
Util . Alert ( result ) ;
2014-06-28 21:22:05 +00:00
}
2015-01-25 19:24:00 +00:00
private void B_SaveBoxBin_Click ( object sender , EventArgs e )
2015-01-24 19:16:20 +00:00
{
2016-01-31 07:03:43 +00:00
DialogResult dr = Util . Prompt ( MessageBoxButtons . YesNoCancel , "Yes: Export All Boxes" + Environment . NewLine + string . Format ( "No: Export {1} (Box {0})" , CB_BoxSelect . SelectedIndex + 1 , CB_BoxSelect . Text ) + Environment . NewLine + "Cancel: Abort" ) ;
2015-01-25 19:24:00 +00:00
if ( dr = = DialogResult . Yes )
{
2015-03-11 01:44:51 +00:00
SaveFileDialog sfd = new SaveFileDialog { Filter = "Box Data|*.bin" , FileName = "pcdata.bin" } ;
2015-10-24 03:13:32 +00:00
if ( sfd . ShowDialog ( ) = = DialogResult . OK )
File . WriteAllBytes ( sfd . FileName , SAV . getData ( SAV . Box , PK6 . SIZE_STORED * 30 * 31 ) ) ;
2015-01-25 19:24:00 +00:00
}
2015-02-01 04:40:35 +00:00
else if ( dr = = DialogResult . No )
2015-01-24 19:16:20 +00:00
{
2015-03-11 01:44:51 +00:00
SaveFileDialog sfd = new SaveFileDialog { Filter = "Box Data|*.bin" , FileName = "boxdata.bin" } ;
2015-10-24 03:13:32 +00:00
if ( sfd . ShowDialog ( ) = = DialogResult . OK )
File . WriteAllBytes ( sfd . FileName , SAV . getData ( SAV . Box + PK6 . SIZE_STORED * 30 * CB_BoxSelect . SelectedIndex , PK6 . SIZE_STORED * 30 ) ) ;
2015-01-24 19:16:20 +00:00
}
}
2015-10-24 03:13:32 +00:00
2014-12-14 19:06:17 +00:00
// Subfunction Save Buttons //
2014-06-28 21:22:05 +00:00
private void B_OpenWondercards_Click ( object sender , EventArgs e )
{
// Open Wondercard Menu
2015-09-21 03:34:09 +00:00
new SAV_Wondercard ( ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenBoxLayout_Click ( object sender , EventArgs e )
{
// Open Box Layout Menu
2015-09-21 03:34:09 +00:00
new SAV_BoxLayout ( CB_BoxSelect . SelectedIndex ) . ShowDialog ( ) ;
2014-12-06 02:14:04 +00:00
setBoxNames ( ) ; // fix box names
setPKXBoxes ( ) ; // refresh box background
2014-06-28 21:22:05 +00:00
}
private void B_OpenTrainerInfo_Click ( object sender , EventArgs e )
{
2015-09-21 03:34:09 +00:00
new SAV_Trainer ( ) . ShowDialog ( ) ;
2016-01-03 04:22:53 +00:00
// Refresh PK#->PK6 conversion info
Converter . updateConfig ( SAV . SubRegion , SAV . Country , SAV . ConsoleRegion , SAV . OT , SAV . Gender ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenPokepuffs_Click ( object sender , EventArgs e )
{
2015-09-21 03:34:09 +00:00
new SAV_Pokepuff ( ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenItemPouch_Click ( object sender , EventArgs e )
{
2015-09-21 03:34:09 +00:00
new SAV_Inventory ( ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenBerryField_Click ( object sender , EventArgs e )
{
2015-10-24 03:13:32 +00:00
if ( SAV . ORAS )
2016-01-23 21:00:44 +00:00
new SAV_BerryFieldORAS ( ) . ShowDialog ( ) ;
2015-01-01 19:38:37 +00:00
else
2016-01-23 21:00:44 +00:00
new SAV_BerryFieldXY ( ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenEventFlags_Click ( object sender , EventArgs e )
{
// Open Flag Menu
2015-10-24 03:13:32 +00:00
if ( SAV . ORAS )
2015-09-21 03:34:09 +00:00
new SAV_EventFlagsORAS ( ) . ShowDialog ( ) ;
2015-01-01 19:38:37 +00:00
else
2015-09-21 03:34:09 +00:00
new SAV_EventFlagsXY ( ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-07-31 22:06:48 +00:00
private void B_OpenSuperTraining_Click ( object sender , EventArgs e )
{
// Open ST Menu
2016-01-24 18:19:30 +00:00
new SAV_SuperTrain ( ) . ShowDialog ( ) ;
2014-07-31 22:06:48 +00:00
}
2014-07-27 01:00:17 +00:00
private void B_OpenOPowers_Click ( object sender , EventArgs e )
{
// Open O-Power Menu
2015-10-24 03:13:32 +00:00
if ( SAV . ORAS )
2014-11-25 03:53:10 +00:00
{
2014-12-11 06:50:40 +00:00
DialogResult dr = Util . Prompt ( MessageBoxButtons . YesNo , "No editing support for ORAS :(" , "Max O-Powers with a working code?" ) ;
2015-03-11 01:44:51 +00:00
if ( dr ! = DialogResult . Yes ) return ;
2016-02-03 04:05:46 +00:00
new byte [ ]
2015-03-11 01:44:51 +00:00
{
2016-02-03 04:05:46 +00:00
0x00 , 0x01 , 0x01 , 0x01 , 0x01 , 0x00 , 0x01 , 0x01 , 0x01 , 0x01 , 0x00 , 0x01 , 0x01 , 0x01 , 0x01 , 0x00 ,
0x01 , 0x01 , 0x01 , 0x01 , 0x00 , 0x01 , 0x01 , 0x01 , 0x01 , 0x00 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 ,
0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x00 , 0x01 , 0x01 , 0x01 , 0x01 , 0x00 , 0x01 , 0x01 , 0x01 , 0x01 ,
0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 ,
2015-03-11 01:44:51 +00:00
0x01 , 0x00 , 0x00 , 0x00 ,
2016-02-03 04:05:46 +00:00
} . CopyTo ( SAV . Data , SAV . OPower ) ;
2014-11-25 03:53:10 +00:00
}
2015-01-01 19:38:37 +00:00
else
2015-09-21 03:34:09 +00:00
new SAV_OPower ( ) . ShowDialog ( ) ;
2014-07-27 01:00:17 +00:00
}
2014-07-28 01:30:54 +00:00
private void B_OpenPokedex_Click ( object sender , EventArgs e )
{
// Open Pokedex Menu
2015-10-24 03:13:32 +00:00
if ( SAV . ORAS )
2015-09-21 03:34:09 +00:00
new SAV_PokedexORAS ( ) . ShowDialog ( ) ;
2015-01-01 19:38:37 +00:00
else
2015-09-21 03:34:09 +00:00
new SAV_PokedexXY ( ) . ShowDialog ( ) ;
2014-07-28 01:30:54 +00:00
}
2014-06-28 21:22:05 +00:00
private void B_OUTPasserby_Click ( object sender , EventArgs e )
{
2016-02-09 23:35:56 +00:00
if ( DialogResult . Yes ! = Util . Prompt ( MessageBoxButtons . YesNo , "Export Passerby Info to Clipboard?" ) )
2015-12-18 02:55:59 +00:00
return ;
string result = "PSS List" + Environment . NewLine ;
string [ ] headers = { "PSS Data - Friends" , "PSS Data - Acquaintances" , "PSS Data - Passerby" , } ;
2015-10-24 03:13:32 +00:00
int offset = SAV . PSS ;
2014-06-28 21:22:05 +00:00
for ( int g = 0 ; g < 3 ; g + + )
{
2015-01-03 01:07:29 +00:00
result + = Environment . NewLine
+ "----" + Environment . NewLine
+ headers [ g ] + Environment . NewLine
+ "----" + Environment . NewLine ;
2015-03-11 01:44:51 +00:00
// uint count = BitConverter.ToUInt32(savefile, offset + 0x4E20);
2014-06-28 21:22:05 +00:00
int r_offset = offset ;
for ( int i = 0 ; i < 100 ; i + + )
{
2015-10-24 03:13:32 +00:00
ulong unkn = BitConverter . ToUInt64 ( SAV . Data , r_offset ) ;
2015-01-03 01:07:29 +00:00
if ( unkn = = 0 ) break ; // No data present here
if ( i > 0 ) result + = Environment . NewLine + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
2015-10-24 03:13:32 +00:00
string otname = Util . TrimFromZero ( Encoding . Unicode . GetString ( SAV . Data , r_offset + 8 , 0x1A ) ) ;
string message = Util . TrimFromZero ( Encoding . Unicode . GetString ( SAV . Data , r_offset + 0x22 , 0x22 ) ) ;
2014-06-28 21:22:05 +00:00
// Trim terminated
2015-03-11 01:44:51 +00:00
// uint unk1 = BitConverter.ToUInt32(savefile, r_offset + 0x44);
// ulong unk2 = BitConverter.ToUInt64(savefile, r_offset + 0x48);
// uint unk3 = BitConverter.ToUInt32(savefile, r_offset + 0x50);
// uint unk4 = BitConverter.ToUInt16(savefile, r_offset + 0x54);
2015-10-24 03:13:32 +00:00
byte region = SAV . Data [ r_offset + 0x56 ] ;
byte country = SAV . Data [ r_offset + 0x57 ] ;
byte game = SAV . Data [ r_offset + 0x5A ] ;
2015-03-11 01:44:51 +00:00
// ulong outfit = BitConverter.ToUInt64(savefile, r_offset + 0x5C);
2015-10-24 03:13:32 +00:00
int favpkm = BitConverter . ToUInt16 ( SAV . Data , r_offset + 0x9C ) & 0x7FF ;
2015-03-11 01:44:51 +00:00
string gamename ;
try { gamename = gamelist [ game ] ; }
catch { gamename = "UNKNOWN GAME" ; }
2014-12-17 03:12:16 +00:00
string [ ] cr = PKX . getCountryRegionText ( country , region , curlanguage ) ;
2015-01-01 19:38:37 +00:00
result + =
2014-12-11 07:00:25 +00:00
"OT: " + otname + Environment . NewLine +
"Message: " + message + Environment . NewLine +
"Game: " + gamename + Environment . NewLine +
2014-12-26 18:46:18 +00:00
"Country: " + cr [ 0 ] + Environment . NewLine +
"Region: " + cr [ 1 ] + Environment . NewLine +
2015-01-03 01:07:29 +00:00
"Favorite: " + specieslist [ favpkm ] ;
2014-12-11 07:00:25 +00:00
2015-01-03 01:07:29 +00:00
r_offset + = 0xC8 ; // Advance to next entry
2014-06-28 21:22:05 +00:00
}
2015-01-03 01:07:29 +00:00
offset + = 0x5000 ; // Advance to next block
2014-06-28 21:22:05 +00:00
}
2015-12-18 02:55:59 +00:00
Clipboard . SetText ( result ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OUTHallofFame_Click ( object sender , EventArgs e )
{
// Open HoF Menu
2015-09-21 03:34:09 +00:00
new SAV_HallOfFame ( ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-11-23 22:23:40 +00:00
private void B_OpenSecretBase_Click ( object sender , EventArgs e )
{
// Open Secret Base Menu
2015-09-21 03:34:09 +00:00
new SAV_SecretBase ( ) . ShowDialog ( ) ;
2014-11-23 22:23:40 +00:00
}
2014-12-14 19:06:17 +00:00
private void B_JPEG_Click ( object sender , EventArgs e )
{
2015-10-24 03:13:32 +00:00
int offset = SAV . JPEG ;
string filename = Encoding . Unicode . GetString ( SAV . Data , offset , 0x1A ) . Trim ( ) ;
2014-12-14 19:06:17 +00:00
filename + = "'s picture" ;
offset + = 0x54 ;
2015-10-24 03:13:32 +00:00
if ( SAV . Data [ offset ] ! = 0xFF )
2014-12-14 19:06:17 +00:00
{
Util . Alert ( "No PGL picture data found in the save file!" ) ;
return ;
}
2015-03-11 01:44:51 +00:00
const int length = 0xE004 ;
2014-12-14 19:06:17 +00:00
byte [ ] jpeg = new byte [ length ] ;
2015-10-24 03:13:32 +00:00
Array . Copy ( SAV . Data , offset , jpeg , 0 , length ) ;
2015-03-11 01:44:51 +00:00
SaveFileDialog savejpeg = new SaveFileDialog { FileName = filename , Filter = "JPEG|*.jpeg" } ;
if ( savejpeg . ShowDialog ( ) ! = DialogResult . OK ) return ;
string path = savejpeg . FileName ;
if ( File . Exists ( path ) )
2014-12-14 19:06:17 +00:00
{
2015-03-11 01:44:51 +00:00
// File already exists, save a .bak
byte [ ] backupfile = File . ReadAllBytes ( path ) ;
File . WriteAllBytes ( path + ".bak" , backupfile ) ;
2014-12-14 19:06:17 +00:00
}
2015-03-11 01:44:51 +00:00
File . WriteAllBytes ( path , jpeg ) ;
2014-12-14 19:06:17 +00:00
}
2014-12-24 07:29:57 +00:00
// Save Folder Related
2014-12-14 19:06:17 +00:00
private void clickSaveFileName ( object sender , EventArgs e )
2014-12-13 22:48:34 +00:00
{
// Get latest SaveDataFiler save location
2015-01-27 06:05:04 +00:00
pathSDF = Util . GetSDFLocation ( ) ;
2015-10-03 00:41:55 +00:00
path3DS = Util . get3DSLocation ( ) ;
2014-12-13 22:48:34 +00:00
string path = null ;
2015-11-04 02:35:27 +00:00
if ( path3DS ! = null & & File . Exists ( Path . Combine ( Path . GetPathRoot ( path3DS ) , "ramsav.bin" ) ) )
path = Path . Combine ( Path . GetPathRoot ( path3DS ) , "ramsav.bin" ) ;
2015-10-03 00:41:55 +00:00
if ( path3DS ! = null & & Directory . Exists ( Path . Combine ( path3DS , "SaveDataBackup" ) ) & & ModifierKeys ! = Keys . Control )
2015-09-12 05:17:13 +00:00
path = Path . Combine ( Path . GetPathRoot ( path3DS ) , "SaveDataBackup" , "main" ) ;
2015-09-05 01:50:14 +00:00
else if ( pathSDF ! = null & & ModifierKeys ! = Keys . Shift ) // if we have a result
2015-01-27 06:05:04 +00:00
path = Path . Combine ( pathSDF , "main" ) ;
2015-12-14 15:52:25 +00:00
else if ( File . Exists ( Util . NormalizePath ( Path . Combine ( Util . GetTempFolder ( ) , "root" , "main" ) ) ) ) // else if cgse exists
path = Util . NormalizePath ( Path . Combine ( Util . GetTempFolder ( ) , "root" , "main" ) ) ;
2014-12-13 22:48:34 +00:00
2015-10-03 00:41:55 +00:00
if ( path = = null | | ! File . Exists ( path ) ) return ;
2015-03-11 01:44:51 +00:00
if ( Util . Prompt ( MessageBoxButtons . YesNo , "Open save file from the following location?" , path ) = = DialogResult . Yes )
openQuick ( path ) ; // load save
2014-12-13 22:48:34 +00:00
}
2014-11-26 04:43:02 +00:00
2014-11-26 06:24:32 +00:00
// Drag & Drop within Box
2014-11-26 04:43:02 +00:00
private void pbBoxSlot_MouseDown ( object sender , MouseEventArgs e )
{
2015-12-26 18:26:42 +00:00
if ( e . Button ! = MouseButtons . Left | | e . Clicks ! = 1 ) return ;
2014-11-29 19:07:01 +00:00
if ( ModifierKeys = = Keys . Control | | ModifierKeys = = Keys . Alt | | ModifierKeys = = Keys . Shift | | ModifierKeys = = ( Keys . Control | Keys . Alt ) )
2015-03-11 01:44:51 +00:00
{ clickSlot ( sender , e ) ; return ; }
2016-01-18 01:07:19 +00:00
PictureBox pb = ( PictureBox ) sender ;
2014-11-26 04:43:02 +00:00
if ( pb . Image = = null )
return ;
2014-12-20 19:27:29 +00:00
pkm_from_slot = getSlot ( sender ) ;
int offset = getPKXOffset ( pkm_from_slot ) ;
2015-03-11 01:44:51 +00:00
// Create Temp File to Drag
Cursor . Current = Cursors . Hand ;
// Prepare Data
2015-10-24 03:13:32 +00:00
pkm_from = SAV . getData ( offset , PK6 . SIZE_STORED ) ;
2015-03-11 01:44:51 +00:00
pkm_from_offset = offset ;
// Make a new file name based off the PID
byte [ ] dragdata = PKX . decryptArray ( pkm_from ) ;
2015-10-24 03:13:32 +00:00
Array . Resize ( ref dragdata , PK6 . SIZE_STORED ) ;
2015-09-24 03:29:31 +00:00
var pkx = new PK6 ( dragdata , "Boxes" ) ;
2015-11-22 18:51:09 +00:00
string filename = pkx . FileName ;
2015-03-11 01:44:51 +00:00
// Make File
2015-11-14 22:19:40 +00:00
string newfile = Path . Combine ( Path . GetTempPath ( ) , Util . CleanFileName ( filename ) ) ;
2015-03-11 01:44:51 +00:00
try
2014-11-26 04:43:02 +00:00
{
2015-03-11 01:44:51 +00:00
File . WriteAllBytes ( newfile , dragdata ) ;
2015-11-14 22:19:40 +00:00
DoDragDrop ( new DataObject ( DataFormats . FileDrop , new [ ] { newfile } ) , DragDropEffects . Move ) ;
2014-11-26 04:43:02 +00:00
}
2015-03-11 01:44:51 +00:00
catch ( ArgumentException x )
{ Util . Error ( "Drag & Drop Error:" , x . ToString ( ) ) ; }
File . Delete ( newfile ) ;
pkm_from_offset = 0 ;
2014-11-26 04:43:02 +00:00
}
private void pbBoxSlot_DragDrop ( object sender , DragEventArgs e )
{
int slot = getSlot ( sender ) ;
int offset = getPKXOffset ( slot ) ;
2014-11-30 18:59:10 +00:00
// Check for In-Dropped files (PKX,SAV,ETC)
string [ ] files = ( string [ ] ) e . Data . GetData ( DataFormats . FileDrop ) ;
2014-12-14 04:39:31 +00:00
if ( Directory . Exists ( files [ 0 ] ) ) { loadBoxesFromDB ( files [ 0 ] ) ; return ; }
2015-03-11 01:44:51 +00:00
if ( pkm_from_offset = = 0 )
2014-11-30 18:59:10 +00:00
{
if ( files . Length > 0 )
{
FileInfo fi = new FileInfo ( files [ 0 ] ) ;
// Detect if PKM/PKX
2016-01-31 07:03:43 +00:00
if ( new [ ] { PK3 . SIZE_PARTY , PK3 . SIZE_STORED , PK4 . SIZE_PARTY , PK4 . SIZE_STORED , PK5 . SIZE_PARTY } . Contains ( ( int ) fi . Length ) )
2014-11-30 18:59:10 +00:00
{
byte [ ] input = File . ReadAllBytes ( files [ 0 ] ) ;
2014-12-11 06:50:40 +00:00
if ( ! PKX . verifychk ( input ) ) Util . Alert ( "Invalid File Loaded." , "Checksum is not valid." ) ;
2014-11-30 18:59:10 +00:00
try // to convert past gen pkm
{
2016-01-24 18:19:30 +00:00
SAV . setPK6Stored ( Converter . ConvertPKMtoPK6 ( input ) , offset ) ;
2014-11-30 18:59:10 +00:00
}
catch
2014-12-11 06:50:40 +00:00
{ Util . Error ( "Attempted to load previous generation PKM." , "Conversion failed." ) ; }
2014-11-30 18:59:10 +00:00
}
2015-10-24 03:13:32 +00:00
else if ( fi . Length = = PK6 . SIZE_STORED | | fi . Length = = PK6 . SIZE_PARTY )
2014-11-30 18:59:10 +00:00
{
byte [ ] data = File . ReadAllBytes ( files [ 0 ] ) ;
if ( fi . Extension = = ".pkx" | | fi . Extension = = ".pk6" )
data = PKX . encryptArray ( data ) ;
2014-12-14 20:15:53 +00:00
else if ( fi . Extension ! = ".ekx" & & fi . Extension ! = ".ek6" )
2014-12-06 02:14:04 +00:00
{ openQuick ( files [ 0 ] ) ; return ; } // lazy way of aborting
2014-11-30 18:59:10 +00:00
2014-12-14 20:15:53 +00:00
byte [ ] decdata = PKX . decryptArray ( data ) ;
2014-12-20 19:27:29 +00:00
if ( ! PKX . verifychk ( decdata ) )
Util . Alert ( "Attempted to load Invalid File." , "Checksum is not valid." ) ;
else
{
2015-10-24 03:13:32 +00:00
SAV . setEK6Stored ( data , offset ) ;
2016-01-24 18:19:30 +00:00
getQuickFiller ( SlotPictureBoxes [ slot ] , new PK6 ( decdata ) ) ;
2014-12-20 19:27:29 +00:00
getSlotColor ( slot , Properties . Resources . slotSet ) ;
}
2014-11-30 18:59:10 +00:00
}
else // not PKX/EKX, so load with the general function
{ openQuick ( files [ 0 ] ) ; }
}
}
else
{
2014-12-20 19:27:29 +00:00
if ( ModifierKeys = = Keys . Alt & & slot > - 1 ) // overwrite delete old slot
{
// Clear from slot picture
2016-01-24 18:19:30 +00:00
getQuickFiller ( SlotPictureBoxes [ pkm_from_slot ] , new PK6 ( ) ) ;
2014-12-20 19:27:29 +00:00
// Clear from slot data
2016-01-24 18:19:30 +00:00
SAV . setEK6Stored ( blankEK6 , pkm_from_offset ) ;
2014-12-20 19:27:29 +00:00
}
else if ( ModifierKeys ! = Keys . Control & & slot > - 1 )
{
2014-12-20 22:44:17 +00:00
// Load data from destination
2015-10-24 03:13:32 +00:00
PK6 pk = SAV . getPK6Stored ( offset ) ;
2014-12-20 19:27:29 +00:00
// Swap slot picture
2016-01-24 18:19:30 +00:00
getQuickFiller ( SlotPictureBoxes [ pkm_from_slot ] , pk ) ;
2014-12-20 19:27:29 +00:00
2014-12-20 22:44:17 +00:00
// Swap slot data to source
2015-10-24 03:13:32 +00:00
SAV . setPK6Stored ( pk , pkm_from_offset ) ;
2014-12-20 19:27:29 +00:00
}
2014-12-20 22:44:17 +00:00
// Copy from temp slot to new.
2015-10-24 03:13:32 +00:00
SAV . setEK6Stored ( pkm_from , offset ) ;
2016-01-24 18:19:30 +00:00
getQuickFiller ( SlotPictureBoxes [ slot ] , new PK6 ( PKX . decryptArray ( pkm_from ) ) ) ;
2014-12-20 22:44:17 +00:00
2014-11-30 18:59:10 +00:00
pkm_from_offset = 0 ; // Clear offset value
}
2014-12-20 19:27:29 +00:00
2015-10-24 23:33:44 +00:00
SAV . Edited = true ;
2014-11-26 04:43:02 +00:00
}
private void pbBoxSlot_DragEnter ( object sender , DragEventArgs e )
{
2015-11-22 19:03:38 +00:00
if ( e . AllowedEffect = = ( DragDropEffects . Copy | DragDropEffects . Link ) ) // external file
e . Effect = DragDropEffects . Copy ;
else if ( e . Data ! = null ) // within
2014-11-26 04:43:02 +00:00
e . Effect = DragDropEffects . Move ;
}
2015-10-24 23:33:44 +00:00
private byte [ ] pkm_from = ( byte [ ] ) blankEK6 . Clone ( ) ;
2015-03-11 01:44:51 +00:00
private int pkm_from_offset ;
2014-12-20 19:27:29 +00:00
private int pkm_from_slot = - 1 ;
2014-12-13 22:48:34 +00:00
#endregion
2014-06-28 21:22:05 +00:00
}
2015-03-03 17:11:21 +00:00
}