2014-06-28 21:22:05 +00:00
using System ;
using System.Collections.Generic ;
using System.ComponentModel ;
using System.Data ;
using System.Drawing ;
using System.Drawing.Imaging ;
using System.Linq ;
using System.Text ;
using System.Windows.Forms ;
using System.IO ;
using System.Security.Cryptography ;
using System.Globalization ;
using System.Threading ;
using System.Text.RegularExpressions ;
namespace PKHeX
{
public partial class Form1 : Form
{
public Form1 ( )
{
#region Pop open a splash screen while we load up .
Thread SplashSCR = new Thread ( ( ) = > new SplashScreen ( this ) . ShowDialog ( ) ) ;
SplashSCR . Start ( ) ;
#endregion
#region Initialize Form
InitializeComponent ( ) ;
// Get Default White Color (for some users who have different color schemes
CB_ExtraBytes . SelectedIndex = 0 ;
// Resize Main Window to PKX Editing Mode
2014-07-29 22:33:22 +00:00
largeWidth = this . Width ;
2014-07-31 22:06:48 +00:00
shortWidth = ( Width * ( 30500 / 620 ) ) / 100 + 1 ;
2014-07-29 22:33:22 +00:00
Width = shortWidth ;
2014-06-28 21:22:05 +00:00
#endregion
#region Language Detection before loading
// Set up Language Selection
string [ ] main_langlist = new string [ ]
{
"English" , // ENG
"日本語" , // JPN
"Français" , // FRE
"Italiano" , // ITA
"Deutsch" , // GER
"Español" , // SPA
"한국어" , // KOR
2014-12-08 01:40:00 +00:00
"中文" , // CHN
2014-06-28 21:22:05 +00:00
} ;
int [ ] main_langnum = new int [ ]
2014-12-08 01:40:00 +00:00
{ 2 , 1 , 3 , 4 , 5 , 7 , 8 , 9 } ;
string [ ] lang_val = { "en" , "ja" , "fr" , "it" , "de" , "es" , "ko" , "zh" } ;
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < main_langlist . Length ; i + + )
{
cbItem item = new cbItem ( ) ;
item . Text = main_langlist [ i ] ;
item . Value = main_langnum [ i ] ;
CB_MainLanguage . Items . Add ( item ) ;
}
// Try and detect the language
string filename = Path . GetFileNameWithoutExtension ( System . Diagnostics . Process . GetCurrentProcess ( ) . MainModule . FileName ) ;
string lastTwoChars = filename . Substring ( filename . Length - 2 ) ;
2014-08-18 22:23:46 +00:00
int lang = Array . IndexOf ( main_langnum , Array . IndexOf ( lang_val , lastTwoChars ) ) ;
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
if ( lang > = 0 )
CB_MainLanguage . SelectedIndex = main_langnum [ lang ] ;
2014-08-18 22:23:46 +00:00
else if ( lastTwoChars = = "jp" )
CB_MainLanguage . SelectedIndex = 1 ;
2014-06-28 21:22:05 +00:00
else
CB_MainLanguage . SelectedIndex = 0 ;
2014-08-17 01:42:51 +00:00
2014-08-15 22:28:33 +00:00
#region HaX
2014-11-25 03:53:10 +00:00
HaX = ( filename . IndexOf ( "HaX" ) > = 0 ) ;
2014-08-15 04:27:53 +00:00
{
CHK_HackedStats . Enabled = CHK_HackedStats . Visible =
DEV_Ability . Enabled = DEV_Ability . Visible =
MT_Level . Enabled = MT_Level . Visible =
TB_AbilityNumber . Visible =
2014-08-15 22:28:33 +00:00
MT_Form . Enabled = MT_Form . Visible = HaX ;
2014-06-28 21:22:05 +00:00
2014-08-15 04:27:53 +00:00
TB_Level . Visible =
2014-08-15 22:28:33 +00:00
CB_Ability . Visible = ! HaX ;
2014-08-15 04:27:53 +00:00
}
2014-08-15 22:28:33 +00:00
#endregion
2014-06-28 21:22:05 +00:00
#endregion
#region Localize & Populate
InitializeStrings ( ) ;
// Initialize Fields
InitializeFields ( ) ;
#endregion
2014-11-05 06:55:44 +00:00
#region Add ContextMenus to the PictureBoxes ( PKX slots )
2014-06-28 21:22:05 +00:00
PictureBox [ ] pba = {
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 ,
2014-07-26 21:56:06 +00:00
ppkx1 , ppkx2 , ppkx3 , ppkx4 , ppkx5 , ppkx6 ,
2014-06-28 21:22:05 +00:00
} ;
ContextMenuStrip mnu = new ContextMenuStrip ( ) ;
2014-11-05 06:55:44 +00:00
ToolStripMenuItem mnuView = new ToolStripMenuItem ( "View" ) ;
2014-06-28 21:22:05 +00:00
ToolStripMenuItem mnuSet = new ToolStripMenuItem ( "Set" ) ;
ToolStripMenuItem mnuDelete = new ToolStripMenuItem ( "Delete" ) ;
//Assign event handlers
mnuView . Click + = new EventHandler ( rcmView_Click ) ;
mnuSet . Click + = new EventHandler ( rcmSet_Click ) ;
mnuDelete . Click + = new EventHandler ( rcmDelete_Click ) ;
//Add to main context menu
mnu . Items . AddRange ( new ToolStripItem [ ] { mnuView , mnuSet , mnuDelete } ) ;
//Assign to datagridview
for ( int i = 0 ; i < pba . Length ; i + + )
pba [ i ] . ContextMenuStrip = mnu ;
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
// Add ContextMenus to the PictureBoxes that are read only
PictureBox [ ] pba2 = {
bbpkx1 , bbpkx2 , bbpkx3 , bbpkx4 , bbpkx5 , bbpkx6 ,
dcpkx1 , dcpkx2 , gtspkx , fusedpkx , subepkx1 , subepkx2 , subepkx3 ,
} ;
ContextMenuStrip mnu2 = new ContextMenuStrip ( ) ;
ToolStripMenuItem mnu2View = new ToolStripMenuItem ( "View" ) ;
//Assign event handlers
mnu2View . Click + = new EventHandler ( rcmView_Click ) ;
//Add to main context menu
mnu2 . Items . AddRange ( new ToolStripItem [ ] { mnu2View } ) ;
//Assign to datagridview
for ( int i = 0 ; i < pba2 . Length ; i + + )
pba2 [ i ] . ContextMenuStrip = mnu2 ;
#endregion
#region Enable Drag and Drop on the form & tab control .
this . tabMain . AllowDrop = true ;
this . DragEnter + = new DragEventHandler ( tabMain_DragEnter ) ;
this . DragDrop + = new DragEventHandler ( tabMain_DragDrop ) ;
// Enable Drag and Drop on each tab.
this . tabMain . DragEnter + = new DragEventHandler ( tabMain_DragEnter ) ;
this . tabMain . DragDrop + = new DragEventHandler ( tabMain_DragDrop ) ;
TabPage [ ] tca = { Tab_Main , Tab_Met , Tab_Stats , Tab_Attacks , Tab_OTMisc } ;
for ( int i = 0 ; i < tca . Length ; i + + )
{
tca [ i ] . DragEnter + = new DragEventHandler ( tabMain_DragEnter ) ;
tca [ i ] . DragDrop + = new DragEventHandler ( tabMain_DragDrop ) ;
}
// Export D&D
dragout . MouseDown + = new MouseEventHandler ( dragout_MouseDown ) ;
dragout . DragOver + = new DragEventHandler ( dragout_DragOver ) ;
eragout . MouseDown + = new MouseEventHandler ( dragout_MouseDown ) ;
eragout . DragOver + = new DragEventHandler ( dragout_DragOver ) ;
// ToolTips for Drag&Drop
ToolTip dragoutTip1 = new ToolTip ( ) ;
ToolTip dragoutTip2 = new ToolTip ( ) ;
dragoutTip1 . SetToolTip ( dragout , "PK6 QuickSave" ) ;
dragoutTip2 . SetToolTip ( eragout , "EK6 QuickSave" ) ;
2014-11-26 04:43:02 +00:00
// Box Drag & Drop
for ( int i = 0 ; i < 30 ; i + + )
pba [ i ] . AllowDrop = true ;
tabMain . AllowDrop = true ;
2014-06-28 21:22:05 +00:00
#endregion
#region Finish Up
// Default Selected Items
C_BoxSelect . SelectedIndex = 0 ;
CB_PPu1 . SelectedIndex = CB_PPu2 . SelectedIndex = CB_PPu3 . SelectedIndex = CB_PPu4 . SelectedIndex = 0 ;
CB_Ball . SelectedIndex = 0 ;
2014-12-13 06:58:34 +00:00
CB_Country . SelectedIndex = 0 ;
2014-06-28 21:22:05 +00:00
2014-11-28 03:26:42 +00:00
// Load the arguments
2014-08-31 20:32:04 +00:00
string [ ] args = Environment . GetCommandLineArgs ( ) ;
2014-11-28 03:26:42 +00:00
SDFLoc = Util . GetSDFLocation ( ) ;
2014-08-31 20:32:04 +00:00
if ( args . Length > 1 )
2014-11-28 03:26:42 +00:00
openQuick ( args [ 1 ] ) ;
else if ( SDFLoc ! = null )
openQuick ( Path . Combine ( SDFLoc , "main" ) ) ;
2014-11-28 23:46:09 +00:00
else if ( File . Exists ( Util . NormalizePath ( Path . Combine ( Util . GetTempFolder ( ) , "root" + Path . DirectorySeparatorChar + "main" ) ) ) )
openQuick ( Util . NormalizePath ( Path . Combine ( Util . GetTempFolder ( ) , "root" + Path . DirectorySeparatorChar + "main" ) ) ) ;
2014-08-31 20:32:04 +00:00
2014-12-12 05:44:05 +00:00
TB_Nickname . Font = PKX . getPKXFont ( 11F ) ;
2014-06-28 21:22:05 +00:00
// Close splash screen.
2014-12-12 05:44:05 +00:00
init = true ;
2014-06-28 21:22:05 +00:00
SplashSCR . Join ( ) ;
this . BringToFront ( ) ;
this . WindowState = FormWindowState . Minimized ;
this . Show ( ) ;
this . WindowState = FormWindowState . Normal ;
2014-10-25 22:52:24 +00:00
if ( HaX )
2014-12-11 06:50:40 +00:00
Util . Alert ( "Illegal mode activated." , "Please behave." ) ;
2014-06-28 21:22:05 +00:00
#endregion
}
#region Global Variables : Always Visible !
2014-12-12 05:44:05 +00:00
public byte [ ] buff = new byte [ 260 ] ;
public byte [ ] savefile = new byte [ 0x100000 ] ;
public byte [ ] cyberSAV = new byte [ 0x65600 ] ;
2014-11-15 05:08:00 +00:00
public bool savegame_oras = false ;
2014-07-26 21:56:06 +00:00
public bool cybergadget = false ;
2014-12-05 03:19:53 +00:00
public bool savLoaded = false ;
2014-06-28 21:22:05 +00:00
public int gt = 258 ;
public int genderflag , species ;
public int savindex ;
public bool savedited ;
2014-11-28 03:26:42 +00:00
public string SDFLoc = null ;
2014-11-25 03:53:10 +00:00
public bool HaX = false ;
2014-10-10 02:59:57 +00:00
public static int colorizedbox = 32 ;
public static Image colorizedcolor = null ;
public static int colorizedslot = 0 ;
public static int largeWidth , shortWidth = 0 ;
public static string eggname = "" ;
2014-12-04 01:26:12 +00:00
public static string [ ] gendersymbols = { "♂" , "♀" , "-" } ;
2014-10-10 02:59:57 +00:00
public static string [ ] specieslist = { } ;
public static string [ ] movelist = { } ;
public static string [ ] itemlist = { } ;
public static string [ ] abilitylist = { } ;
public static string [ ] types = { } ;
public static string [ ] natures = { } ;
public static string [ ] characteristics = { } ;
public static string [ ] memories = { } ;
public static string [ ] genloc = { } ;
public static string [ ] forms = { } ;
public static string [ ] metHGSS_00000 = { } ;
public static string [ ] metHGSS_02000 = { } ;
public static string [ ] metHGSS_03000 = { } ;
public static string [ ] metBW2_00000 = { } ;
public static string [ ] metBW2_30000 = { } ;
public static string [ ] metBW2_40000 = { } ;
public static string [ ] metBW2_60000 = { } ;
public static string [ ] metXY_00000 = { } ;
public static string [ ] metXY_30000 = { } ;
public static string [ ] metXY_40000 = { } ;
public static string [ ] metXY_60000 = { } ;
public static string [ ] trainingbags = { } ;
public static string [ ] trainingstage = { } ;
public static string [ ] wallpapernames = { } ;
public static string [ ] puffs = { } ;
public static string [ ] itempouch = { } ;
public static int [ ] speciesability = { } ;
public static int [ ] saveoffsets = { } ;
public static string origintrack ;
public static string curlanguage ;
2014-06-28 21:22:05 +00:00
public volatile bool init = false ;
public ToolTip Tip1 = new ToolTip ( ) ;
public ToolTip Tip2 = new ToolTip ( ) ;
public ToolTip Tip3 = new ToolTip ( ) ;
public SaveGames . SaveStruct SaveGame = new SaveGames . SaveStruct ( "XY" ) ;
#endregion
2014-08-31 20:32:04 +00:00
2014-06-28 21:22:05 +00:00
#region //// PKX WINDOW FUNCTIONS ////
private void InitializeFields ( )
{
// Initialize Fields
{
#region var tables
var language_list = new [ ] {
new { Text = "ENG (English)" , Value = 2 } ,
new { Text = "JPN (日本語)" , Value = 1 } ,
new { Text = "FRE (Français)" , Value = 3 } ,
new { Text = "ITA (Italiano)" , Value = 4 } ,
new { Text = "GER (Deutsch)" , Value = 5 } ,
new { Text = "ESP (Español)" , Value = 7 } ,
new { Text = "KOR (한국어)" , Value = 8 }
} ;
var dsregion_list = new [ ] {
new { Text = "Americas (NA/SA)" , Value = 1 } ,
new { Text = "Europe (EU)" , Value = 2 } ,
new { Text = "Japan (日本)" , Value = 0 } ,
new { Text = "China (中国)" , Value = 4 } ,
new { Text = "Korea (한국)" , Value = 5 } ,
new { Text = "Taiwan (臺灣)" , Value = 6 }
} ;
#endregion
// Set ComboBox Fields
CB_3DSReg . DataSource = dsregion_list ;
CB_3DSReg . DisplayMember = "Text" ;
CB_3DSReg . ValueMember = "Value" ;
CB_Language . DataSource = language_list ;
CB_Language . DisplayMember = "Text" ;
CB_Language . ValueMember = "Value" ;
2014-12-13 06:58:34 +00:00
2014-06-28 21:22:05 +00:00
InitializeLanguage ( ) ;
}
// Finish setting up the ComboBoxes
CB_Ball . SelectedIndex = 0 ;
CB_GameOrigin . SelectedIndex = 0 ;
// Now that the ComboBoxes are ready, load the data.
2014-10-10 02:59:57 +00:00
populateFields ( buff ) ;
2014-06-28 21:22:05 +00:00
{
TB_OT . Text = "PKHeX" ;
TB_TID . Text = 12345. ToString ( ) ;
TB_SID . Text = 54321. ToString ( ) ;
}
2014-11-23 22:23:40 +00:00
updateAbilityList ( TB_AbilityNumber , Util . getIndex ( CB_Species ) , CB_Ability , CB_Form ) ;
2014-06-28 21:22:05 +00:00
}
private void InitializeLanguage ( )
{
2014-12-13 06:58:34 +00:00
#region Countries
setCountrySubRegion ( CB_Country , "countries" ) ;
#endregion
2014-06-28 21:22:05 +00:00
#region Balls
{
// Allowed Balls
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 } ;
// Set up
List < cbItem > ball_list = new List < cbItem > ( ) ;
for ( int i = 4 ; i > 1 ; i - - ) // add 4,3,2
{
// First 3 Balls are always first
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = itemlist [ i ] ;
ncbi . Value = i ;
ball_list . Add ( ncbi ) ;
}
// Sort the Rest based on String Name
string [ ] ballnames = new string [ ball_nums . Length ] ;
for ( int i = 0 ; i < ball_nums . Length ; i + + )
ballnames [ i ] = itemlist [ ball_nums [ i ] ] ;
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
string [ ] sortedballs = new string [ ball_nums . Length ] ;
Array . Copy ( ballnames , sortedballs , ballnames . Length ) ;
Array . Sort ( sortedballs ) ;
// Add the rest of the balls
for ( int i = 0 ; i < sortedballs . Length ; i + + )
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = sortedballs [ i ] ;
ncbi . Value = ball_vals [ Array . IndexOf ( ballnames , sortedballs [ i ] ) ] ;
ball_list . Add ( ncbi ) ;
}
CB_Ball . DisplayMember = "Text" ;
CB_Ball . ValueMember = "Value" ;
CB_Ball . DataSource = ball_list ;
}
#endregion
#region Held Items
{
// List of valid items to hold
int [ ] item_nums = {
000 , 001 , 002 , 003 , 004 , 005 , 006 , 007 , 008 , 009 , 010 , 011 , 012 , 013 , 014 , 015 , 017 , 018 , 019 , 020 , 021 , 022 , 023 , 024 , 025 , 026 , 027 , 028 , 029 , 030 , 031 , 032 , 033 , 034 , 035 ,
036 , 037 , 038 , 039 , 040 , 041 , 042 , 043 , 044 , 045 , 046 , 047 , 048 , 049 , 050 , 051 , 052 , 053 , 054 , 055 , 056 , 057 , 058 , 059 , 060 , 061 , 062 , 063 , 064 , 065 , 066 , 067 , 068 , 069 , 070 ,
071 , 072 , 073 , 074 , 075 , 076 , 077 , 078 , 079 , 080 , 081 , 082 , 083 , 084 , 085 , 086 , 087 , 088 , 089 , 090 , 091 , 092 , 093 , 094 , 099 , 100 , 101 , 102 , 103 , 104 , 105 , 106 , 107 , 108 , 109 ,
110 , 112 , 116 , 117 , 118 , 119 , 134 , 135 , 136 , 149 , 150 , 151 , 152 , 153 , 154 , 155 , 156 , 157 , 158 , 159 , 160 , 161 , 162 , 163 , 164 , 165 , 166 , 167 , 168 , 169 , 170 , 171 , 172 , 173 , 174 ,
175 , 176 , 177 , 178 , 179 , 180 , 181 , 182 , 183 , 184 , 185 , 186 , 187 , 188 , 189 , 190 , 191 , 192 , 193 , 194 , 195 , 196 , 197 , 198 , 199 , 200 , 201 , 202 , 203 , 204 , 205 , 206 , 207 , 208 , 209 ,
2014-08-03 05:15:47 +00:00
210 , 211 , 212 , 213 , 214 , 215 , 217 , 218 , 219 , 220 , 221 , 222 , 223 , 224 , 225 , 226 , 227 , 228 , 229 , 230 , 231 , 232 , 233 , 234 , 235 , 236 , 237 , 238 , 239 , 240 , 241 , 242 , 243 , 244 ,
2014-06-28 21:22:05 +00:00
245 , 246 , 247 , 248 , 249 , 250 , 251 , 252 , 253 , 254 , 255 , 256 , 257 , 258 , 259 , 260 , 261 , 262 , 263 , 264 , 265 , 266 , 267 , 268 , 269 , 270 , 271 , 272 , 273 , 274 , 275 , 276 , 277 , 278 , 279 ,
280 , 281 , 282 , 283 , 284 , 285 , 286 , 287 , 288 , 289 , 290 , 291 , 292 , 293 , 294 , 295 , 296 , 297 , 298 , 299 , 300 , 301 , 302 , 303 , 304 , 305 , 306 , 307 , 308 , 309 , 310 , 311 , 312 , 313 , 314 ,
315 , 316 , 317 , 318 , 319 , 320 , 321 , 322 , 323 , 324 , 325 , 326 , 327 , 504 , 537 , 538 , 539 , 540 , 541 , 542 , 543 , 544 , 545 , 546 , 547 , 548 , 549 , 550 , 551 , 552 , 553 , 554 , 555 , 556 , 557 ,
558 , 559 , 560 , 561 , 562 , 563 , 564 , 565 , 566 , 567 , 568 , 569 , 570 , 571 , 572 , 573 , 577 , 580 , 581 , 582 , 583 , 584 , 585 , 586 , 587 , 588 , 589 , 590 , 591 , 639 , 640 , 644 , 645 , 646 , 647 ,
648 , 649 , 650 , 652 , 653 , 654 , 655 , 656 , 657 , 658 , 659 , 660 , 661 , 662 , 663 , 664 , 665 , 666 , 667 , 668 , 669 , 670 , 671 , 672 , 673 , 674 , 675 , 676 , 677 , 678 , 679 , 680 , 681 , 682 , 683 ,
684 , 685 , 686 , 687 , 688 , 699 , 704 , 708 , 709 , 710 , 711 , 715 ,
2014-11-15 05:08:00 +00:00
// Appended ORAS Items (Orbs & Mega Stones)
2014-11-19 06:35:39 +00:00
534 , 535 ,
752 , 753 , 754 , 755 , 756 , 757 , 758 , 759 , 760 , 761 , 762 , 763 , 764 , 767 , 768 , 769 , 770 ,
2014-11-15 05:08:00 +00:00
} ;
if ( DEV_Ability . Enabled ) // allow all items to be selected
2014-08-15 04:27:53 +00:00
{
item_nums = new int [ itemlist . Length ] ;
for ( int i = 0 ; i < itemlist . Length ; i + + )
item_nums [ i ] = i ;
}
2014-06-28 21:22:05 +00:00
List < cbItem > item_list = new List < cbItem > ( ) ;
// Sort the Rest based on String Name
string [ ] itemnames = new string [ item_nums . Length ] ;
for ( int i = 0 ; i < item_nums . Length ; i + + )
itemnames [ i ] = itemlist [ item_nums [ i ] ] ;
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
string [ ] sorteditems = new string [ item_nums . Length ] ;
Array . Copy ( itemnames , sorteditems , itemnames . Length ) ;
Array . Sort ( sorteditems ) ;
// Add the rest of the items
for ( int i = 0 ; i < sorteditems . Length ; i + + )
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = sorteditems [ i ] ;
ncbi . Value = item_nums [ Array . IndexOf ( itemnames , sorteditems [ i ] ) ] ;
item_list . Add ( ncbi ) ;
}
CB_HeldItem . DisplayMember = "Text" ;
CB_HeldItem . ValueMember = "Value" ;
CB_HeldItem . DataSource = item_list ;
}
#endregion
#region Species
{
List < cbItem > species_list = new List < cbItem > ( ) ;
// Sort the Rest based on String Name
string [ ] sortedspecies = new string [ specieslist . Length ] ;
Array . Copy ( specieslist , sortedspecies , specieslist . Length ) ;
Array . Sort ( sortedspecies ) ;
// Add the rest of the items
for ( int i = 0 ; i < sortedspecies . Length ; i + + )
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = sortedspecies [ i ] ;
ncbi . Value = Array . IndexOf ( specieslist , sortedspecies [ i ] ) ;
species_list . Add ( ncbi ) ;
}
CB_Species . DisplayMember = "Text" ;
CB_Species . ValueMember = "Value" ;
CB_Species . DataSource = species_list ;
}
#endregion
2014-08-17 01:42:51 +00:00
#region HAX Ability
2014-08-15 04:27:53 +00:00
{
List < cbItem > ability_list = new List < cbItem > ( ) ;
// Sort the Rest based on String Name
string [ ] sortedability = new string [ abilitylist . Length ] ;
Array . Copy ( abilitylist , sortedability , abilitylist . Length ) ;
Array . Sort ( sortedability ) ;
// Add the rest of the items
for ( int i = 0 ; i < sortedability . Length ; i + + )
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = sortedability [ i ] ;
ncbi . Value = Array . IndexOf ( abilitylist , sortedability [ i ] ) ;
ability_list . Add ( ncbi ) ;
}
DEV_Ability . DisplayMember = "Text" ;
DEV_Ability . ValueMember = "Value" ;
DEV_Ability . DataSource = ability_list ;
}
#endregion
2014-06-28 21:22:05 +00:00
#region Natures
{
List < cbItem > natures_list = new List < cbItem > ( ) ;
// Sort the Rest based on String Name
string [ ] sortednatures = new string [ natures . Length ] ;
Array . Copy ( natures , sortednatures , natures . Length ) ;
Array . Sort ( sortednatures ) ;
// Add the rest of the items
for ( int i = 0 ; i < sortednatures . Length ; i + + )
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = sortednatures [ i ] ;
ncbi . Value = Array . IndexOf ( natures , sortednatures [ i ] ) ;
natures_list . Add ( ncbi ) ;
}
CB_Nature . DisplayMember = "Text" ;
CB_Nature . ValueMember = "Value" ;
CB_Nature . DataSource = natures_list ;
}
#endregion
#region Moves
{
List < cbItem > move_list = new List < cbItem > ( ) ;
// Sort the Rest based on String Name
string [ ] sortedmoves = new string [ movelist . Length ] ;
Array . Copy ( movelist , sortedmoves , movelist . Length ) ;
Array . Sort ( sortedmoves ) ;
// Add the rest of the items
for ( int i = 0 ; i < sortedmoves . Length ; i + + )
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = sortedmoves [ i ] ;
ncbi . Value = Array . IndexOf ( movelist , sortedmoves [ i ] ) ;
move_list . Add ( ncbi ) ;
}
CB_Move1 . DisplayMember = CB_Move2 . DisplayMember = CB_Move3 . DisplayMember = CB_Move4 . DisplayMember = "Text" ;
CB_RelearnMove1 . DisplayMember = CB_RelearnMove2 . DisplayMember = CB_RelearnMove3 . DisplayMember = CB_RelearnMove4 . DisplayMember = "Text" ;
CB_Move1 . ValueMember = CB_Move2 . ValueMember = CB_Move3 . ValueMember = CB_Move4 . ValueMember = "Value" ;
CB_RelearnMove1 . ValueMember = CB_RelearnMove2 . ValueMember = CB_RelearnMove3 . ValueMember = CB_RelearnMove4 . ValueMember = "Value" ;
var move1_list = new BindingSource ( move_list , null ) ;
CB_Move1 . DataSource = move1_list ;
var move2_list = new BindingSource ( move_list , null ) ;
CB_Move2 . DataSource = move2_list ;
var move3_list = new BindingSource ( move_list , null ) ;
CB_Move3 . DataSource = move3_list ;
var move4_list = new BindingSource ( move_list , null ) ;
CB_Move4 . DataSource = move4_list ;
var eggmove1_list = new BindingSource ( move_list , null ) ;
CB_RelearnMove1 . DataSource = eggmove1_list ;
var eggmove2_list = new BindingSource ( move_list , null ) ;
CB_RelearnMove2 . DataSource = eggmove2_list ;
var eggmove3_list = new BindingSource ( move_list , null ) ;
CB_RelearnMove3 . DataSource = eggmove3_list ;
var eggmove4_list = new BindingSource ( move_list , null ) ;
CB_RelearnMove4 . DataSource = eggmove4_list ;
}
#endregion
#region Encounter Types
var EncounterType = new [ ] {
new { Text = "None" , Value = 0 } ,
new { Text = "Tall Grass" , Value = 2 } ,
new { Text = "Dialga/Palkia" , Value = 4 } ,
new { Text = "Cave/Hall of Origin" , Value = 5 } ,
new { Text = "Surfing/Fishing" , Value = 7 } ,
new { Text = "Building" , Value = 9 } ,
new { Text = "Marsh/Safari" , Value = 10 } ,
new { Text = "Starter/Fossil/Gift" , Value = 24 }
} ;
CB_EncounterType . DataSource = EncounterType ;
CB_EncounterType . DisplayMember = "Text" ;
CB_EncounterType . ValueMember = "Value" ;
#endregion
#region Games
List < cbItem > origin_list = new List < cbItem > ( ) ;
// lazy text table... 8 columns
string [ ] langlistorigin = new string [ ] {
2014-12-08 01:40:00 +00:00
// ID // EN // JP // FR // IT // DE // ES // KO // ZH
"27" , "OR" , "OR" , "OR" , "OR" , "OR" , "OR" , "OR" , "OR" ,
"26" , "AS" , "AS" , "AS" , "AS" , "AS" , "AS" , "AS" , "AS" ,
"24" , "X" , "X" , "X" , "X" , "X" , "X" , "X" , "X" ,
"25" , "Y" , "Y" , "Y" , "Y" , "Y" , "Y" , "Y" , "Y" ,
"20" , "White" , "ホワイト" , "Blanche" , "Bianca" , "Weiße" , "Blanca" , "화이트" , "ホワイト" ,
"21" , "Black" , "ブラック" , "Noire" , "Nera" , "Schwarze" , "Negra" , "블랙" , "ブラック" ,
"22" , "White2" , "ホワイト2" , "Blanche 2" , "Bianca2" , "Weiße2" , "Blanca2" , "화이트2" , "ホワイト2" ,
"23" , "Black2" , "ブラック2" , "Noire 2" , "Nera2" , "Schwarze2" , "Negra2" , "블랙2" , "ブラック2" ,
"10" , "Diamond" , "ダイヤモンド" , "Diamant" , "Diamante" , "Diamant" , "Diamante" , "디아루가" , "ダイヤモンド" ,
"11" , "Pearl" , "パール" , "Perle" , "Perla" , "Perl" , "Perla" , "펄기아" , "パール" ,
"12" , "Platinum" , "プラチナ" , "Platine" , "Platino" , "Platin" , "Platino" , "Pt 기라티나" , "プラチナ" ,
"7" , "HeartGold" , "ハートゴールド" , "Or HeartGold" , "HeartGold" , "HeartGold" , "HeartGold" , "하트골드" , "ハートゴールド" ,
"8" , "SoulSilver" , "ソウルシルバー " , "Argent SoulSilver" , "SoulSilver" , "SoulSilver" , "SoulSilver" , "소울실버" , "ソウルシルバー " ,
"2" , "Ruby" , "ルビー" , "Rubis" , "Rubino" , "Rubin" , "Rubí" , "루비" , "ルビー" ,
"1" , "Sapphire" , "サファイア" , "Saphir" , "Zaffiro" , "Saphir" , "Zafiro" , "사파이어" , "サファイア" ,
"3" , "Emerald" , "エメラルド" , "Émeraude" , "Smeraldo" , "Smaragd" , "Esmeralda" , "에메랄드" , "エメラルド" ,
"4" , "FireRed" , "ファイアレッド" , "Rouge Feu" , "Rosso Fuoco" , "Feuerrote " , "Rojo Fuego" , "파이어레드" , "ファイアレッド" ,
"5" , "LeafGreen" , "リーフグリーン" , "Vert Feuille" , "Verde Foglia" , "Blattgrüne " , "Verde Hoja" , "리프그린" , "リーフグリーン" ,
"15" , "Colosseum/XD" , "コロシアム/XD" , "Colosseum/XD" , "Colosseo/XD" , "Kolosseum/XD" , "Colosseum/XD" , "세움/XD" , "コロシアム/XD" ,
2014-06-28 21:22:05 +00:00
} ;
// populate the list
2014-12-08 01:40:00 +00:00
for ( int i = 0 ; i < langlistorigin . Length / 9 ; i + + )
2014-06-28 21:22:05 +00:00
{
cbItem item = new cbItem ( ) ;
2014-12-08 01:40:00 +00:00
item . Text = langlistorigin [ i * 9 + CB_MainLanguage . SelectedIndex + 1 ] ;
item . Value = Convert . ToInt32 ( langlistorigin [ i * 9 ] ) ;
2014-06-28 21:22:05 +00:00
origin_list . Add ( item ) ;
}
2014-11-27 20:15:32 +00:00
/ *
* Moving the assignment of the Display and ValueMemeber to before the DataSource is assigned
as assigning the DataSource causes a onSelectedIndexChanged which causes a call
to updateOriginGame which access the SelectedValue property , but since there is no
ValueMember assigned it uses the cbItem to string method which returns the Text member
* /
CB_GameOrigin . DisplayMember = "Text" ;
CB_GameOrigin . ValueMember = "Value" ;
2014-06-28 21:22:05 +00:00
CB_GameOrigin . DataSource = origin_list ;
#endregion
}
2014-10-10 02:59:57 +00:00
private void populateFields ( byte [ ] buff )
2014-06-28 21:22:05 +00:00
{
CAL_EggDate . Value = new DateTime ( 2000 , 01 , 01 ) ;
Tab_Main . Focus ( ) ;
// Encryption Constant
TB_EC . Text = BitConverter . ToUInt32 ( buff , 0 ) . ToString ( "X8" ) ;
// Block A
int species = BitConverter . ToInt16 ( buff , 0x08 ) ;
int helditem = BitConverter . ToUInt16 ( buff , 0x0A ) ;
uint TID = BitConverter . ToUInt16 ( buff , 0x0C ) ;
uint SID = BitConverter . ToUInt16 ( buff , 0x0E ) ;
uint exp = BitConverter . ToUInt32 ( buff , 0x10 ) ;
int ability = buff [ 0x14 ] ;
int abilitynum = buff [ 0x15 ] ;
// 0x16, 0x17 - unknown
uint PID = BitConverter . ToUInt32 ( buff , 0x18 ) ;
int nature = buff [ 0x1C ] ;
int feflag = buff [ 0x1D ] % 2 ;
this . genderflag = ( buff [ 0x1D ] > > 1 ) & 0x3 ;
int altforms = ( buff [ 0x1D ] > > 3 ) ;
int HP_EV = buff [ 0x1E ] ;
int ATK_EV = buff [ 0x1F ] ;
int DEF_EV = buff [ 0x20 ] ;
int SPA_EV = buff [ 0x22 ] ;
int SPD_EV = buff [ 0x23 ] ;
int SPE_EV = buff [ 0x21 ] ;
int cnt_cool = buff [ 0x24 ] ;
int cnt_beauty = buff [ 0x25 ] ;
int cnt_cute = buff [ 0x26 ] ;
int cnt_smart = buff [ 0x27 ] ;
int cnt_tough = buff [ 0x28 ] ;
int cnt_sheen = buff [ 0x29 ] ;
int markings = buff [ 0x2A ] ;
int PKRS_Strain = buff [ 0x2B ] > > 4 ;
int PKRS_Duration = buff [ 0x2B ] % 0x10 ;
// Medals and Ribbons, passed with buff to new form
// 0x2C, 0x2D, 0x2E, 0x2F
// 0x33, 0x34, 0x35, 0x36
// 0x34, 0x35, 0x36, 0x37
// 0x38, 0x39
// 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F - unused/unknown
// Block B
2014-08-31 20:32:04 +00:00
string nicknamestr = Util . TrimFromZero ( Encoding . Unicode . GetString ( buff , 0x40 , 24 ) ) ;
2014-06-28 21:22:05 +00:00
// 0x58, 0x59 - unused
int move1 = BitConverter . ToInt16 ( buff , 0x5A ) ;
int move2 = BitConverter . ToInt16 ( buff , 0x5C ) ;
int move3 = BitConverter . ToInt16 ( buff , 0x5E ) ;
int move4 = BitConverter . ToInt16 ( buff , 0x60 ) ;
int move1_pp = buff [ 0x62 ] ;
int move2_pp = buff [ 0x63 ] ;
int move3_pp = buff [ 0x64 ] ;
int move4_pp = buff [ 0x65 ] ;
int move1_ppu = buff [ 0x66 ] ;
int move2_ppu = buff [ 0x67 ] ;
int move3_ppu = buff [ 0x68 ] ;
int move4_ppu = buff [ 0x69 ] ;
int eggmove1 = BitConverter . ToInt16 ( buff , 0x6A ) ;
int eggmove2 = BitConverter . ToInt16 ( buff , 0x6C ) ;
int eggmove3 = BitConverter . ToInt16 ( buff , 0x6E ) ;
int eggmove4 = BitConverter . ToInt16 ( buff , 0x70 ) ;
// 0x72 - Super Training Flag - Passed with buff to new form
// 0x73 - unused/unknown
uint IV32 = BitConverter . ToUInt32 ( buff , 0x74 ) ;
uint HP_IV = IV32 & 0x1F ;
uint ATK_IV = ( IV32 > > 5 ) & 0x1F ;
uint DEF_IV = ( IV32 > > 10 ) & 0x1F ;
uint SPE_IV = ( IV32 > > 15 ) & 0x1F ;
uint SPA_IV = ( IV32 > > 20 ) & 0x1F ;
uint SPD_IV = ( IV32 > > 25 ) & 0x1F ;
uint isegg = ( IV32 > > 30 ) & 1 ;
uint isnick = ( IV32 > > 31 ) ;
// Block C
2014-08-31 20:32:04 +00:00
string notOT = Util . TrimFromZero ( Encoding . Unicode . GetString ( buff , 0x78 , 24 ) ) ;
2014-06-28 21:22:05 +00:00
bool notOTG = Convert . ToBoolean ( buff [ 0x92 ] ) ;
// Memory Editor edits everything else with buff in a new form
// Block D
2014-08-31 20:32:04 +00:00
string ot = Util . TrimFromZero ( Encoding . Unicode . GetString ( buff , 0xB0 , 24 ) ) ;
2014-06-28 21:22:05 +00:00
// 0xC8, 0xC9 - unused
int OTfriendship = buff [ 0xCA ] ;
int OTaffection = buff [ 0xCB ] ; // Handled by Memory Editor
// 0xCC, 0xCD, 0xCE, 0xCF, 0xD0
int egg_year = buff [ 0xD1 ] ;
int egg_month = buff [ 0xD2 ] ;
int egg_day = buff [ 0xD3 ] ;
int met_year = buff [ 0xD4 ] ;
int met_month = buff [ 0xD5 ] ;
int met_day = buff [ 0xD6 ] ;
// 0xD7 - unused
int eggloc = BitConverter . ToUInt16 ( buff , 0xD8 ) ;
int metloc = BitConverter . ToUInt16 ( buff , 0xDA ) ;
int ball = buff [ 0xDC ] ;
int metlevel = buff [ 0xDD ] & 0x7F ;
int otgender = ( buff [ 0xDD ] ) > > 7 ;
int encountertype = buff [ 0xDE ] ;
int gamevers = buff [ 0xDF ] ;
int countryID = buff [ 0xE0 ] ;
int regionID = buff [ 0xE1 ] ;
int dsregID = buff [ 0xE2 ] ;
int otlang = buff [ 0xE3 ] ;
// 0xE4, 0xE5, 0xE6, 0xE7 - unused
//
// Populate Fields
//
CHK_Fateful . Checked = Convert . ToBoolean ( feflag ) ;
CHK_IsEgg . Checked = Convert . ToBoolean ( isegg ) ;
CHK_Nicknamed . Checked = Convert . ToBoolean ( isnick ) ;
if ( Convert . ToBoolean ( otgender ) )
2014-12-04 01:26:12 +00:00
Label_OTGender . Text = gendersymbols [ 1 ] ;
else Label_OTGender . Text = gendersymbols [ 0 ] ;
2014-06-28 21:22:05 +00:00
// Nidoran Gender Fixing Text
if ( ! Convert . ToBoolean ( isnick ) )
{
if ( nicknamestr . Contains ( ( char ) 0xE08F ) )
nicknamestr = Regex . Replace ( nicknamestr , "\uE08F" , "\u2640" ) ;
else if ( nicknamestr . Contains ( ( char ) 0xE08E ) )
nicknamestr = Regex . Replace ( nicknamestr , "\uE08E" , "\u2642" ) ;
}
2014-10-10 02:59:57 +00:00
populateMarkings ( markings ) ;
2014-06-28 21:22:05 +00:00
TB_PID . Text = PID . ToString ( "X8" ) ;
CB_Species . SelectedValue = species ;
CB_HeldItem . SelectedValue = helditem ;
2014-11-23 22:23:40 +00:00
updateAbilityList ( TB_AbilityNumber , species , CB_Ability , CB_Form ) ;
2014-06-28 21:22:05 +00:00
TB_AbilityNumber . Text = abilitynum . ToString ( ) ;
if ( abilitynum > > 1 < 3 ) CB_Ability . SelectedIndex = abilitynum > > 1 ; // error handling
else CB_Ability . SelectedIndex = 0 ;
CB_Nature . SelectedValue = nature ;
TB_EXP . Text = exp . ToString ( ) ;
TB_TID . Text = TID . ToString ( ) ;
TB_SID . Text = SID . ToString ( ) ;
TB_OT . Text = ot ;
TB_Nickname . Text = nicknamestr ;
TB_OTt2 . Text = notOT ;
if ( buff [ 0x93 ] = = 1 ) // = 1
{
TB_Friendship . Text = buff [ 0xA2 ] . ToString ( ) ;
GB_nOT . BackColor = System . Drawing . Color . FromArgb ( 232 , 255 , 255 ) ;
GB_OT . BackColor = Color . Transparent ;
}
else // = 0
{
TB_Friendship . Text = OTfriendship . ToString ( ) ;
GB_OT . BackColor = System . Drawing . Color . FromArgb ( 232 , 255 , 255 ) ;
GB_nOT . BackColor = Color . Transparent ;
}
2014-08-01 05:36:42 +00:00
2014-06-28 21:22:05 +00:00
CB_Language . SelectedValue = otlang ;
CB_Country . SelectedValue = countryID ;
CB_SubRegion . SelectedValue = regionID ;
CB_3DSReg . SelectedValue = dsregID ;
CB_GameOrigin . SelectedValue = gamevers ;
CB_EncounterType . SelectedValue = encountertype ;
CB_Ball . SelectedValue = ball ;
if ( met_month = = 0 )
{ met_month = 1 ; }
if ( met_day = = 0 )
{ met_day = 1 ; }
2014-08-01 05:36:42 +00:00
try
2014-11-30 01:47:17 +00:00
{ CAL_MetDate . Value = new DateTime ( met_year + 2000 , met_month , met_day ) ; }
2014-08-01 05:36:42 +00:00
catch { CAL_MetDate . Value = new DateTime ( 2000 , 1 , 1 ) ; }
2014-11-30 01:47:17 +00:00
2014-06-28 21:22:05 +00:00
if ( eggloc ! = 0 )
{
// Was obtained initially as an egg.
CHK_AsEgg . Checked = true ;
GB_EggConditions . Enabled = true ;
CB_EggLocation . SelectedValue = eggloc ;
2014-08-01 05:36:42 +00:00
try
2014-11-30 01:47:17 +00:00
{ CAL_EggDate . Value = new DateTime ( egg_year + 2000 , egg_month , egg_day ) ; }
2014-08-01 05:36:42 +00:00
catch { CAL_MetDate . Value = new DateTime ( 2000 , 1 , 1 ) ; }
2014-06-28 21:22:05 +00:00
}
2014-09-23 04:05:27 +00:00
else { CHK_AsEgg . Checked = GB_EggConditions . Enabled = false ; CB_EggLocation . SelectedValue = 0 ; }
2014-06-28 21:22:05 +00:00
CB_MetLocation . SelectedValue = metloc ;
2014-12-04 01:26:12 +00:00
if ( notOTG ) Label_CTGender . Text = gendersymbols [ 1 ] ;
else Label_CTGender . Text = gendersymbols [ 0 ] ;
2014-06-28 21:22:05 +00:00
if ( TB_OTt2 . Text = = "" ) Label_CTGender . Text = "" ;
2014-11-30 01:47:17 +00:00
TB_MetLevel . Text = metlevel . ToString ( ) ;
// Reset
2014-06-28 21:22:05 +00:00
CHK_Cured . Checked = false ;
CHK_Infected . Checked = false ;
CB_PKRSStrain . SelectedIndex = PKRS_Strain ;
2014-08-01 05:36:42 +00:00
CB_PKRSDays . SelectedIndex = Math . Min ( ( PKRS_Duration & 0x7 ) , 4 ) ; // to strip out bad hacked 'rus
2014-06-28 21:22:05 +00:00
if ( PKRS_Strain > 0 )
{
CHK_Infected . Checked = true ;
if ( PKRS_Duration = = 0 )
CHK_Cured . Checked = true ;
}
2014-08-01 05:36:42 +00:00
// Do it again now that our comboboxes should be properly set?
2014-06-28 21:22:05 +00:00
CB_PKRSStrain . SelectedIndex = PKRS_Strain ;
2014-08-01 05:36:42 +00:00
CB_PKRSDays . SelectedIndex = Math . Min ( ( PKRS_Duration & 0x7 ) , 4 ) ; // to strip out bad hacked 'rus
2014-06-28 21:22:05 +00:00
TB_Cool . Text = cnt_cool . ToString ( ) ;
TB_Beauty . Text = cnt_beauty . ToString ( ) ;
TB_Cute . Text = cnt_cute . ToString ( ) ;
TB_Smart . Text = cnt_smart . ToString ( ) ;
TB_Tough . Text = cnt_tough . ToString ( ) ;
TB_Sheen . Text = cnt_sheen . ToString ( ) ;
TB_HPIV . Text = HP_IV . ToString ( ) ;
TB_ATKIV . Text = ATK_IV . ToString ( ) ;
TB_DEFIV . Text = DEF_IV . ToString ( ) ;
TB_SPAIV . Text = SPA_IV . ToString ( ) ;
TB_SPDIV . Text = SPD_IV . ToString ( ) ;
TB_SPEIV . Text = SPE_IV . ToString ( ) ;
TB_HPEV . Text = HP_EV . ToString ( ) ;
TB_ATKEV . Text = ATK_EV . ToString ( ) ;
TB_DEFEV . Text = DEF_EV . ToString ( ) ;
TB_SPAEV . Text = SPA_EV . ToString ( ) ;
TB_SPDEV . Text = SPD_EV . ToString ( ) ;
TB_SPEEV . Text = SPE_EV . ToString ( ) ;
CB_Move1 . SelectedValue = move1 ;
CB_Move2 . SelectedValue = move2 ;
CB_Move3 . SelectedValue = move3 ;
CB_Move4 . SelectedValue = move4 ;
CB_RelearnMove1 . SelectedValue = eggmove1 ;
CB_RelearnMove2 . SelectedValue = eggmove2 ;
CB_RelearnMove3 . SelectedValue = eggmove3 ;
CB_RelearnMove4 . SelectedValue = eggmove4 ;
CB_PPu1 . SelectedIndex = move1_ppu ;
CB_PPu2 . SelectedIndex = move2_ppu ;
CB_PPu3 . SelectedIndex = move3_ppu ;
CB_PPu4 . SelectedIndex = move4_ppu ;
int level ;
2014-10-10 02:59:57 +00:00
if ( Util . ToInt32 ( TB_EXP . Text ) = = 0 ) { level = 1 ; }
else level = PKX . getLevel ( species , ref exp ) ;
2014-06-28 21:22:05 +00:00
TB_Level . Text = level . ToString ( ) ;
// Setup Forms
2014-11-23 22:23:40 +00:00
setForms ( species , CB_Form ) ;
2014-07-28 06:46:12 +00:00
try
2014-11-30 01:47:17 +00:00
{ CB_Form . SelectedIndex = altforms ; }
2014-07-28 06:46:12 +00:00
catch
{
if ( CB_Form . Items . Count > 1 )
CB_Form . SelectedIndex = CB_Form . Items . Count - 1 ;
else CB_Form . SelectedIndex = 0 ;
}
2014-06-28 21:22:05 +00:00
// Load Extrabyte Value
TB_ExtraByte . Text = buff [ Convert . ToInt32 ( CB_ExtraBytes . Text , 16 ) ] . ToString ( ) ;
if ( ( TB_OTt2 . Text = = "" ) | | ( notOT = = "" ) )
Label_CTGender . Text = "" ;
2014-11-30 01:47:17 +00:00
2014-06-28 21:22:05 +00:00
// Reload Gender Flag
this . genderflag = ( ( buff [ 0x1D ] > > 1 ) & 0x3 ) ;
2014-10-10 02:59:57 +00:00
setGenderLabel ( ) ;
2014-06-28 21:22:05 +00:00
updateStats ( ) ;
2014-10-10 02:59:57 +00:00
setIsShiny ( ) ;
2014-06-28 21:22:05 +00:00
if ( init )
2014-11-30 01:47:17 +00:00
if ( ! PKX . verifychk ( buff ) )
2014-12-11 06:50:40 +00:00
Util . Alert ( "PKX File has an invalid checksum." ) ;
2014-11-30 01:47:17 +00:00
2014-06-28 21:22:05 +00:00
init = true ;
2014-08-15 04:27:53 +00:00
// DEV Illegality
DEV_Ability . SelectedValue = ability ;
MT_Level . Text = level . ToString ( ) ;
MT_Form . Text = altforms . ToString ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-10-10 02:59:57 +00:00
private void populateMarkings ( int markings )
2014-06-28 21:22:05 +00:00
{
int m1 = ( ( markings ) & 1 ) ;
int m2 = ( ( markings > > 1 ) & 1 ) ;
int m3 = ( ( markings > > 2 ) & 1 ) ;
int m4 = ( ( markings > > 3 ) & 1 ) ;
int m5 = ( ( markings > > 4 ) & 1 ) ;
int m6 = ( ( markings > > 5 ) & 1 ) ;
CHK_Circle . Checked = Convert . ToBoolean ( m1 ) ;
CHK_Triangle . Checked = Convert . ToBoolean ( m2 ) ;
CHK_Square . Checked = Convert . ToBoolean ( m3 ) ;
CHK_Heart . Checked = Convert . ToBoolean ( m4 ) ;
CHK_Star . Checked = Convert . ToBoolean ( m5 ) ;
CHK_Diamond . Checked = Convert . ToBoolean ( m6 ) ;
}
// PKX Data Calculation Functions //
2014-10-10 02:59:57 +00:00
private void setIsShiny ( )
2014-06-28 21:22:05 +00:00
{
2014-10-10 02:59:57 +00:00
uint PID = Util . getHEXval ( TB_PID ) ;
2014-06-28 21:22:05 +00:00
uint UID = ( PID > > 16 ) ;
uint LID = ( PID & 0xFFFF ) ;
uint PSV = UID ^ LID ;
2014-10-10 02:59:57 +00:00
uint TSV = Util . ToUInt32 ( TB_TID . Text ) ^ Util . ToUInt32 ( TB_SID . Text ) ;
2014-06-28 21:22:05 +00:00
uint XOR = TSV ^ PSV ;
2014-10-10 02:59:57 +00:00
int game = Util . getIndex ( CB_GameOrigin ) ;
2014-08-03 05:15:47 +00:00
if ( XOR < 16 )
2014-06-28 21:22:05 +00:00
{ // Is Shiny
BTN_Shinytize . Visible =
BTN_Shinytize . Enabled = false ;
Label_IsShiny . Visible = true ;
}
else
{ // Is Not Shiny
BTN_Shinytize . Visible =
BTN_Shinytize . Enabled = true ;
Label_IsShiny . Visible = false ;
}
2014-10-10 02:59:57 +00:00
setMarkings ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-11-23 22:23:40 +00:00
public void setForms ( int species , ComboBox cb )
2014-06-28 21:22:05 +00:00
{
// Form Tables
//
var form_unown = new [ ] {
new { Text = "A" , Value = 0 } ,
new { Text = "B" , Value = 1 } ,
new { Text = "C" , Value = 2 } ,
new { Text = "D" , Value = 3 } ,
new { Text = "E" , Value = 4 } ,
new { Text = "F" , Value = 5 } ,
new { Text = "G" , Value = 6 } ,
new { Text = "H" , Value = 7 } ,
new { Text = "I" , Value = 8 } ,
new { Text = "J" , Value = 9 } ,
new { Text = "K" , Value = 10 } ,
new { Text = "L" , Value = 11 } ,
new { Text = "M" , Value = 12 } ,
new { Text = "N" , Value = 13 } ,
new { Text = "O" , Value = 14 } ,
new { Text = "P" , Value = 15 } ,
new { Text = "Q" , Value = 16 } ,
new { Text = "R" , Value = 17 } ,
new { Text = "S" , Value = 18 } ,
new { Text = "T" , Value = 19 } ,
new { Text = "U" , Value = 20 } ,
new { Text = "V" , Value = 21 } ,
new { Text = "W" , Value = 22 } ,
new { Text = "X" , Value = 23 } ,
new { Text = "Y" , Value = 24 } ,
new { Text = "Z" , Value = 25 } ,
new { Text = "!" , Value = 26 } ,
new { Text = "?" , Value = 27 } ,
} ;
var form_castform = new [ ] {
new { Text = types [ 0 ] , Value = 0 } , // Normal
2014-11-21 23:34:10 +00:00
new { Text = forms [ 789 ] , Value = 1 } , // Sunny
new { Text = forms [ 790 ] , Value = 2 } , // Rainy
new { Text = forms [ 791 ] , Value = 3 } , // Snowy
2014-06-28 21:22:05 +00:00
} ;
var form_shellos = new [ ] {
new { Text = forms [ 422 ] , Value = 0 } , // West
2014-11-21 23:34:10 +00:00
new { Text = forms [ 811 ] , Value = 1 } , // East
2014-06-28 21:22:05 +00:00
} ;
var form_deoxys = new [ ] {
new { Text = types [ 0 ] , Value = 0 } , // Normal
2014-11-21 23:34:10 +00:00
new { Text = forms [ 802 ] , Value = 1 } , // Attack
new { Text = forms [ 803 ] , Value = 2 } , // Defense
new { Text = forms [ 804 ] , Value = 3 } , // Speed
2014-06-28 21:22:05 +00:00
} ;
var form_burmy = new [ ] {
new { Text = forms [ 412 ] , Value = 0 } , // Plant
2014-11-21 23:34:10 +00:00
new { Text = forms [ 805 ] , Value = 1 } , // Sandy
new { Text = forms [ 806 ] , Value = 2 } , // Trash
2014-06-28 21:22:05 +00:00
} ;
var form_cherrim = new [ ] {
new { Text = forms [ 421 ] , Value = 0 } , // Overcast
2014-11-21 23:34:10 +00:00
new { Text = forms [ 809 ] , Value = 1 } , // Sunshine
2014-06-28 21:22:05 +00:00
} ;
var form_rotom = new [ ] {
new { Text = types [ 0 ] , Value = 0 } , // Normal
2014-11-21 23:34:10 +00:00
new { Text = forms [ 817 ] , Value = 1 } , // Heat
new { Text = forms [ 818 ] , Value = 2 } , // Wash
new { Text = forms [ 819 ] , Value = 3 } , // Frost
new { Text = forms [ 820 ] , Value = 4 } , // Fan
new { Text = forms [ 821 ] , Value = 5 } , // Mow
2014-06-28 21:22:05 +00:00
} ;
var form_giratina = new [ ] {
new { Text = forms [ 487 ] , Value = 0 } , // Altered
2014-11-21 23:34:10 +00:00
new { Text = forms [ 822 ] , Value = 1 } , // Origin
2014-06-28 21:22:05 +00:00
} ;
var form_shaymin = new [ ] {
new { Text = forms [ 492 ] , Value = 0 } , // Land
2014-11-21 23:34:10 +00:00
new { Text = forms [ 823 ] , Value = 1 } , // Sky
2014-06-28 21:22:05 +00:00
} ;
var form_arceus = new [ ] {
new { Text = types [ 0 ] , Value = 0 } , // Normal
new { Text = types [ 1 ] , Value = 1 } , // Fighting
new { Text = types [ 2 ] , Value = 2 } , // Flying
new { Text = types [ 3 ] , Value = 3 } , // Poison
new { Text = types [ 4 ] , Value = 4 } , // etc
new { Text = types [ 5 ] , Value = 5 } ,
new { Text = types [ 6 ] , Value = 6 } ,
new { Text = types [ 7 ] , Value = 7 } ,
new { Text = types [ 8 ] , Value = 8 } ,
new { Text = types [ 9 ] , Value = 9 } ,
new { Text = types [ 10 ] , Value = 10 } ,
new { Text = types [ 11 ] , Value = 11 } ,
new { Text = types [ 12 ] , Value = 12 } ,
new { Text = types [ 13 ] , Value = 13 } ,
new { Text = types [ 14 ] , Value = 14 } ,
new { Text = types [ 15 ] , Value = 15 } ,
new { Text = types [ 16 ] , Value = 16 } ,
new { Text = types [ 17 ] , Value = 17 } ,
} ;
var form_basculin = new [ ] {
new { Text = forms [ 550 ] , Value = 0 } , // Red
2014-11-21 23:34:10 +00:00
new { Text = forms [ 842 ] , Value = 1 } , // Blue
2014-06-28 21:22:05 +00:00
} ;
var form_darmanitan = new [ ] {
new { Text = forms [ 555 ] , Value = 0 } , // Standard
2014-11-21 23:34:10 +00:00
new { Text = forms [ 843 ] , Value = 1 } , // Zen
2014-06-28 21:22:05 +00:00
} ;
var form_deerling = new [ ] {
new { Text = forms [ 585 ] , Value = 0 } , // Spring
2014-11-21 23:34:10 +00:00
new { Text = forms [ 844 ] , Value = 1 } , // Summer
new { Text = forms [ 845 ] , Value = 2 } , // Autumn
new { Text = forms [ 846 ] , Value = 3 } , // Winter
2014-06-28 21:22:05 +00:00
} ;
var form_gender = new [ ] {
2014-12-04 01:26:12 +00:00
new { Text = gendersymbols [ 0 ] , Value = 0 } , // Male
new { Text = gendersymbols [ 1 ] , Value = 1 } , // Female
2014-06-28 21:22:05 +00:00
} ;
var form_therian = new [ ] {
new { Text = forms [ 641 ] , Value = 0 } , // Incarnate
2014-11-21 23:34:10 +00:00
new { Text = forms [ 852 ] , Value = 1 } , // Therian
2014-06-28 21:22:05 +00:00
} ;
var form_kyurem = new [ ] {
new { Text = types [ 0 ] , Value = 0 } , // Normal
2014-11-21 23:34:10 +00:00
new { Text = forms [ 853 ] , Value = 1 } , // White
new { Text = forms [ 854 ] , Value = 2 } , // Black
2014-06-28 21:22:05 +00:00
} ;
var form_keldeo = new [ ] {
new { Text = forms [ 647 ] , Value = 0 } , // Ordinary
2014-11-28 17:56:29 +00:00
new { Text = forms [ 855 ] , Value = 1 } , // Resolute
2014-06-28 21:22:05 +00:00
} ;
var form_meloetta = new [ ] {
new { Text = forms [ 648 ] , Value = 0 } , // Aria
2014-11-28 17:56:29 +00:00
new { Text = forms [ 856 ] , Value = 1 } , // Pirouette
2014-06-28 21:22:05 +00:00
} ;
var form_genesect = new [ ] {
new { Text = types [ 0 ] , Value = 0 } , // Normal
2014-11-21 23:34:10 +00:00
new { Text = types [ 10 ] , Value = 1 } , // Douse
new { Text = types [ 12 ] , Value = 2 } , // Shock
new { Text = types [ 9 ] , Value = 3 } , // Burn
new { Text = types [ 14 ] , Value = 4 } , // Chill
2014-06-28 21:22:05 +00:00
} ;
var form_flabebe = new [ ] {
new { Text = forms [ 669 ] , Value = 0 } , // Red
2014-11-21 23:34:10 +00:00
new { Text = forms [ 884 ] , Value = 1 } , // Yellow
new { Text = forms [ 885 ] , Value = 2 } , // Orange
new { Text = forms [ 886 ] , Value = 3 } , // Blue
new { Text = forms [ 887 ] , Value = 4 } , // White
2014-06-28 21:22:05 +00:00
} ;
var form_floette = new [ ] {
new { Text = forms [ 669 ] , Value = 0 } , // Red
2014-11-21 23:34:10 +00:00
new { Text = forms [ 884 ] , Value = 1 } , // Yellow
new { Text = forms [ 885 ] , Value = 2 } , // Orange
new { Text = forms [ 886 ] , Value = 3 } , // Blue
new { Text = forms [ 887 ] , Value = 4 } , // White
new { Text = forms [ 888 ] , Value = 5 } , // Eternal
2014-06-28 21:22:05 +00:00
} ;
var form_furfrou = new [ ] {
new { Text = forms [ 676 ] , Value = 0 } , // Natural
2014-11-21 23:34:10 +00:00
new { Text = forms [ 893 ] , Value = 1 } , // Heart
new { Text = forms [ 894 ] , Value = 2 } , // Star
new { Text = forms [ 895 ] , Value = 3 } , // Diamond
new { Text = forms [ 896 ] , Value = 4 } , // Deputante
new { Text = forms [ 897 ] , Value = 5 } , // Matron
new { Text = forms [ 898 ] , Value = 6 } , // Dandy
new { Text = forms [ 899 ] , Value = 7 } , // La Reine
new { Text = forms [ 900 ] , Value = 8 } , // Kabuki
new { Text = forms [ 901 ] , Value = 9 } , // Pharaoh
2014-06-28 21:22:05 +00:00
} ;
var form_aegislash = new [ ] {
new { Text = forms [ 681 ] , Value = 0 } , // Shield
2014-11-21 23:34:10 +00:00
new { Text = forms [ 903 ] , Value = 1 } , // Blade
2014-06-28 21:22:05 +00:00
} ;
var form_butterfly = new [ ] {
new { Text = forms [ 666 ] , Value = 0 } , // Icy Snow
2014-11-21 23:34:10 +00:00
new { Text = forms [ 861 ] , Value = 1 } , // Polar
new { Text = forms [ 862 ] , Value = 2 } , // Tundra
new { Text = forms [ 863 ] , Value = 3 } , // Continental
new { Text = forms [ 864 ] , Value = 4 } , // Garden
new { Text = forms [ 865 ] , Value = 5 } , // Elegant
new { Text = forms [ 866 ] , Value = 6 } , // Meadow
new { Text = forms [ 867 ] , Value = 7 } , // Modern
new { Text = forms [ 868 ] , Value = 8 } , // Marine
new { Text = forms [ 869 ] , Value = 9 } , // Archipelago
new { Text = forms [ 870 ] , Value = 10 } , // High-Plains
new { Text = forms [ 871 ] , Value = 11 } , // Sandstorm
new { Text = forms [ 872 ] , Value = 12 } , // River
new { Text = forms [ 873 ] , Value = 13 } , // Monsoon
new { Text = forms [ 874 ] , Value = 14 } , // Savannah
new { Text = forms [ 875 ] , Value = 15 } , // Sun
new { Text = forms [ 876 ] , Value = 16 } , // Ocean
new { Text = forms [ 877 ] , Value = 17 } , // Jungle
new { Text = forms [ 878 ] , Value = 18 } , // Fancy
new { Text = forms [ 879 ] , Value = 19 } , // Poké Ball
2014-06-28 21:22:05 +00:00
} ;
var form_list = new [ ] {
new { Text = "" , Value = 0 } , // None
} ;
var form_pump = new [ ] {
2014-11-21 23:34:10 +00:00
new { Text = forms [ 904 ] , Value = 0 } , // Small
2014-06-28 21:22:05 +00:00
new { Text = forms [ 710 ] , Value = 1 } , // Average
2014-11-21 23:34:10 +00:00
new { Text = forms [ 905 ] , Value = 2 } , // Large
new { Text = forms [ 907 ] , Value = 3 } , // Super
2014-06-28 21:22:05 +00:00
} ;
var form_mega = new [ ] {
new { Text = types [ 0 ] , Value = 0 } , // Normal
new { Text = forms [ 723 ] , Value = 1 } , // Mega
} ;
var form_megaxy = new [ ] {
new { Text = types [ 0 ] , Value = 0 } , // Normal
2014-11-21 23:34:10 +00:00
new { Text = forms [ 724 ] , Value = 1 } , // Mega X
new { Text = forms [ 725 ] , Value = 2 } , // Mega Y
2014-06-28 21:22:05 +00:00
} ;
2014-11-15 05:08:00 +00:00
var form_primal = new [ ] {
new { Text = types [ 0 ] , Value = 0 } ,
2014-11-21 23:34:10 +00:00
new { Text = forms [ 800 ] , Value = 1 } ,
2014-11-15 05:08:00 +00:00
} ;
var form_hoopa = new [ ] {
new { Text = types [ 0 ] , Value = 0 } ,
2014-11-21 23:34:10 +00:00
new { Text = forms [ 912 ] , Value = 1 } ,
} ;
var form_pikachu = new [ ] {
2014-11-22 03:26:16 +00:00
new { Text = types [ 0 ] , Value = 0 } , // Normal
new { Text = forms [ 729 ] , Value = 1 } , // Rockstar
new { Text = forms [ 730 ] , Value = 2 } , // Belle
new { Text = forms [ 731 ] , Value = 3 } , // Pop
new { Text = forms [ 732 ] , Value = 4 } , // PhD
new { Text = forms [ 733 ] , Value = 5 } , // Libre
new { Text = forms [ 734 ] , Value = 6 } , // Cosplay
2014-11-15 05:08:00 +00:00
} ;
2014-11-23 22:23:40 +00:00
cb . DataSource = form_list ;
cb . DisplayMember = "Text" ;
cb . ValueMember = "Value" ;
2014-06-28 21:22:05 +00:00
// Mega List
2014-07-20 19:28:56 +00:00
int [ ] mspec = { // XY
2014-10-11 07:22:22 +00:00
003 , 009 , 065 , 094 , 115 , 127 , 130 , 142 , 181 , 212 , 214 , 229 , 248 , 257 , 282 , 303 , 306 , 308 , 310 , 354 , 359 , 380 , 381 , 445 , 448 , 460 ,
2014-07-20 19:28:56 +00:00
// ORAS
2014-11-19 06:35:39 +00:00
015 , 018 , 080 , 208 , 254 , 260 , 302 , 319 , 323 , 334 , 362 , 373 , 376 , 384 , 428 , 475 , 531 , 719 ,
2014-07-20 19:28:56 +00:00
} ;
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < mspec . Length ; i + + )
{
if ( mspec [ i ] = = species )
{
2014-11-23 22:23:40 +00:00
cb . DataSource = form_mega ;
cb . Enabled = true ; // Mega Form Selection
2014-06-28 21:22:05 +00:00
return ;
}
}
// MegaXY List
if ( ( species = = 6 ) | | ( species = = 150 ) )
{
2014-11-23 22:23:40 +00:00
cb . DataSource = form_megaxy ;
cb . Enabled = true ; // Mega Form Selection
2014-06-28 21:22:05 +00:00
return ;
}
// Regular Form List
2014-11-22 03:26:16 +00:00
if ( species = = 025 ) { form_list = form_pikachu ; }
else if ( species = = 201 ) { form_list = form_unown ; }
2014-06-28 21:22:05 +00:00
else if ( species = = 351 ) { form_list = form_castform ; }
else if ( species = = 386 ) { form_list = form_deoxys ; }
else if ( species = = 421 ) { form_list = form_cherrim ; }
else if ( species = = 479 ) { form_list = form_rotom ; }
else if ( species = = 487 ) { form_list = form_giratina ; }
else if ( species = = 492 ) { form_list = form_shaymin ; }
else if ( species = = 493 ) { form_list = form_arceus ; }
else if ( species = = 550 ) { form_list = form_basculin ; }
else if ( species = = 555 ) { form_list = form_darmanitan ; }
else if ( species = = 646 ) { form_list = form_kyurem ; }
else if ( species = = 647 ) { form_list = form_keldeo ; }
else if ( species = = 648 ) { form_list = form_meloetta ; }
else if ( species = = 649 ) { form_list = form_genesect ; }
else if ( species = = 676 ) { form_list = form_furfrou ; }
else if ( species = = 681 ) { form_list = form_aegislash ; }
else if ( species = = 670 ) { form_list = form_floette ; }
else if ( ( species = = 669 ) | | ( species = = 671 ) ) { form_list = form_flabebe ; }
else if ( ( species = = 412 ) | | ( species = = 413 ) ) { form_list = form_burmy ; }
else if ( ( species = = 422 ) | | ( species = = 423 ) ) { form_list = form_shellos ; }
else if ( ( species = = 585 ) | | ( species = = 586 ) ) { form_list = form_deerling ; }
else if ( ( species = = 710 ) | | ( species = = 711 ) ) { form_list = form_pump ; }
else if ( ( species = = 666 ) | | ( species = = 665 ) | | ( species = = 664 ) ) { form_list = form_butterfly ; }
else if ( ( species = = 592 ) | | ( species = = 593 ) | | ( species = = 678 ) ) { form_list = form_gender ; }
else if ( ( species = = 641 ) | | ( species = = 642 ) | | ( species = = 645 ) ) { form_list = form_therian ; }
2014-11-15 05:08:00 +00:00
// ORAS
else if ( species = = 382 | | species = = 383 ) { form_list = form_primal ; }
else if ( species = = 720 ) { form_list = form_hoopa ; }
2014-06-28 21:22:05 +00:00
else
{
2014-11-23 22:23:40 +00:00
cb . Enabled = false ;
2014-06-28 21:22:05 +00:00
return ;
} ;
2014-11-23 22:23:40 +00:00
cb . DataSource = form_list ;
cb . Enabled = true ;
2014-06-28 21:22:05 +00:00
}
2014-10-10 02:59:57 +00:00
private void setGenderLabel ( )
2014-06-28 21:22:05 +00:00
{
if ( genderflag = = 0 )
2014-12-04 01:26:12 +00:00
Label_Gender . Text = gendersymbols [ 0 ] ; // Male
2014-06-28 21:22:05 +00:00
else if ( genderflag = = 1 )
2014-12-04 01:26:12 +00:00
Label_Gender . Text = gendersymbols [ 1 ] ; // Female
else
Label_Gender . Text = gendersymbols [ 2 ] ; // Genderless
2014-06-28 21:22:05 +00:00
}
2014-10-10 02:59:57 +00:00
private void setMarkings ( )
2014-07-12 01:39:24 +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 } ;
for ( int i = 0 ; i < 6 ; i + + )
2014-10-11 07:22:22 +00:00
pba [ i ] . Image = Util . ChangeOpacity ( pba [ i ] . InitialImage , ( float ) ( Convert . ToUInt16 ( cba [ i ] . Checked ) ) * 0.9 + 0.1 ) ;
2014-07-12 01:39:24 +00:00
2014-10-11 07:22:22 +00:00
PB_MarkShiny . Image = Util . ChangeOpacity ( PB_MarkShiny . InitialImage , ( float ) ( Convert . ToUInt16 ( ! BTN_Shinytize . Enabled ) ) * 0.9 + 0.1 ) ;
PB_MarkCured . Image = Util . ChangeOpacity ( PB_MarkCured . InitialImage , ( float ) ( Convert . ToUInt16 ( CHK_Cured . Checked ) ) * 0.9 + 0.1 ) ;
2014-11-30 01:47:17 +00:00
int gameindex = Util . getIndex ( CB_GameOrigin ) ;
PB_MarkPentagon . Image = Util . ChangeOpacity ( PB_MarkPentagon . InitialImage , ( float ) ( Convert . ToUInt16 ( gameindex = = 24 | | gameindex = = 25 | | gameindex = = 26 | | gameindex = = 27 ) ) * 0.9 + 0.1 ) ;
2014-06-28 21:22:05 +00:00
}
// Label Shortcut Tweaks
private void Label_Friendship_Click ( object sender , EventArgs e )
{
if ( ModifierKeys = = Keys . Control ) // prompt to reset
{
if ( buff [ 0x93 ] = = 0 )
TB_Friendship . Text = buff [ 0xCA ] . ToString ( ) ;
else TB_Friendship . Text = buff [ 0xA2 ] . ToString ( ) ;
return ;
}
else if ( TB_Friendship . Text = = "255" ) // if it's maxed, set it to base
2014-10-10 02:59:57 +00:00
TB_Friendship . Text = PKX . getBaseFriendship ( Util . getIndex ( CB_Species ) ) . ToString ( ) ;
2014-06-28 21:22:05 +00:00
else // not reset, not maxed, so max
TB_Friendship . Text = "255" ;
}
private void Label_Gender_Click ( object sender , EventArgs e )
{
// Get Gender Threshold
2014-10-10 02:59:57 +00:00
species = Util . getIndex ( CB_Species ) ;
2014-12-12 06:36:39 +00:00
PKX . PersonalParser . Personal MonData = PKX . PersonalGetter . GetPersonal ( species ) ;
gt = MonData . GenderRatio ;
2014-06-28 21:22:05 +00:00
2014-12-12 06:36:39 +00:00
if ( gt = = 255 | | gt = = 0 | | gt = = 254 ) // Single gender/genderless
2014-06-28 21:22:05 +00:00
return ;
2014-12-12 06:36:39 +00:00
if ( gt < 255 ) // If not a single gender(less) species: (should be <254 but whatever, 255 never happens^)
2014-06-28 21:22:05 +00:00
{
2014-12-04 01:26:12 +00:00
if ( PKX . getGender ( Label_Gender . Text ) = = 0 ) // ♂
Label_Gender . Text = gendersymbols [ 1 ] ; // ♀
2014-06-28 21:22:05 +00:00
else
2014-12-04 01:26:12 +00:00
Label_Gender . Text = gendersymbols [ 0 ] ; // ♂
2014-12-06 19:21:37 +00:00
if ( PKX . getGender ( CB_Form . Text ) = = 0 & & Label_Gender . Text ! = gendersymbols [ 0 ] )
CB_Form . SelectedIndex = 1 ;
else if ( PKX . getGender ( CB_Form . Text ) = = 1 & & Label_Gender . Text ! = gendersymbols [ 1 ] )
CB_Form . SelectedIndex = 0 ;
2014-06-28 21:22:05 +00:00
}
2014-12-04 01:26:12 +00:00
2014-12-09 01:30:07 +00:00
if ( species = = 592 | | species = = 593 )
2014-12-04 01:26:12 +00:00
CB_Form . SelectedIndex = PKX . getGender ( Label_Gender . Text ) ;
2014-06-28 21:22:05 +00:00
}
2014-07-12 01:39:24 +00:00
private void Label_PPups_Click ( object sender , EventArgs e )
{
2014-10-10 02:59:57 +00:00
CB_PPu1 . SelectedIndex = 3 * ( Convert . ToInt16 ( ! ( ( ModifierKeys = = Keys . Control ) | | Util . getIndex ( CB_Move1 ) = = 0 ) ) ) ;
CB_PPu2 . SelectedIndex = 3 * ( Convert . ToInt16 ( ! ( ( ModifierKeys = = Keys . Control ) | | Util . getIndex ( CB_Move2 ) = = 0 ) ) ) ;
CB_PPu3 . SelectedIndex = 3 * ( Convert . ToInt16 ( ! ( ( ModifierKeys = = Keys . Control ) | | Util . getIndex ( CB_Move3 ) = = 0 ) ) ) ;
CB_PPu4 . SelectedIndex = 3 * ( Convert . ToInt16 ( ! ( ( ModifierKeys = = Keys . Control ) | | Util . getIndex ( CB_Move4 ) = = 0 ) ) ) ;
2014-07-12 01:39:24 +00:00
}
2014-10-11 07:22:22 +00:00
private void Label_Marking_Click ( object sender , EventArgs e )
2014-07-12 01:39:24 +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 } ;
CheckBox cb = cba [ Array . IndexOf ( pba , sender as PictureBox ) ] ;
cb . Checked = ! cb . Checked ;
2014-10-10 02:59:57 +00:00
setMarkings ( ) ;
2014-07-12 01:39:24 +00:00
}
2014-08-07 00:10:29 +00:00
private void Label_OT_Click ( object sender , EventArgs e )
{
2014-11-22 03:26:16 +00:00
string OT = Util . TrimFromZero ( Encoding . Unicode . GetString ( savefile , SaveGame . TrainerCard + 0x48 + savindex * 0x7F000 , 0x1A ) ) ;
2014-08-07 00:10:29 +00:00
if ( OT . Length > 0 )
{
TB_OT . Text = OT ;
2014-08-15 04:27:53 +00:00
int savshift = 0x7F000 * savindex ;
2014-08-07 00:10:29 +00:00
// Set Gender Label
2014-11-22 03:26:16 +00:00
int g6trgend = savefile [ SaveGame . TrainerCard + 0x5 + savshift ] ;
2014-08-07 00:10:29 +00:00
if ( g6trgend = = 1 )
2014-12-04 01:26:12 +00:00
Label_OTGender . Text = gendersymbols [ 1 ] ; // ♀
else Label_OTGender . Text = gendersymbols [ 0 ] ; // ♂
2014-08-07 00:10:29 +00:00
// Get TID/SID
2014-11-22 03:26:16 +00:00
TB_TID . Text = BitConverter . ToUInt16 ( savefile , SaveGame . TrainerCard + 0 + savshift ) . ToString ( ) ;
TB_SID . Text = BitConverter . ToUInt16 ( savefile , SaveGame . TrainerCard + 2 + savshift ) . ToString ( ) ;
int game = savefile [ SaveGame . TrainerCard + 0x4 + savshift ] ;
int subreg = savefile [ SaveGame . TrainerCard + 0x26 + savshift ] ;
int country = savefile [ SaveGame . TrainerCard + 0x27 + savshift ] ;
int _3DSreg = savefile [ SaveGame . TrainerCard + 0x2C + savshift ] ;
int lang = savefile [ SaveGame . TrainerCard + 0x2D + savshift ] ;
2014-08-15 04:27:53 +00:00
// CB_GameOrigin.SelectedValue = game;
CB_SubRegion . SelectedValue = subreg ;
CB_Country . SelectedValue = country ;
CB_3DSReg . SelectedValue = _3DSreg ;
CB_Language . SelectedValue = lang ;
updateNickname ( null , null ) ;
2014-08-07 00:10:29 +00:00
}
}
2014-10-11 07:22:22 +00:00
private void Label_CT_Click ( object sender , EventArgs e )
2014-08-07 00:10:29 +00:00
{
2014-08-31 20:32:04 +00:00
string OT = Util . TrimFromZero ( Encoding . Unicode . GetString ( savefile , 0x19448 + savindex * 0x7F000 , 0x1A ) ) ;
2014-08-07 00:10:29 +00:00
if ( OT . Length > 0 )
{
TB_OTt2 . Text = OT ;
// Set Gender Label
int g6trgend = savefile [ 0x19405 + savindex * 0x7F000 ] ;
if ( g6trgend = = 1 )
2014-12-04 01:26:12 +00:00
Label_CTGender . Text = gendersymbols [ 1 ] ; // ♀
else Label_CTGender . Text = gendersymbols [ 0 ] ; // ♂
2014-08-07 00:10:29 +00:00
}
}
2014-12-06 02:14:04 +00:00
private void Label_TrainerGender_Click ( object sender , EventArgs e )
2014-10-11 07:22:22 +00:00
{
2014-12-06 02:14:04 +00:00
Label lbl = sender as Label ;
if ( lbl . Text = = "" )
return ;
else // set gender label (toggle M/F)
lbl . Text = ( PKX . getGender ( lbl . Text ) = = 0 ) ? gendersymbols [ 1 ] : gendersymbols [ 0 ] ;
2014-10-11 07:22:22 +00:00
}
2014-06-28 21:22:05 +00:00
// Prompted Updates of PKX Functions //
2014-12-13 06:58:34 +00:00
public void setCountrySubRegion ( object sender , string type )
2014-06-28 21:22:05 +00:00
{
ComboBox CB = sender as ComboBox ;
2014-12-13 06:58:34 +00:00
int index = Util . getIndex ( CB ) ;
CB . DataSource = PKX . getCBList ( type , curlanguage ) ;
2014-06-28 21:22:05 +00:00
CB . DisplayMember = "Text" ;
CB . ValueMember = "Value" ;
2014-12-13 06:58:34 +00:00
if ( index > 0 & & index < = CB . Items . Count )
CB . SelectedValue = index ;
}
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-06-28 21:22:05 +00:00
}
private void updateEXPLevel ( object sender , EventArgs e )
{
if ( ( TB_EXP . Focused = = true ) & & ( TB_EXP . Enabled = = true ) )
{
// Change the Level
TB_Level . Enabled = false ;
int level ;
2014-10-10 02:59:57 +00:00
uint exp = Util . ToUInt32 ( TB_EXP ) ;
if ( Util . ToInt32 ( TB_EXP . Text ) = = 0 ) { level = 1 ; }
else level = PKX . getLevel ( Util . getIndex ( CB_Species ) , ref exp ) ;
2014-06-28 21:22:05 +00:00
TB_Level . Text = level . ToString ( ) ;
2014-10-25 22:52:24 +00:00
if ( ! MT_Level . Visible | | level < 100 )
TB_EXP . Text = exp . ToString ( ) ;
if ( MT_Level . Visible & & level < 101 & & Util . ToInt32 ( MT_Level . Text ) < 101 )
MT_Level . Text = level . ToString ( ) ;
2014-06-28 21:22:05 +00:00
TB_Level . Enabled = true ;
}
else if ( ( TB_Level . Focused = = true ) & & ( TB_Level . Enabled = = true ) ) // TB_Level is focused
{
// Change the XP
TB_EXP . Enabled = false ;
2014-10-10 02:59:57 +00:00
int level = Util . ToInt32 ( TB_Level . Text ) ;
if ( level > 100 )
{ TB_Level . Text = "100" ; level = 100 ; }
2014-06-28 21:22:05 +00:00
{
// Valid Level, recalculate EXP
2014-10-10 02:59:57 +00:00
TB_EXP . Text = PKX . getEXP ( level , Util . getIndex ( CB_Species ) ) . ToString ( ) ;
2014-06-28 21:22:05 +00:00
TB_Level . BackColor = Color . White ;
}
TB_EXP . Enabled = true ;
}
2014-08-15 04:27:53 +00:00
else if ( MT_Level . Focused = = true )
{
2014-10-25 22:52:24 +00:00
int level = Util . ToInt32 ( MT_Level . Text ) ; if ( level > 255 ) level = 255 ;
TB_EXP . Text = PKX . getEXP ( level , Util . getIndex ( CB_Species ) ) . ToString ( ) ;
2014-08-15 04:27:53 +00:00
}
2014-06-28 21:22:05 +00:00
updateStats ( ) ;
}
2014-08-15 22:28:33 +00:00
private void updateIVs ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2014-12-06 02:14:04 +00:00
if ( sender ! = null )
2014-12-11 06:50:40 +00:00
if ( Util . ToInt32 ( ( sender as MaskedTextBox ) . Text ) > 31 )
( sender as MaskedTextBox ) . Text = "31" ;
2014-06-28 21:22:05 +00:00
int ivtotal , HP_IV , ATK_IV , DEF_IV , SPA_IV , SPD_IV , SPE_IV ;
2014-10-10 02:59:57 +00:00
HP_IV = Util . ToInt32 ( TB_HPIV . Text ) ;
ATK_IV = Util . ToInt32 ( TB_ATKIV . Text ) ;
DEF_IV = Util . ToInt32 ( TB_DEFIV . Text ) ;
SPA_IV = Util . ToInt32 ( TB_SPAIV . Text ) ;
SPD_IV = Util . ToInt32 ( TB_SPDIV . Text ) ;
SPE_IV = Util . ToInt32 ( TB_SPEIV . Text ) ;
2014-06-28 21:22:05 +00:00
int [ ] iva = new int [ ] { HP_IV , ATK_IV , DEF_IV , SPE_IV , SPA_IV , SPD_IV } ;
MaskedTextBox [ ] ivt = { TB_HPIV , TB_ATKIV , TB_DEFIV , TB_SPEIV , TB_SPAIV , TB_SPDIV } ;
int HPTYPE = ( 15 * ( ( HP_IV & 1 ) + 2 * ( ATK_IV & 1 ) + 4 * ( DEF_IV & 1 ) + 8 * ( SPE_IV & 1 ) + 16 * ( SPA_IV & 1 ) + 32 * ( SPD_IV & 1 ) ) ) / 63 ;
Label_HPTYPE . Text = types [ HPTYPE + 1 ] ; // type array has normal at index 0, so we offset by 1
ivtotal = HP_IV + ATK_IV + DEF_IV + SPA_IV + SPD_IV + SPE_IV ;
TB_IVTotal . Text = ivtotal . ToString ( ) ;
// Potential Reading
2014-12-04 01:26:12 +00:00
if ( ! unicode )
{
if ( ivtotal < = 90 )
L_Potential . Text = "★☆☆☆" ;
else if ( ivtotal < = 120 )
L_Potential . Text = "★★☆☆" ;
else if ( ivtotal < = 150 )
L_Potential . Text = "★★★☆" ;
else
L_Potential . Text = "★★★★" ;
}
2014-06-28 21:22:05 +00:00
else
2014-12-04 01:26:12 +00:00
{
if ( ivtotal < = 90 )
L_Potential . Text = "+" ;
else if ( ivtotal < = 120 )
L_Potential . Text = "++" ;
else if ( ivtotal < = 150 )
L_Potential . Text = "+++" ;
else
L_Potential . Text = "++++" ;
}
2014-06-28 21:22:05 +00:00
// Characteristic with PID%6
2014-10-10 02:59:57 +00:00
int pm6 = ( int ) ( Util . getHEXval ( TB_PID ) % 6 ) ; // PID MOD 6
2014-06-28 21:22:05 +00:00
int maxIV = iva . Max ( ) ;
int pm6stat = 0 ;
for ( int i = 0 ; i < 6 ; i + + )
{
pm6stat = ( pm6 + i ) % 6 ;
if ( iva [ pm6stat ] = = maxIV )
break ; // P%6 is this stat
}
L_Characteristic . Text = characteristics [ pm6stat * 5 + maxIV % 5 ] ;
updateStats ( ) ;
}
2014-08-15 22:28:33 +00:00
private void updateEVs ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2014-12-06 02:14:04 +00:00
if ( sender ! = null )
2014-12-11 06:50:40 +00:00
if ( Util . ToInt32 ( ( sender as MaskedTextBox ) . Text ) > 252 )
( sender as MaskedTextBox ) . Text = "252" ;
2014-06-28 21:22:05 +00:00
int evtotal , HP_EV , ATK_EV , DEF_EV , SPA_EV , SPD_EV , SPE_EV ;
2014-10-10 02:59:57 +00:00
HP_EV = Util . ToInt32 ( TB_HPEV . Text ) ;
ATK_EV = Util . ToInt32 ( TB_ATKEV . Text ) ;
DEF_EV = Util . ToInt32 ( TB_DEFEV . Text ) ;
SPA_EV = Util . ToInt32 ( TB_SPAEV . Text ) ;
SPD_EV = Util . ToInt32 ( TB_SPDEV . Text ) ;
SPE_EV = Util . ToInt32 ( TB_SPEEV . Text ) ;
2014-06-28 21:22:05 +00:00
2014-12-06 02:14:04 +00:00
int [ ] eva = new int [ ] { HP_EV , ATK_EV , DEF_EV , SPA_EV , SPD_EV , SPE_EV } ;
2014-06-28 21:22:05 +00:00
evtotal = HP_EV + ATK_EV + DEF_EV + SPA_EV + SPD_EV + SPE_EV ;
if ( evtotal > 510 ) // Background turns Red
TB_EVTotal . BackColor = Color . Red ;
else if ( evtotal = = 510 ) // Maximum EVs
TB_EVTotal . BackColor = Color . Honeydew ;
else TB_EVTotal . BackColor = Color . WhiteSmoke ;
TB_EVTotal . Text = evtotal . ToString ( ) ;
updateStats ( ) ;
}
private void updateRandomIVs ( object sender , EventArgs e )
{
if ( ModifierKeys = = Keys . Control )
{
// 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 ( ) ;
}
2014-12-06 02:14:04 +00:00
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 ( ) ;
}
2014-06-28 21:22:05 +00:00
}
private void updateRandomEVs ( object sender , EventArgs e )
{
if ( ModifierKeys = = Keys . Control )
{
// 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 ( ) ;
return ;
}
2014-12-11 06:50:40 +00:00
else
2014-06-28 21:22:05 +00:00
{
2014-12-11 06:50:40 +00:00
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 ( ) ;
2014-06-28 21:22:05 +00:00
}
}
private void updateRandomPID ( object sender , EventArgs e )
{
2014-10-11 07:22:22 +00:00
TB_PID . Text = PKX . getRandomPID ( Util . getIndex ( CB_Species ) , PKX . getGender ( Label_Gender . Text ) ) . ToString ( "X8" ) ;
2014-06-28 21:22:05 +00:00
}
private void updateRandomEC ( object sender , EventArgs e )
{
2014-10-10 02:59:57 +00:00
TB_EC . Text = Util . rnd32 ( ) . ToString ( "X8" ) ;
2014-06-28 21:22:05 +00:00
}
2014-08-15 22:28:33 +00:00
private void updateHackedStats ( object sender , EventArgs e )
{
Stat_HP . Enabled =
Stat_ATK . Enabled =
Stat_DEF . Enabled =
Stat_SPA . Enabled =
Stat_SPD . Enabled =
Stat_SPE . Enabled = CHK_HackedStats . Checked ;
}
private void update255_MTB ( object sender , EventArgs e )
{
MaskedTextBox mtb = sender as MaskedTextBox ;
try
{
2014-12-11 06:50:40 +00:00
if ( Util . ToInt32 ( ( sender as MaskedTextBox ) . Text ) > 255 )
( sender as MaskedTextBox ) . Text = "255" ;
2014-08-15 22:28:33 +00:00
}
catch { mtb . Text = "0" ; }
}
private void update255_TB ( object sender , EventArgs e )
{
TextBox tb = sender as TextBox ;
try
{
2014-12-11 06:50:40 +00:00
if ( Util . ToInt32 ( ( sender as TextBox ) . Text ) > 255 )
( sender as TextBox ) . Text = "255" ;
2014-08-15 22:28:33 +00:00
}
catch { tb . Text = "0" ; }
}
2014-06-28 21:22:05 +00:00
private void updateForm ( object sender , EventArgs e )
{
updateStats ( ) ;
// Repopulate Abilities if Species Form has different abilities
2014-11-23 22:23:40 +00:00
updateAbilityList ( TB_AbilityNumber , Util . getIndex ( CB_Species ) , CB_Ability , CB_Form ) ;
2014-06-28 21:22:05 +00:00
// If form has a single gender, account for it.
2014-12-04 01:26:12 +00:00
if ( PKX . getGender ( CB_Form . Text ) = = 0 )
Label_Gender . Text = gendersymbols [ 0 ] ;
else if ( PKX . getGender ( CB_Form . Text ) = = 1 )
Label_Gender . Text = gendersymbols [ 1 ] ;
2014-06-28 21:22:05 +00:00
}
private void updatePP ( object sender , EventArgs e )
{
2014-11-19 06:35:39 +00:00
TB_PP1 . Text = ( PKX . getMovePP ( Util . getIndex ( CB_Move1 ) , CB_PPu1 . SelectedIndex ) ) . ToString ( ) ;
2014-10-10 02:59:57 +00:00
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-06-28 21:22:05 +00:00
}
private void updatePKRSstrain ( object sender , EventArgs e )
{
if ( CB_PKRSStrain . SelectedIndex = = 0 )
{
// Never Infected
CB_PKRSDays . SelectedValue = 0 ;
CHK_Cured . Checked = false ;
CHK_Infected . Checked = false ;
}
}
private void updatePKRSdays ( object sender , EventArgs e )
{
if ( CB_PKRSDays . SelectedIndex = = 0 )
{
// If no days are selected
if ( CB_PKRSStrain . SelectedIndex = = 0 )
{
// Never Infected
CHK_Cured . Checked = false ;
CHK_Infected . Checked = false ;
}
else CHK_Cured . Checked = true ;
}
}
private void updateSpecies ( object sender , EventArgs e )
{
// Change Species Prompted
2014-10-10 02:59:57 +00:00
int species = Util . getIndex ( CB_Species ) ;
int level = Util . ToInt32 ( TB_Level . Text ) ;
2014-10-25 22:52:24 +00:00
if ( MT_Level . Visible ) level = Util . ToInt32 ( MT_Level . Text ) ;
2014-06-28 21:22:05 +00:00
// Get Forms for Given Species
2014-11-23 22:23:40 +00:00
setForms ( species , CB_Form ) ;
2014-06-28 21:22:05 +00:00
// Recalculate EXP for Given Level
2014-10-25 22:52:24 +00:00
uint exp = PKX . getEXP ( level , species ) ;
TB_EXP . Text = exp . ToString ( ) ;
2014-06-28 21:22:05 +00:00
// Check for Gender Changes
// Get Gender Threshold
2014-10-10 02:59:57 +00:00
species = Util . getIndex ( CB_Species ) ;
2014-12-12 06:36:39 +00:00
PKX . PersonalParser . Personal MonData = PKX . PersonalGetter . GetPersonal ( species ) ;
gt = MonData . GenderRatio ;
2014-06-28 21:22:05 +00:00
2014-12-12 06:36:39 +00:00
if ( gt = = 255 ) // Genderless
2014-06-28 21:22:05 +00:00
genderflag = 2 ;
2014-12-12 06:36:39 +00:00
else if ( gt = = 254 ) // Female Only
2014-06-28 21:22:05 +00:00
genderflag = 1 ;
2014-12-12 06:36:39 +00:00
else if ( gt = = 0 ) // Male Only
2014-06-28 21:22:05 +00:00
genderflag = 0 ;
2014-12-06 02:14:04 +00:00
else // get gender from old PID correlation
2014-12-12 06:36:39 +00:00
genderflag = ( ( Util . getHEXval ( TB_PID ) & 0xFF ) < = gt ) ? 1 : 0 ;
2014-06-28 21:22:05 +00:00
2014-10-10 02:59:57 +00:00
setGenderLabel ( ) ;
2014-11-23 22:23:40 +00:00
updateAbilityList ( TB_AbilityNumber , Util . getIndex ( CB_Species ) , CB_Ability , CB_Form ) ;
2014-06-28 21:22:05 +00:00
updateForm ( null , null ) ;
// If species changes and no nickname, set the new name == speciesName.
if ( ! CHK_Nicknamed . Checked )
2014-07-12 01:39:24 +00:00
updateNickname ( sender , e ) ;
2014-06-28 21:22:05 +00:00
}
private void updateOriginGame ( object sender , EventArgs e )
{
int gameorigin = 0 ;
// Error handling for unset field
2014-11-27 09:29:56 +00:00
try
{
2014-11-27 20:15:32 +00:00
gameorigin = Util . ToInt32 ( CB_GameOrigin . SelectedValue . ToString ( ) ) ;
2014-11-27 09:29:56 +00:00
}
2014-06-28 21:22:05 +00:00
catch { gameorigin = 0 ; }
if ( ( gameorigin < = 12 ) & & ( gameorigin > = 7 ) )
{
// Game Originates In Gen 4; Enable Encounter Type
CB_EncounterType . Enabled = true ;
Label_EncounterType . Enabled = true ;
}
else
{
CB_EncounterType . Enabled = false ;
Label_EncounterType . Enabled = false ;
CB_EncounterType . SelectedIndex = 0 ;
}
updateLocations ( gameorigin ) ;
2014-10-10 02:59:57 +00:00
setMarkings ( ) ;
setIsShiny ( ) ;
2014-06-28 21:22:05 +00:00
}
private void updateLocations ( int gameorigin )
{
if ( gameorigin < 24 & & origintrack ! = "Past" ) // Load Past Gen Locations
{
#region BW2 Met Locations
{
// Allowed Met Locations
int [ ] metlocs = { 0 , 60002 , 30003 } ;
// Set up
List < cbItem > met_list = new List < cbItem > ( ) ;
for ( int i = 0 ; i < metlocs . Length ; i + + ) // add entries to the top
{
cbItem ncbi = new cbItem ( ) ;
int locval = metlocs [ i ] ;
string loctext = "" ;
if ( locval < 30000 )
loctext = metBW2_00000 [ locval ] ;
else if ( locval < 40000 )
loctext = metBW2_30000 [ locval % 10000 - 1 ] ;
else if ( locval < 60000 )
loctext = metBW2_40000 [ locval % 10000 - 1 ] ;
else
loctext = metBW2_60000 [ locval % 10000 - 1 ] ;
ncbi . Text = loctext ;
ncbi . Value = locval ;
met_list . Add ( ncbi ) ;
}
metlocs = new int [ ]
{
1 , 2 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 , 97 , 98 , 99 , 100 , 101 , 102 , 103 , 104 , 105 , 106 , 107 , 108 , 109 , 110 , 111 , 112 , 113 , 114 , 115 , 116 , 117 , 118 , 119 , 120 , 121 , 122 , 123 , 124 , 125 , 126 , 127 , 128 , 129 , 130 , 131 , 132 , 133 , 134 , 135 , 136 , 137 , 139 , 140 , 141 , 142 , 143 , 144 , 145 , 146 , 147 , 148 , 149 , 150 , 151 , 152 , 153 ,
30001 , 30002 , 30004 , 30005 , 30006 , 30007 , 30008 , 30010 , 30011 , 30012 , 30013 , 30014 , 30015 ,
40001 , 40002 , 40003 , 40004 , 40005 , 40006 , 40007 , 40008 , 40009 , 40010 , 40011 , 40012 , 40013 , 40014 , 40015 , 40016 , 40017 , 40018 , 40019 , 40020 , 40021 , 40022 , 40023 , 40024 , 40025 , 40026 , 40027 , 40028 , 40029 , 40030 , 40031 , 40032 , 40033 , 40034 , 40035 , 40036 , 40037 , 40038 , 40039 , 40040 , 40041 , 40042 , 40043 , 40044 , 40045 , 40046 , 40047 , 40048 , 40049 , 40050 , 40051 , 40052 , 40053 , 40054 , 40055 , 40056 , 40057 , 40058 , 40059 , 40060 , 40061 , 40062 , 40063 , 40064 , 40065 , 40066 , 40067 , 40068 , 40069 , 40070 , 40071 , 40072 , 40073 , 40074 , 40075 , 40076 , 40077 , 40078 , 40079 , 40080 , 40081 , 40082 , 40083 , 40084 , 40085 , 40086 , 40087 , 40088 , 40089 , 40090 , 40091 , 40092 , 40093 , 40094 , 40095 , 40096 , 40097 , 40098 , 40099 , 40100 , 40101 , 40102 , 40103 , 40104 , 40105 , 40106 , 40107 , 40108 , 40109 ,
60001 , 60003
} ;
// Sort the Rest based on String Name
string [ ] lt00000 = new string [ metBW2_00000 . Length ] ;
string [ ] lt30000 = new string [ metBW2_30000 . Length ] ;
string [ ] lt40000 = new string [ metBW2_40000 . Length ] ;
string [ ] lt60000 = new string [ metBW2_60000 . Length ] ;
Array . Copy ( metBW2_00000 , lt00000 , metBW2_00000 . Length ) ;
Array . Copy ( metBW2_30000 , lt30000 , metBW2_30000 . Length ) ;
Array . Copy ( metBW2_40000 , lt40000 , metBW2_40000 . Length ) ;
Array . Copy ( metBW2_60000 , lt60000 , metBW2_60000 . Length ) ;
Array . Sort ( lt00000 ) ;
Array . Sort ( lt30000 ) ;
Array . Sort ( lt40000 ) ;
Array . Sort ( lt60000 ) ;
// Add the rest of the 00000
for ( int i = 0 ; i < lt00000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metBW2_00000 , lt00000 [ i ] ) + 00000 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt00000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
// Add the rest of the 30000
for ( int i = 0 ; i < lt30000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metBW2_30000 , lt30000 [ i ] ) + 30001 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt30000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
// Add the rest of the 40000
for ( int i = 0 ; i < lt40000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metBW2_40000 , lt40000 [ i ] ) + 40001 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt40000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
// Add the rest of the 60000
for ( int i = 0 ; i < lt60000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metBW2_60000 , lt60000 [ i ] ) + 60001 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt60000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
CB_MetLocation . DataSource = met_list ;
CB_MetLocation . DisplayMember = "Text" ;
CB_MetLocation . ValueMember = "Value" ;
CB_EggLocation . DataSource = new BindingSource ( met_list , null ) ;
origintrack = "Past" ;
CB_EggLocation . DisplayMember = "Text" ;
CB_EggLocation . ValueMember = "Value" ;
CB_EggLocation . SelectedValue = 0 ;
if ( gameorigin < 20 )
CB_MetLocation . SelectedValue = 30001 ; // Transporter
else CB_MetLocation . SelectedValue = 60001 ; // Stranger
}
#endregion
}
else if ( gameorigin > 23 & & ( origintrack ! = "XY" ) )
{
#region XY Met Locations
{
// Allowed Met Locations
int [ ] metlocs = { 0 , 60002 , 30002 } ;
// Set up
List < cbItem > met_list = new List < cbItem > ( ) ;
for ( int i = 0 ; i < metlocs . Length ; i + + ) // add entries to the top
{
cbItem ncbi = new cbItem ( ) ;
int locval = metlocs [ i ] ;
string loctext = "" ;
if ( locval < 30000 )
loctext = metXY_00000 [ locval ] ;
else if ( locval < 40000 )
loctext = metXY_30000 [ locval % 10000 - 1 ] ;
else if ( locval < 60000 )
loctext = metXY_40000 [ locval % 10000 - 1 ] ;
else
loctext = metXY_60000 [ locval % 10000 - 1 ] ;
ncbi . Text = loctext ;
ncbi . Value = locval ;
met_list . Add ( ncbi ) ;
}
metlocs = new int [ ]
2014-11-15 05:08:00 +00:00
{
2 , 6 , 8 , 10 , 12 , 14 , 16 , 17 , 18 , 20 , 22 , 24 , 26 , 28 , 30 , 32 , 34 , 36 , 38 , 40 , 42 , 44 , 46 , 48 , 50 , 52 , 54 , 56 , 58 , 60 , 62 , 64 , 66 , 68 , 70 , 72 , 74 , 76 , 78 , 82 , 84 , 86 , 88 , 90 , 92 , 94 , 96 , 98 , 100 , 102 , 104 , 106 , 108 , 110 , 112 , 114 , 116 , 118 , 120 , 122 , 124 , 126 , 128 , 130 , 132 , 134 , 136 , 138 , 140 , 142 , 144 , 146 , 148 , 150 , 152 , 154 , 156 , 158 , 160 , 162 , 164 , 166 , 168 ,
2014-11-21 23:34:10 +00:00
// ORAS
170 , 172 , 174 , 176 , 178 , 180 , 182 , 184 , 186 , 188 , 190 , 192 , 194 , 196 , 198 , 200 , 202 , 204 , 206 , 208 , 210 , 212 , 214 , 216 , 218 , 220 , 222 , 224 , 226 , 228 , 230 , 232 , 234 , 236 , 238 , 240 , 242 , 244 , 246 , 248 , 250 , 252 , 254 , 256 , 258 , 260 , 262 , 264 , 266 , 268 , 270 , 272 , 274 , 276 , 278 , 280 , 282 , 284 , 286 , 288 , 290 , 292 , 294 , 296 , 298 , 300 , 302 , 304 , 306 , 308 , 310 , 312 , 314 , 316 , 318 , 320 , 322 , 324 , 326 , 328 , 330 , 332 , 334 , 336 , 338 , 340 , 342 , 344 , 346 , 348 , 350 , 352 , 354 ,
2014-11-15 05:08:00 +00:00
30001 , 30003 , 30004 , 30005 , 30006 , 30007 , 30008 , 30009 , 30010 , 30011 ,
40001 , 40002 , 40003 , 40004 , 40005 , 40006 , 40007 , 40008 , 40009 , 40010 , 40011 , 40012 , 40013 , 40014 , 40015 , 40016 , 40017 , 40018 , 40019 , 40020 , 40021 , 40022 , 40023 , 40024 , 40025 , 40026 , 40027 , 40028 , 40029 , 40030 , 40031 , 40032 , 40033 , 40034 , 40035 , 40036 , 40037 , 40038 , 40039 , 40040 , 40041 , 40042 , 40043 , 40044 , 40045 , 40046 , 40047 , 40048 , 40049 , 40050 , 40051 , 40052 , 40053 , 40054 , 40055 , 40056 , 40057 , 40058 , 40059 , 40060 , 40061 , 40062 , 40063 , 40064 , 40065 , 40066 , 40067 , 40068 , 40069 , 40070 , 40071 , 40072 , 40073 , 40074 , 40075 , 40076 , 40077 , 40078 , 40079 ,
2014-11-21 23:34:10 +00:00
60001 , 60003 ,
// ORAS
60004 ,
2014-11-15 05:08:00 +00:00
} ;
2014-06-28 21:22:05 +00:00
// Sort the Rest based on String Name
string [ ] lt00000 = new string [ metXY_00000 . Length ] ;
string [ ] lt30000 = new string [ metXY_30000 . Length ] ;
string [ ] lt40000 = new string [ metXY_40000 . Length ] ;
string [ ] lt60000 = new string [ metXY_60000 . Length ] ;
Array . Copy ( metXY_00000 , lt00000 , metXY_00000 . Length ) ;
Array . Copy ( metXY_30000 , lt30000 , metXY_30000 . Length ) ;
Array . Copy ( metXY_40000 , lt40000 , metXY_40000 . Length ) ;
Array . Copy ( metXY_60000 , lt60000 , metXY_60000 . Length ) ;
Array . Sort ( lt00000 ) ;
Array . Sort ( lt30000 ) ;
Array . Sort ( lt40000 ) ;
Array . Sort ( lt60000 ) ;
// Add the rest of the 00000
for ( int i = 0 ; i < lt00000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metXY_00000 , lt00000 [ i ] ) + 00000 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt00000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
// Add the rest of the 30000
for ( int i = 0 ; i < lt30000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metXY_30000 , lt30000 [ i ] ) + 30001 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt30000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
// Add the rest of the 40000
for ( int i = 0 ; i < lt40000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metXY_40000 , lt40000 [ i ] ) + 40001 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt40000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
// Add the rest of the 60000
for ( int i = 0 ; i < lt60000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metXY_60000 , lt60000 [ i ] ) + 60001 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt60000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
CB_MetLocation . DataSource = met_list ;
CB_MetLocation . DisplayMember = "Text" ;
CB_MetLocation . ValueMember = "Value" ;
CB_EggLocation . DataSource = new BindingSource ( met_list , null ) ;
CB_EggLocation . DisplayMember = "Text" ;
CB_EggLocation . ValueMember = "Value" ;
origintrack = "XY" ;
CB_EggLocation . SelectedValue = 0 ;
CB_MetLocation . SelectedValue = 0 ;
}
#endregion
}
if ( gameorigin < 13 & & gameorigin > 6 & & origintrack ! = "Gen4" )
{ // Egg Met Locations for Gen 4 are unaltered when transferred to Gen 5. Need a new table if Gen 4 Origin.
#region HGSS Met Locations
// Allowed Met Locations
int [ ] metlocs = { 0 , 2000 , 2002 , 3001 } ;
// Set up
List < cbItem > met_list = new List < cbItem > ( ) ;
for ( int i = 0 ; i < metlocs . Length ; i + + ) // add entries to the top
{
cbItem ncbi = new cbItem ( ) ;
int locval = metlocs [ i ] ;
string loctext = "" ;
if ( locval < 2000 )
loctext = metHGSS_00000 [ locval ] ;
else if ( locval < 3000 )
loctext = metHGSS_02000 [ locval % 2000 ] ;
else
loctext = metHGSS_03000 [ locval % 3000 ] ;
ncbi . Text = loctext ;
ncbi . Value = locval ;
met_list . Add ( ncbi ) ;
}
metlocs = new int [ ]
{
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 , 97 , 98 , 99 , 100 , 101 , 102 , 103 , 104 , 105 , 106 , 107 , 108 , 109 , 110 , 111 , 112 , 113 , 114 , 115 , 116 , 117 , 118 , 119 , 120 , 121 , 122 , 123 , 124 , 125 , 126 , 127 , 128 , 129 , 130 , 131 , 132 , 133 , 134 , 135 , 136 , 137 , 138 , 139 , 140 , 141 , 142 , 143 , 144 , 145 , 146 , 147 , 148 , 149 , 150 , 151 , 152 , 153 , 154 , 155 , 156 , 157 , 158 , 159 , 160 , 161 , 162 , 163 , 164 , 165 , 166 , 167 , 168 , 169 , 170 , 171 , 172 , 173 , 174 , 175 , 176 , 177 , 178 , 179 , 180 , 181 , 182 , 183 , 184 , 185 , 186 , 187 , 188 , 189 , 190 , 191 , 192 , 193 , 194 , 195 , 196 , 197 , 198 , 199 , 200 , 201 , 202 , 203 , 204 , 205 , 206 , 207 , 208 , 209 , 210 , 211 , 212 , 213 , 214 , 215 , 216 , 217 , 218 , 219 , 220 , 221 , 222 , 223 , 224 , 225 , 226 , 227 , 228 , 229 , 230 , 231 , 232 , 233 , 234 ,
2000 , 2001 , 2002 , 2003 , 2004 , 2005 , 2006 , 2008 , 2009 , 2010 , 2011 , 2012 , 2013 , 2014 ,
3000 , 3001 , 3002 , 3003 , 3004 , 3005 , 3006 , 3007 , 3008 , 3009 , 3010 , 3011 , 3012 , 3013 , 3014 , 3015 , 3016 , 3017 , 3018 , 3019 , 3020 , 3021 , 3022 , 3023 , 3024 , 3025 , 3026 , 3027 , 3028 , 3029 , 3030 , 3031 , 3032 , 3033 , 3034 , 3035 , 3036 , 3037 , 3038 , 3039 , 3040 , 3041 , 3042 , 3043 , 3044 , 3045 , 3046 , 3047 , 3048 , 3049 , 3050 , 3051 , 3052 , 3053 , 3054 , 3055 , 3056 , 3057 , 3058 , 3059 , 3060 , 3061 , 3062 , 3063 , 3064 , 3065 , 3066 , 3067 , 3068 , 3069 , 3070 , 3071 , 3072 , 3073 , 3074 , 3075 , 3076
} ;
// Sort the Rest based on String Name
string [ ] lt00000 = new string [ metHGSS_00000 . Length ] ;
string [ ] lt02000 = new string [ metHGSS_02000 . Length ] ;
string [ ] lt03000 = new string [ metHGSS_03000 . Length ] ;
Array . Copy ( metHGSS_00000 , lt00000 , metHGSS_00000 . Length ) ;
Array . Copy ( metHGSS_02000 , lt02000 , metHGSS_02000 . Length ) ;
Array . Copy ( metHGSS_03000 , lt03000 , metHGSS_03000 . Length ) ;
Array . Sort ( lt00000 ) ;
Array . Sort ( lt02000 ) ;
Array . Sort ( lt03000 ) ;
// Add the rest of the 0000
for ( int i = 0 ; i < lt00000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metHGSS_00000 , lt00000 [ i ] ) + 0000 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt00000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
// Add the rest of the 2000
for ( int i = 0 ; i < lt02000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metHGSS_02000 , lt02000 [ i ] ) + 2000 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt02000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
// Add the rest of the 3000
for ( int i = 0 ; i < lt03000 . Length ; i + + )
{
int locnum = Array . IndexOf ( metlocs , Array . IndexOf ( metHGSS_03000 , lt03000 [ i ] ) + 3000 ) ;
if ( locnum > 0 ) // If the location is allowed (if found, >0)
{
cbItem ncbi = new cbItem ( ) ;
ncbi . Text = lt03000 [ i ] ;
ncbi . Value = metlocs [ locnum ] ;
met_list . Add ( ncbi ) ;
}
}
CB_EggLocation . DataSource = met_list ;
origintrack = "Gen4" ;
CB_EggLocation . DisplayMember = "Text" ;
CB_EggLocation . ValueMember = "Value" ;
CB_EggLocation . SelectedValue = 0 ;
#endregion
}
}
private void updateExtraByteValue ( object sender , EventArgs e )
{
// Changed Extra Byte's Value
2014-12-11 06:50:40 +00:00
if ( Util . ToInt32 ( ( sender as MaskedTextBox ) . Text ) > 255 )
( sender as MaskedTextBox ) . Text = "255" ;
2014-08-15 22:28:33 +00:00
2014-10-10 02:59:57 +00:00
int value = Util . ToInt32 ( TB_ExtraByte . Text ) ;
2014-08-15 22:28:33 +00:00
int offset = Convert . ToInt32 ( CB_ExtraBytes . Text , 16 ) ;
buff [ offset ] = ( byte ) value ;
2014-06-28 21:22:05 +00:00
}
private void updateExtraByteIndex ( object sender , EventArgs e )
{
// Byte changed, need to refresh the Text box for the byte's value.
2014-10-11 07:22:22 +00:00
TB_ExtraByte . Text = buff [ Convert . ToInt32 ( CB_ExtraBytes . Text , 16 ) ] . ToString ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-07-12 01:39:24 +00:00
private void updateNickname ( object sender , EventArgs e )
{
if ( ! CHK_Nicknamed . Checked )
{
// Fetch Current Species and set it as Nickname Text
2014-10-10 02:59:57 +00:00
int species = Util . getIndex ( CB_Species ) ;
2014-07-12 01:39:24 +00:00
if ( species = = 0 | | species > 721 )
TB_Nickname . Text = "" ;
else
{
// get language
2014-10-10 02:59:57 +00:00
int lang = Util . getIndex ( CB_Language ) ;
2014-07-12 01:39:24 +00:00
string [ ] lang_val = { "en" , "ja" , "fr" , "it" , "de" , "es" , "ko" } ;
string l = "" ;
switch ( lang )
{
case 1 : l = "ja" ; break ;
case 2 : l = "en" ; break ;
case 3 : l = "fr" ; break ;
case 4 : l = "it" ; break ;
case 5 : l = "de" ; break ;
case 7 : l = "es" ; break ;
case 8 : l = "ko" ; break ;
default : l = curlanguage ; break ;
2014-09-23 04:05:27 +00:00
}
2014-08-31 20:32:04 +00:00
TB_Nickname . Text = Util . getStringList ( "Species" , l ) [ species ] ;
2014-07-12 01:39:24 +00:00
}
}
}
2014-12-12 05:44:05 +00:00
private void updateNicknameClick ( object sender , MouseEventArgs e )
{
// Special Character Form
if ( e . Button = = MouseButtons . Right )
( new f2_Text ( TB_Nickname ) ) . Show ( ) ;
}
2014-06-28 21:22:05 +00:00
private void updateNotOT ( object sender , EventArgs e )
{
if ( TB_OTt2 . Text = = "" )
{
Label_CTGender . Text = "" ;
TB_Friendship . Text = buff [ 0xCA ] . ToString ( ) ;
GB_OT . BackColor = System . Drawing . Color . FromArgb ( 232 , 255 , 255 ) ;
GB_nOT . BackColor = Color . Transparent ;
buff [ 0x93 ] = 0 ;
}
else if ( Label_CTGender . Text = = "" )
2014-12-04 01:26:12 +00:00
Label_CTGender . Text = gendersymbols [ 0 ] ;
2014-06-28 21:22:05 +00:00
}
private void updatePKRSCured ( object sender , EventArgs e )
{
// Cured PokeRus is toggled
if ( CHK_Cured . Checked )
{
// Has Had PokeRus
CB_PKRSDays . Enabled = false ;
CB_PKRSDays . SelectedIndex = 0 ;
CB_PKRSStrain . Enabled = true ;
CHK_Infected . Checked = true ;
if ( CB_PKRSStrain . SelectedIndex = = 0 )
{ // Give it Strain 1 by Default
CB_PKRSStrain . SelectedIndex = 1 ;
}
}
else if ( ! CHK_Infected . Checked )
{
// Not Infected, Disable the other
CB_PKRSStrain . Enabled = false ;
CB_PKRSStrain . SelectedIndex = 0 ;
}
else
{ // Still Infected for a duration
CB_PKRSDays . Enabled = true ;
CB_PKRSDays . SelectedValue = 1 ;
}
// if not cured yet, days > 0
2014-11-15 05:08:00 +00:00
if ( ! CHK_Cured . Checked & & CHK_Infected . Checked & & CB_PKRSDays . SelectedIndex = = 0 )
CB_PKRSDays . SelectedIndex + + ;
2014-06-28 21:22:05 +00:00
2014-10-10 02:59:57 +00:00
setMarkings ( ) ;
2014-06-28 21:22:05 +00:00
}
private void updatePKRSInfected ( object sender , EventArgs e )
{
CB_PKRSDays . Enabled = CB_PKRSStrain . Enabled = CHK_Infected . Checked ;
if ( ! CHK_Infected . Checked ) { CB_PKRSStrain . SelectedIndex = 0 ; CB_PKRSDays . SelectedIndex = 0 ; }
else if ( CB_PKRSStrain . SelectedIndex = = 0 ) CB_PKRSStrain . SelectedIndex + + ;
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
CB_PKRSDays . SelectedValue = CB_PKRSStrain . SelectedValue = Convert . ToInt32 ( CHK_Infected . Checked ) ;
// if not cured yet, days > 0
if ( ! CHK_Cured . Checked & & CHK_Infected . Checked & & CB_PKRSDays . SelectedIndex = = 0 ) CB_PKRSDays . SelectedIndex + + ;
}
private void updateIsEgg ( object sender , EventArgs e )
{
if ( CHK_IsEgg . Checked )
{
CHK_Nicknamed . Checked = false ;
TB_Nickname . Text = eggname ;
TB_Friendship . Text = "1" ;
// 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 ) ;
2014-09-23 04:05:27 +00:00
CB_MetLocation . SelectedIndex = 2 ;
2014-06-28 21:22:05 +00:00
}
else // Not Egg
{
if ( ! CHK_Nicknamed . Checked )
2014-07-12 01:39:24 +00:00
updateNickname ( null , null ) ;
2014-08-17 01:42:51 +00:00
2014-11-16 16:13:52 +00:00
TB_Friendship . Text = PKX . getBaseFriendship ( Util . getIndex ( CB_Species ) ) . ToString ( ) ;
2014-06-28 21:22:05 +00:00
if ( CB_EggLocation . SelectedIndex = = 0 )
{
CAL_EggDate . Value = new DateTime ( 2000 , 01 , 01 ) ;
CHK_AsEgg . Checked = false ;
GB_EggConditions . Enabled = false ;
}
}
// 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 ;
}
private void updateMetAsEgg ( object sender , EventArgs e )
{
GB_EggConditions . Enabled = CHK_AsEgg . Checked ;
if ( ! CHK_AsEgg . Checked )
{
// Remove egg met data
CHK_IsEgg . Checked = false ;
CAL_EggDate . Value = new DateTime ( 2000 , 01 , 01 ) ;
CB_EggLocation . SelectedValue = 0 ;
}
}
private void updateShinyPID ( object sender , EventArgs e )
{
2014-10-10 02:59:57 +00:00
uint PID = Util . getHEXval ( TB_PID ) ;
2014-06-28 21:22:05 +00:00
uint UID = ( PID > > 16 ) ;
uint LID = ( PID & 0xFFFF ) ;
uint PSV = UID ^ LID ;
2014-10-10 02:59:57 +00:00
uint TID = Util . ToUInt32 ( TB_TID ) ;
uint SID = Util . ToUInt32 ( TB_SID ) ;
2014-06-28 21:22:05 +00:00
uint TSV = TID ^ SID ;
uint XOR = TSV ^ PSV ;
2014-08-03 05:15:47 +00:00
// Check to see if we actually did it right... should be 0.
if ( XOR > 16 )
2014-06-28 21:22:05 +00:00
TB_PID . Text = ( ( UID ^ XOR ) * 0x10000 + LID ) . ToString ( "X8" ) ;
2014-08-17 01:42:51 +00:00
2014-10-10 02:59:57 +00:00
setIsShiny ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-12-11 06:50:40 +00:00
private void update_ID ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
// Trim out nonhex characters
2014-10-11 07:22:22 +00:00
TB_PID . Text = Util . getHEXval ( TB_PID ) . ToString ( "X8" ) ;
TB_EC . Text = Util . getHEXval ( TB_EC ) . ToString ( "X8" ) ;
2014-07-24 17:28:24 +00:00
2014-12-06 02:14:04 +00:00
TB_TID . Text = Math . Min ( Util . ToUInt32 ( TB_TID . Text ) , 65535 ) . ToString ( ) ; // max TID/SID is 65535
TB_SID . Text = Math . Min ( Util . ToUInt32 ( TB_SID . Text ) , 65535 ) . ToString ( ) ;
2014-06-28 21:22:05 +00:00
2014-10-10 02:59:57 +00:00
setIsShiny ( ) ;
2014-12-06 02:14:04 +00:00
updateIVs ( null , null ) ; // If the PID is changed, PID%6 (Characteristic) might be changed.
2014-06-28 21:22:05 +00:00
TB_PID . Select ( 60 , 0 ) ; // position cursor at end of field
}
private void validateComboBox ( object sender , CancelEventArgs e )
{
if ( ! ( sender is ComboBox ) ) { return ; }
ComboBox cb = sender as ComboBox ;
cb . SelectionLength = 0 ;
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
if ( ( cb . SelectedValue = = null ) )
cb . BackColor = Color . DarkSalmon ;
else
2014-10-11 07:22:22 +00:00
cb . BackColor = Color . Empty ;
2014-06-28 21:22:05 +00:00
}
private void validateComboBox2 ( object sender , EventArgs e )
{
ComboBox cb = sender as ComboBox ;
validateComboBox ( sender , e as CancelEventArgs ) ;
if ( cb = = CB_Ability )
2014-12-11 06:50:40 +00:00
TB_AbilityNumber . Text = ( 1 < < CB_Ability . SelectedIndex ) . ToString ( ) ;
2014-06-28 21:22:05 +00:00
else if ( ( cb = = CB_Move1 ) | | ( cb = = CB_Move2 ) | | ( cb = = CB_Move3 ) | | ( cb = = CB_Move4 ) )
updatePP ( sender , e ) ;
2014-07-19 23:56:40 +00:00
2014-08-15 22:28:33 +00:00
updateIVs ( null , null ) ; // updating Nature will trigger stats to update as well
2014-06-28 21:22:05 +00:00
}
private void removedropCB ( object sender , KeyEventArgs e )
{
( ( ComboBox ) sender ) . DroppedDown = false ;
}
private void updateStats ( )
{
2014-12-11 06:50:40 +00:00
// Gather the needed information.
2014-10-10 02:59:57 +00:00
species = Util . getIndex ( CB_Species ) ;
2014-12-11 06:50:40 +00:00
int level = Util . ToInt32 ( TB_Level . Text ) ; if ( MT_Level . Enabled ) level = Util . ToInt32 ( MT_Level . Text ) ;
2014-06-28 21:22:05 +00:00
if ( level = = 0 ) { level = 1 ; }
2014-12-11 06:50:40 +00:00
int form = CB_Form . SelectedIndex ;
2014-10-10 02:59:57 +00:00
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-12-11 06:50:40 +00:00
int nature = Util . getIndex ( CB_Nature ) ;
2014-06-28 21:22:05 +00:00
2014-12-11 06:50:40 +00:00
// Generate the stats.
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 ) ;
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 ( ) ;
// Recolor the Stat Labels based on boosted stats.
int incr = nature / 5 ;
int decr = nature % 5 ;
2014-06-28 21:22:05 +00:00
2014-12-11 06:50:40 +00:00
Label [ ] labarray = new Label [ ] { Label_ATK , Label_DEF , Label_SPE , Label_SPA , Label_SPD } ;
for ( int i = 0 ; i < 5 ; i + + )
labarray [ i ] . ForeColor = DefaultForeColor ;
2014-06-28 21:22:05 +00:00
2014-12-11 06:50:40 +00:00
if ( incr ! = decr ) // if stat isn't neutral
2014-10-11 07:22:22 +00:00
{
2014-12-11 06:50:40 +00:00
labarray [ incr ] . ForeColor = Color . Red ;
labarray [ decr ] . ForeColor = Color . Blue ;
2014-10-11 07:22:22 +00:00
}
2014-06-28 21:22:05 +00:00
}
2014-11-23 22:23:40 +00:00
public void updateAbilityList ( MaskedTextBox tb_abil , int species , ComboBox cb_abil , ComboBox cb_forme )
2014-06-28 21:22:05 +00:00
{
if ( ! init )
return ;
2014-11-23 22:23:40 +00:00
int newabil = Convert . ToInt16 ( tb_abil . Text ) > > 1 ;
2014-06-28 21:22:05 +00:00
2014-12-11 06:50:40 +00:00
int form = cb_forme . SelectedIndex ;
2014-12-12 07:09:22 +00:00
byte [ ] abils = PKX . getAbilities ( species , form ) ;
2014-06-28 21:22:05 +00:00
// Build Ability List
List < string > ability_list = new List < string > ( ) ;
ability_list . Add ( abilitylist [ abils [ 0 ] ] + " (1)" ) ;
ability_list . Add ( abilitylist [ abils [ 1 ] ] + " (2)" ) ;
ability_list . Add ( abilitylist [ abils [ 2 ] ] + " (H)" ) ;
2014-11-23 22:23:40 +00:00
cb_abil . DataSource = ability_list ;
2014-06-28 21:22:05 +00:00
2014-11-23 22:23:40 +00:00
if ( newabil < 3 ) cb_abil . SelectedIndex = newabil ;
else cb_abil . SelectedIndex = 0 ;
2014-06-28 21:22:05 +00:00
}
// Main Menu Strip UI Functions //
private void mainmenuOpen ( object sender , EventArgs e )
{
2014-08-01 07:55:28 +00:00
string cyberpath = Util . GetTempFolder ( ) ;
2014-11-28 21:18:44 +00:00
SDFLoc = Util . GetSDFLocation ( ) ;
if ( SDFLoc ! = null )
{
OpenPKX . InitialDirectory = SDFLoc ;
OpenPKX . RestoreDirectory = true ;
OpenPKX . FilterIndex = 4 ;
}
2014-11-29 00:38:15 +00:00
else if ( Directory . Exists ( Path . Combine ( cyberpath , "root" ) ) )
2014-08-02 00:24:22 +00:00
{
2014-11-28 23:46:09 +00:00
OpenPKX . InitialDirectory = Path . Combine ( cyberpath , "root" ) ;
2014-08-02 00:24:22 +00:00
OpenPKX . RestoreDirectory = true ;
2014-11-28 21:18:44 +00:00
OpenPKX . FilterIndex = 4 ;
2014-08-02 00:24:22 +00:00
}
2014-08-01 07:55:28 +00:00
else if ( Directory . Exists ( cyberpath ) )
2014-08-02 00:24:22 +00:00
{
2014-08-01 07:55:28 +00:00
OpenPKX . InitialDirectory = cyberpath ;
2014-08-02 00:24:22 +00:00
OpenPKX . RestoreDirectory = true ;
2014-11-28 21:18:44 +00:00
OpenPKX . FilterIndex = 4 ;
2014-08-02 00:24:22 +00:00
}
2014-08-01 07:55:28 +00:00
2014-06-28 21:22:05 +00:00
DialogResult result = OpenPKX . ShowDialog ( ) ;
if ( result = = DialogResult . OK )
{
string path = OpenPKX . FileName ;
2014-08-31 20:32:04 +00:00
openQuick ( path ) ;
2014-06-28 21:22:05 +00:00
}
}
private void mainmenuSave ( object sender , EventArgs e )
{
if ( ! verifiedpkx ( ) ) { return ; }
SavePKX . FileName = TB_Nickname . Text + " - " + TB_PID . Text ;
DialogResult result = SavePKX . ShowDialog ( ) ;
if ( result = = DialogResult . OK ) // Test result.
{
string path = SavePKX . FileName ;
string ext = Path . GetExtension ( path ) ;
if ( File . Exists ( path ) )
{
// File already exists, save a .bak
byte [ ] backupfile = File . ReadAllBytes ( path ) ;
File . WriteAllBytes ( path + ".bak" , backupfile ) ;
}
byte [ ] pkx = preparepkx ( buff ) ;
if ( ( ext = = ".ekx" ) | | ( ext = = ".bin" ) | | ( ext = = ".pkx" ) | | ( ext = = ".ek6" ) | | ( ext = = ".pk6" ) )
{
2014-12-06 02:14:04 +00:00
if ( ( ext = = ".ekx" ) | | ( ext = = ".bin" ) | | ( ext = = ".ek6" ) ) // User Requested Encrypted File
2014-10-10 02:59:57 +00:00
pkx = PKX . encryptArray ( pkx ) ;
2014-06-28 21:22:05 +00:00
File . WriteAllBytes ( path , pkx . ToArray ( ) ) ;
}
else
{
2014-12-11 06:50:40 +00:00
Util . Error ( "Foreign File Extension" , "Exporting as encrypted." ) ;
2014-10-10 02:59:57 +00:00
pkx = PKX . encryptArray ( pkx ) ;
2014-12-06 02:14:04 +00:00
File . WriteAllBytes ( path , pkx ) ;
2014-06-28 21:22:05 +00:00
}
}
}
private void mainmenuExit ( object sender , EventArgs e )
{
2014-08-17 01:42:51 +00:00
this . Close ( ) ;
2014-06-28 21:22:05 +00:00
}
private void mainmenuAbout ( object sender , EventArgs e )
{
2014-07-29 22:33:22 +00:00
// Open a new form with the About details.
2014-12-06 02:14:04 +00:00
new About ( ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void mainmenuWiden ( object sender , EventArgs e )
{
int newwidth ;
if ( Width < Height )
{
2014-07-29 22:33:22 +00:00
newwidth = largeWidth ;
2014-06-28 21:22:05 +00:00
tabBoxMulti . Enabled = true ;
tabBoxMulti . SelectedIndex = 0 ;
}
else
2014-07-29 22:33:22 +00:00
newwidth = shortWidth ;
2014-08-17 01:42:51 +00:00
2014-12-06 02:14:04 +00:00
Width = newwidth ;
2014-06-28 21:22:05 +00:00
}
2014-08-15 22:28:33 +00:00
private void mainmenuCodeGen ( object sender , EventArgs e )
{
// Open Code Generator
CodeGenerator CodeGen = new PKHeX . CodeGenerator ( this ) ;
CodeGen . ShowDialog ( ) ;
byte [ ] data = CodeGen . returnArray ;
if ( data ! = null )
{
2014-10-10 02:59:57 +00:00
byte [ ] decdata = PKX . decryptArray ( data ) ;
2014-08-15 22:28:33 +00:00
Array . Copy ( decdata , buff , 232 ) ;
2014-12-06 02:14:04 +00:00
try { populateFields ( buff ) ; }
2014-08-15 22:28:33 +00:00
catch
{
2014-12-12 05:44:05 +00:00
Array . Copy ( new byte [ 232 ] , buff , 232 ) ;
2014-10-10 02:59:57 +00:00
populateFields ( buff ) ;
2014-12-11 06:50:40 +00:00
Util . Error ( "Imported code did not decrypt properly" , "Please verify that what you imported was correct." ) ;
2014-08-15 22:28:33 +00:00
}
}
}
private void mainmenuBoxReport ( object sender , EventArgs e )
{
2014-10-11 07:22:22 +00:00
frmReport ReportForm = new frmReport ( ) ;
2014-11-27 20:29:49 +00:00
int offset = 0x27A00 ; if ( savegame_oras ) offset = 0x33000 + 0x5400 ;
ReportForm . PopulateData ( savefile , savindex , offset ) ;
2014-08-15 22:28:33 +00:00
ReportForm . ShowDialog ( ) ;
}
2014-06-28 21:22:05 +00:00
// Main Menu Subfunctions //
2014-08-31 20:32:04 +00:00
private void openQuick ( string path )
{
// detect if it is a folder (load into boxes or not)
2014-10-11 07:22:22 +00:00
if ( Directory . Exists ( path ) )
2014-11-28 10:14:15 +00:00
{ loadBoxesFromDB ( path ) ; return ; }
2014-08-31 20:32:04 +00:00
string ext = Path . GetExtension ( path ) ;
FileInfo fi = new FileInfo ( path ) ;
if ( fi . Length > 0x10009C )
2014-12-11 06:50:40 +00:00
Util . Error ( "Input file is too large." , path ) ;
2014-10-11 07:22:22 +00:00
else
2014-08-31 20:32:04 +00:00
{
2014-11-22 07:23:48 +00:00
byte [ ] input ; try { input = File . ReadAllBytes ( path ) ; }
2014-12-11 06:50:40 +00:00
catch { Util . Error ( "File is in use by another program!" , path ) ; return ; }
2014-10-11 07:22:22 +00:00
try { openFile ( input , path , ext ) ; }
catch
2014-08-31 20:32:04 +00:00
{
2014-10-11 07:22:22 +00:00
try
2014-08-31 20:32:04 +00:00
{
2014-12-12 05:44:05 +00:00
byte [ ] blank = PKX . encryptArray ( new byte [ 260 ] ) ;
2014-10-11 07:22:22 +00:00
for ( int i = 0 ; i < 232 ; i + + )
blank [ i ] = ( byte ) ( blank [ i ] ^ input [ i ] ) ;
openFile ( blank , path , ext ) ;
2014-08-31 20:32:04 +00:00
}
2014-10-11 07:22:22 +00:00
catch { openFile ( input , path , ext ) ; }
2014-08-31 20:32:04 +00:00
}
}
}
private void openFile ( byte [ ] input , string path , string ext )
2014-06-28 21:22:05 +00:00
{
2014-11-28 21:34:51 +00:00
#region Powersaves Read - Only Conversion
2014-12-11 06:50:40 +00:00
if ( input . Length = = 0x10009C ) // Resize to 1MB
2014-11-28 21:34:51 +00:00
{
Array . Copy ( input , 0x9C , input , 0 , 0x100000 ) ;
Array . Resize ( ref input , 0x100000 ) ;
}
#endregion
2014-07-28 06:46:12 +00:00
#region Trade Packets
2014-12-11 06:50:40 +00:00
if ( input . Length = = 363 & & BitConverter . ToUInt16 ( input , 0x6B ) = = 0 )
2014-06-28 21:22:05 +00:00
{
// EAD Packet of 363 length
2014-12-12 05:44:05 +00:00
byte [ ] c = new byte [ 260 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( input , 0x67 , c , 0 , 260 ) ;
input = c ;
}
2014-12-11 06:50:40 +00:00
else if ( input . Length = = 407 & & BitConverter . ToUInt16 ( input , 0x98 ) = = 0 )
2014-06-28 21:22:05 +00:00
{
// EAD Packet of 407 length
2014-12-12 05:44:05 +00:00
byte [ ] c = new byte [ 260 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( input , 0x93 , c , 0 , 260 ) ;
input = c ;
}
2014-07-28 06:46:12 +00:00
#endregion
#region Saves
2014-11-21 23:34:10 +00:00
else if ( ( input . Length = = 0x76000 ) & & BitConverter . ToUInt32 ( input , 0x75E10 ) = = 0x42454546 ) // ORAS
2014-11-15 05:08:00 +00:00
openMAIN ( input , path , "ORAS" , true ) ;
else if ( ( input . Length = = 0x65600 ) & & BitConverter . ToUInt32 ( input , 0x65410 ) = = 0x42454546 ) // XY
openMAIN ( input , path , "XY" , false ) ;
2014-06-28 21:22:05 +00:00
// Verify the Data Input Size is Proper
2014-07-28 06:46:12 +00:00
else if ( input . Length = = 0x100000 )
2014-06-28 21:22:05 +00:00
{
2014-12-12 05:44:05 +00:00
if ( BitConverter . ToUInt64 ( input , 0x10 ) ! = 0 ) // encrypted save
{ Util . Error ( "PKHeX only edits decrypted save files." , "This save file is not decrypted." ) ; return ; }
2014-06-28 21:22:05 +00:00
B_ExportSAV . Enabled = false ;
B_SwitchSAV . Enabled = false ;
2014-08-01 05:36:42 +00:00
B_JPEG . Enabled = false ;
2014-11-28 21:34:51 +00:00
string GameType = "XY" ; // Default Game Type to load.
if ( BitConverter . ToUInt32 ( input , 0x7B210 ) = = 0x42454546 ) GameType = "ORAS" ; // BEEF magic in checksum block
2014-06-28 21:22:05 +00:00
if ( ( BitConverter . ToUInt32 ( input , 0x100 ) ! = 0x41534944 ) & & ( BitConverter . ToUInt32 ( input , 0x5234 ) ! = 0x6E69616D ) )
{
2014-12-11 06:50:40 +00:00
DialogResult dialogResult = Util . Prompt ( MessageBoxButtons . YesNo , "Save file is not decrypted." , "Press Yes to ignore this warning and continue loading the save file." ) ;
2014-06-28 21:22:05 +00:00
if ( dialogResult = = DialogResult . Yes )
{
2014-12-11 06:50:40 +00:00
DialogResult sdr = Util . Prompt ( MessageBoxButtons . YesNoCancel , "Press Yes to load the sav at 0x3000" , "Press No for the one at 0x82000" ) ;
2014-06-28 21:22:05 +00:00
if ( sdr = = DialogResult . Cancel )
return ;
else if ( sdr = = DialogResult . Yes )
{
savindex = 0 ;
B_SwitchSAV . Enabled = true ;
}
else savindex = 1 ;
B_SwitchSAV . Enabled = true ;
2014-11-28 21:34:51 +00:00
open1MB ( input , path , GameType , false ) ;
2014-06-28 21:22:05 +00:00
}
}
2014-10-11 07:22:22 +00:00
else if ( PKX . detectSAVIndex ( input , ref savindex ) = = 2 )
2014-06-28 21:22:05 +00:00
{
2014-12-11 06:50:40 +00:00
DialogResult dialogResult = Util . Prompt ( MessageBoxButtons . YesNo , "Hash verification failed." , "Press Yes to ignore this warning and continue loading the save file." ) ;
2014-06-28 21:22:05 +00:00
if ( dialogResult = = DialogResult . Yes )
{
2014-12-11 06:50:40 +00:00
DialogResult sdr = Util . Prompt ( MessageBoxButtons . YesNoCancel , "Press Yes to load the sav at 0x3000" , "Press No for the one at 0x82000" ) ;
2014-06-28 21:22:05 +00:00
if ( sdr = = DialogResult . Cancel )
{
savindex = 0 ;
2014-12-06 02:14:04 +00:00
return ; // abort load
2014-06-28 21:22:05 +00:00
}
else if ( sdr = = DialogResult . Yes )
{
savindex = 0 ;
B_SwitchSAV . Enabled = true ;
}
else savindex = 1 ;
B_SwitchSAV . Enabled = true ;
2014-11-28 21:34:51 +00:00
open1MB ( input , path , GameType , false ) ;
2014-06-28 21:22:05 +00:00
}
}
else
{
B_ExportSAV . Enabled = true ;
B_SwitchSAV . Enabled = true ;
2014-10-11 07:22:22 +00:00
PKX . detectSAVIndex ( input , ref savindex ) ;
2014-11-28 21:34:51 +00:00
open1MB ( input , path , GameType , false ) ;
2014-06-28 21:22:05 +00:00
}
2014-08-01 05:36:42 +00:00
B_JPEG . Enabled = true ;
2014-06-28 21:22:05 +00:00
}
#endregion
2014-07-28 06:46:12 +00:00
#region PK6 / EK6
2014-06-28 21:22:05 +00:00
else if ( ( input . Length = = 260 ) | | ( input . Length = = 232 ) )
{
// Check if Input is PKX
if ( ( ext = = ".pk6" ) | | ( ext = = ".ek6" ) | | ( ext = = ".pkx" ) | | ( ext = = ".ekx" ) | | ( ext = = ".bin" ) | | ( ext = = "" ) )
{
// Check if either is encrypted from another program.
2014-11-15 05:08:00 +00:00
if ( BitConverter . ToUInt16 ( input , 0xC8 ) = = 0 & & BitConverter . ToUInt16 ( input , 0x58 ) = = 0 )
2014-06-28 21:22:05 +00:00
{ // File isn't encrypted.
buff = input ;
2014-10-10 02:59:57 +00:00
populateFields ( buff ) ;
2014-06-28 21:22:05 +00:00
}
else
{
// File is encrypted.
2014-10-10 02:59:57 +00:00
buff = PKX . decryptArray ( input ) ;
populateFields ( buff ) ;
2014-06-28 21:22:05 +00:00
}
}
2014-07-28 06:46:12 +00:00
else
2014-12-11 06:50:40 +00:00
Util . Error ( "Unable to recognize file." , "Only valid .pk* .ek* .bin supported." ) ;
2014-06-28 21:22:05 +00:00
}
2014-07-28 06:46:12 +00:00
#endregion
#region PK3 / PK4 / PK5
else if ( ( input . Length = = 136 ) | | ( input . Length = = 220 ) | | ( input . Length = = 236 ) | | ( input . Length = = 100 ) | | ( input . Length = = 80 ) ) // to convert g5pkm
2014-06-28 21:22:05 +00:00
{
2014-10-11 07:22:22 +00:00
var Converter = new pk2pk ( ) ;
2014-12-11 06:50:40 +00:00
if ( ! PKX . verifychk ( input ) ) Util . Error ( "Invalid File (Checksum Error)" ) ;
2014-07-28 06:46:12 +00:00
try // to convert g5pkm
2014-06-28 21:22:05 +00:00
{
2014-11-15 05:08:00 +00:00
byte [ ] data = Converter . ConvertPKM ( input , savefile , savindex ) ;
2014-07-28 06:46:12 +00:00
Array . Copy ( data , buff , 232 ) ;
2014-10-10 02:59:57 +00:00
populateFields ( buff ) ;
2014-06-28 21:22:05 +00:00
}
2014-07-28 06:46:12 +00:00
catch
2014-06-28 21:22:05 +00:00
{
2014-12-12 05:44:05 +00:00
Array . Copy ( new byte [ 232 ] , buff , 232 ) ;
2014-10-10 02:59:57 +00:00
populateFields ( buff ) ;
2014-12-11 06:50:40 +00:00
Util . Error ( "Attempted to load previous generation PKM." , "Conversion failed." ) ;
2014-06-28 21:22:05 +00:00
}
}
2014-07-28 06:46:12 +00:00
#endregion
else
2014-12-11 07:00:25 +00:00
Util . Error ( "Attempted to load an unsupported file type/size." , "File Loaded:" + Environment . NewLine + path ) ;
2014-06-28 21:22:05 +00:00
}
2014-11-15 05:08:00 +00:00
private void openMAIN ( byte [ ] input , string path , string GameType , bool oras )
{
2014-11-19 06:35:39 +00:00
L_Save . Text = "SAV: " + Path . GetFileName ( path ) ;
2014-11-15 05:08:00 +00:00
SaveGame = new SaveGames . SaveStruct ( GameType ) ;
// Load CyberGadget
this . savindex = 0 ;
2014-12-12 05:44:05 +00:00
this . savefile = new byte [ 0x100000 ] ;
2014-11-15 05:08:00 +00:00
this . cyberSAV = input ;
cybergadget = true ;
B_ExportSAV . Enabled = true ;
Array . Copy ( input , 0 , savefile , 0x5400 , input . Length ) ;
2014-11-19 06:35:39 +00:00
openSave ( oras ) ;
2014-11-15 05:08:00 +00:00
}
private void open1MB ( byte [ ] input , string path , string GameType , bool oras )
2014-06-28 21:22:05 +00:00
{
L_Save . Text = "SAV: " + Path . GetFileName ( path ) ;
2014-11-19 06:35:39 +00:00
SaveGame = new SaveGames . SaveStruct ( GameType ) ;
savegame_oras = oras ;
2014-06-28 21:22:05 +00:00
2014-11-19 06:35:39 +00:00
savefile = input ;
cybergadget = false ;
2014-06-28 21:22:05 +00:00
// Logic to allow unlocking of Switch SAV
// Setup SHA
SHA256 mySHA256 = SHA256Managed . Create ( ) ;
// Check both IVFC Hashes
2014-12-12 05:44:05 +00:00
byte [ ] zeroarray = new byte [ 0x200 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , 0x2000 + 0 * 0x7F000 , zeroarray , 0 , 0x20 ) ;
byte [ ] hashValue1 = mySHA256 . ComputeHash ( zeroarray ) ;
Array . Copy ( savefile , 0x2000 + 1 * 0x7F000 , zeroarray , 0 , 0x20 ) ;
byte [ ] hashValue2 = mySHA256 . ComputeHash ( zeroarray ) ;
2014-12-12 05:44:05 +00:00
byte [ ] realHash1 = new byte [ 0x20 ] ;
byte [ ] realHash2 = new byte [ 0x20 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , 0x43C - 0 * 0x130 , realHash1 , 0 , 0x20 ) ;
Array . Copy ( savefile , 0x43C - 1 * 0x130 , realHash2 , 0 , 0x20 ) ;
B_SwitchSAV . Enabled = ( hashValue1 . SequenceEqual ( realHash1 ) & & hashValue2 . SequenceEqual ( realHash2 ) ) ;
2014-12-06 02:14:04 +00:00
getSAVOffsets ( ) ; // just in case
2014-07-27 03:21:31 +00:00
Array . Copy ( savefile , 0x5400 + 0x7F000 * savindex , cyberSAV , 0 , cyberSAV . Length ) ;
2014-11-19 06:35:39 +00:00
openSave ( oras ) ;
}
private void openSave ( bool oras )
{
2014-12-06 02:14:04 +00:00
savegame_oras = oras ;
2014-11-19 06:35:39 +00:00
// Enable Secondary Tools
GB_SAVtools . Enabled =
2014-12-06 02:14:04 +00:00
tabBoxMulti . Enabled = true ;
2014-11-19 06:35:39 +00:00
B_JPEG . Enabled =
B_BoxIO . Enabled =
B_VerifyCHK . Enabled = true ;
2014-11-28 10:14:15 +00:00
B_VerifySHA . Enabled = B_SwitchSAV . Enabled = false ;
2014-11-19 06:35:39 +00:00
savedited = false ;
Menu_ToggleBoxUI . Visible = false ;
// Set up Boxes
C_BoxSelect . SelectedIndex = 0 ;
tabBoxMulti . SelectedIndex = 0 ;
setBoxNames ( ) ; // Display the Box Names
setPKXBoxes ( ) ; // Reload all of the PKX Windows
setSAVLabel ( ) ; // Reload the label indicating current save
2014-11-26 06:24:32 +00:00
// Version Exclusive Editors
GB_SUBE . Visible = ! oras ;
2014-11-23 22:23:40 +00:00
B_OpenSecretBase . Visible = oras ;
2014-11-19 06:35:39 +00:00
this . Width = largeWidth ;
2014-12-05 03:19:53 +00:00
savLoaded = true ;
2014-11-28 10:14:15 +00:00
System . Media . SystemSounds . Beep . Play ( ) ; // audibly indicate the save is loaded
2014-11-19 06:35:39 +00:00
}
2014-06-28 21:22:05 +00:00
// Secondary Windows for Ribbons/Amie/Memories
private void openribbons ( object sender , EventArgs e )
{
2014-12-06 02:14:04 +00:00
new RibbMedal ( this ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void openhistory ( object sender , EventArgs e )
{
2014-12-06 02:14:04 +00:00
new MemoryAmie ( this ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
// Open/Save Array Manipulation //
2014-07-20 04:28:35 +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-07-16 19:16:16 +00:00
#region ComboBoxes
2014-06-28 21:22:05 +00:00
ComboBox [ ] cba = {
CB_Species , CB_Nature , CB_HeldItem , CB_Ability , CB_Country , CB_SubRegion , // Main Tab
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 ( ) ;
if ( back ! = System . Drawing . SystemColors . Control . ToArgb ( ) & & back ! = 0 & & back ! = - 1 )
2014-06-28 21:22:05 +00:00
{
2014-08-17 01:42:51 +00:00
if ( i < 6 ) // Main Tab
2014-06-28 21:22:05 +00:00
tabMain . SelectedIndex = 0 ;
2014-07-12 01:39:24 +00:00
else if ( i < 9 ) // Met Tab
2014-06-28 21:22:05 +00:00
tabMain . SelectedIndex = 1 ;
2014-08-17 01:42:51 +00:00
else // Moves
2014-06-28 21:22:05 +00:00
tabMain . SelectedIndex = 3 ;
2014-07-16 19:16:16 +00:00
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-10-10 02:59:57 +00:00
if ( Util . getIndex ( CB_Species ) = = 0 ) // Not gonna write 0 species.
2014-11-28 10:14:15 +00:00
{ tabMain . SelectedIndex = 0 ; goto invalid ; }
2014-10-11 07:22:22 +00:00
2014-07-16 19:16:16 +00:00
// If no errors detected...
2014-06-28 21:22:05 +00:00
return true ;
2014-07-16 19:16:16 +00:00
// else...
2014-10-11 07:22:22 +00:00
invalid :
2014-11-28 10:14:15 +00:00
{ System . Media . SystemSounds . Exclamation . Play ( ) ; return false ; }
2014-06-28 21:22:05 +00:00
}
2014-07-20 04:28:35 +00:00
public byte [ ] preparepkx ( byte [ ] buff )
2014-06-28 21:22:05 +00:00
{
2014-10-25 22:52:24 +00:00
tabMain . Select ( ) ; // hack to make sure comboboxes are set (users scrolling through and immediately setting causes this)
2014-12-11 06:50:40 +00:00
// Stuff the global byte array with our PKX form data
2014-06-28 21:22:05 +00:00
// Create a new storage so we don't muck up things with the original
2014-12-11 06:50:40 +00:00
byte [ ] pkx = new byte [ 0x104 ] ;
Array . Copy ( buff , pkx , 0x104 ) ;
2014-06-28 21:22:05 +00:00
// Repopulate PKX 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
{
2014-10-10 02:59:57 +00:00
uint EC = Util . getHEXval ( TB_EC ) ;
uint PID = Util . getHEXval ( TB_PID ) ;
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 ;
uint XOR = ( TID ^ LID ^ SID ^ HID ) ;
// Ensure we don't have a shiny.
if ( XOR < 16 & & XOR > = 8 ) // Illegal, fix.
{
// Keep as shiny, so we have to mod the PID
PID = ( PID ^ XOR ) ;
TB_PID . Text = PID . ToString ( "X8" ) ;
TB_EC . Text = PID . ToString ( "X8" ) ;
}
else if ( ( XOR ^ 0x8000 ) > = 8 & & ( XOR ^ 0x8000 ) < 16 & & ( PID ! = EC ) )
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
2014-10-10 02:59:57 +00:00
Array . Copy ( BitConverter . GetBytes ( Util . getHEXval ( TB_EC ) ) , 0 , pkx , 0 , 4 ) ; // EC
2014-06-28 21:22:05 +00:00
Array . Copy ( BitConverter . GetBytes ( 0 ) , 0 , pkx , 0x4 , 4 ) ; // 0 CHK for now
// Block A
2014-12-04 01:26:12 +00:00
int species = Util . getIndex ( CB_Species ) ;
Array . Copy ( BitConverter . GetBytes ( species ) , 0 , pkx , 0x08 , 2 ) ; // Species
2014-10-11 07:22:22 +00:00
Array . Copy ( BitConverter . GetBytes ( Util . getIndex ( CB_HeldItem ) ) , 0 , pkx , 0x0A , 2 ) ; // Held Item
Array . Copy ( BitConverter . GetBytes ( Util . ToUInt32 ( TB_TID . Text ) ) , 0 , pkx , 0x0C , 2 ) ; // TID
Array . Copy ( BitConverter . GetBytes ( Util . ToUInt32 ( TB_SID . Text ) ) , 0 , pkx , 0x0E , 2 ) ; // SID
2014-06-28 21:22:05 +00:00
Array . Copy ( BitConverter . GetBytes ( Convert . ToUInt32 ( TB_EXP . Text ) ) , 0 , pkx , 0x10 , 4 ) ; // EXP
2014-10-11 07:22:22 +00:00
pkx [ 0x14 ] = ( byte ) Array . IndexOf ( abilitylist , ( CB_Ability . Text ) . Remove ( ( CB_Ability . Text ) . Length - 4 ) ) ; // Ability
2014-10-10 02:59:57 +00:00
pkx [ 0x15 ] = ( byte ) ( 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)
2014-10-11 07:22:22 +00:00
Array . Copy ( BitConverter . GetBytes ( Util . getHEXval ( TB_PID ) ) , 0 , pkx , 0x18 , 4 ) ; // PID
pkx [ 0x1C ] = ( byte ) ( ( Util . getIndex ( CB_Nature ) ) ) ; // Nature
2014-08-17 01:42:51 +00:00
int fegform = ( int ) ( Convert . ToInt32 ( CHK_Fateful . Checked ) ) ; // Fateful
2014-12-11 06:50:40 +00:00
fegform | = ( PKX . getGender ( Label_Gender . Text ) < < 1 ) ; // Gender
if ( MT_Form . Enabled ) fegform | = ( Math . Min ( Convert . ToInt32 ( MT_Form . Text ) , 32 ) < < 3 ) ; // Form
else fegform | = ( ( Util . getIndex ( CB_Form ) ) < < 3 ) ;
2014-06-28 21:22:05 +00:00
pkx [ 0x1D ] = ( byte ) fegform ;
2014-10-10 02:59:57 +00:00
pkx [ 0x1E ] = ( byte ) ( Util . ToInt32 ( TB_HPEV . Text ) & 0xFF ) ; // EVs
pkx [ 0x1F ] = ( byte ) ( Util . ToInt32 ( TB_ATKEV . Text ) & 0xFF ) ;
pkx [ 0x20 ] = ( byte ) ( Util . ToInt32 ( TB_DEFEV . Text ) & 0xFF ) ;
pkx [ 0x21 ] = ( byte ) ( Util . ToInt32 ( TB_SPEEV . Text ) & 0xFF ) ;
pkx [ 0x22 ] = ( byte ) ( Util . ToInt32 ( TB_SPAEV . Text ) & 0xFF ) ;
pkx [ 0x23 ] = ( byte ) ( Util . ToInt32 ( TB_SPDEV . Text ) & 0xFF ) ;
pkx [ 0x24 ] = ( byte ) ( Util . ToInt32 ( TB_Cool . Text ) & 0xFF ) ; // CNT
pkx [ 0x25 ] = ( byte ) ( Util . ToInt32 ( TB_Beauty . Text ) & 0xFF ) ;
pkx [ 0x26 ] = ( byte ) ( Util . ToInt32 ( TB_Cute . Text ) & 0xFF ) ;
pkx [ 0x27 ] = ( byte ) ( Util . ToInt32 ( TB_Smart . Text ) & 0xFF ) ;
pkx [ 0x28 ] = ( byte ) ( Util . ToInt32 ( TB_Tough . Text ) & 0xFF ) ;
pkx [ 0x29 ] = ( byte ) ( Util . ToInt32 ( TB_Sheen . Text ) & 0xFF ) ;
2014-06-28 21:22:05 +00:00
// stupid & 0xFF to prevent bad values being stuffed
int markings = Convert . ToInt32 ( CHK_Circle . Checked ) ;
markings + = Convert . ToInt32 ( CHK_Triangle . Checked ) * 2 ;
markings + = Convert . ToInt32 ( CHK_Square . Checked ) * 4 ;
markings + = Convert . ToInt32 ( CHK_Heart . Checked ) * 8 ;
markings + = Convert . ToInt32 ( CHK_Star . Checked ) * 16 ;
markings + = Convert . ToInt32 ( CHK_Diamond . Checked ) * 32 ;
pkx [ 0x2A ] = ( byte ) markings ;
2014-07-20 19:28:56 +00:00
pkx [ 0x2B ] = ( byte ) ( CB_PKRSDays . SelectedIndex + CB_PKRSStrain . SelectedIndex * 0x10 ) ;
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
string nicknamestr = TB_Nickname . Text ;
2014-08-17 01:42:51 +00:00
if ( ! CHK_Nicknamed . Checked ) // Get the correct gender sign
2014-06-28 21:22:05 +00:00
{
if ( nicknamestr . Contains ( ( char ) 0x2640 ) )
nicknamestr = Regex . Replace ( nicknamestr , "\u2640" , "\uE08F" ) ;
else if ( nicknamestr . Contains ( ( char ) 0x2642 ) )
nicknamestr = Regex . Replace ( nicknamestr , "\u2642" , "\uE08E" ) ;
}
byte [ ] nicknamebytes = Encoding . Unicode . GetBytes ( nicknamestr ) ;
2014-12-11 06:50:40 +00:00
Array . Resize ( ref nicknamebytes , 24 ) ; // pad with zeroes and effectively keep no trash bytes
2014-06-28 21:22:05 +00:00
Array . Copy ( nicknamebytes , 0 , pkx , 0x40 , nicknamebytes . Length ) ;
2014-07-26 21:56:06 +00:00
// 0x58, 0x59 unused
2014-10-10 02:59:57 +00:00
Array . Copy ( BitConverter . GetBytes ( Util . getIndex ( CB_Move1 ) ) , 0 , pkx , 0x5A , 2 ) ; // Move 1
Array . Copy ( BitConverter . GetBytes ( Util . getIndex ( CB_Move2 ) ) , 0 , pkx , 0x5C , 2 ) ; // Move 2
Array . Copy ( BitConverter . GetBytes ( Util . getIndex ( CB_Move3 ) ) , 0 , pkx , 0x5E , 2 ) ; // Move 3
Array . Copy ( BitConverter . GetBytes ( Util . getIndex ( CB_Move4 ) ) , 0 , pkx , 0x60 , 2 ) ; // Move 4
2014-06-28 21:22:05 +00:00
2014-10-10 02:59:57 +00:00
pkx [ 0x62 ] = ( byte ) ( Util . ToInt32 ( TB_PP1 . Text ) & 0xFF ) ; // Max PP
pkx [ 0x63 ] = ( byte ) ( Util . ToInt32 ( TB_PP2 . Text ) & 0xFF ) ;
pkx [ 0x64 ] = ( byte ) ( Util . ToInt32 ( TB_PP3 . Text ) & 0xFF ) ;
pkx [ 0x65 ] = ( byte ) ( Util . ToInt32 ( TB_PP4 . Text ) & 0xFF ) ;
2014-06-28 21:22:05 +00:00
2014-07-26 21:56:06 +00:00
pkx [ 0x66 ] = ( byte ) ( CB_PPu1 . SelectedIndex ) ; // PP Ups
2014-06-28 21:22:05 +00:00
pkx [ 0x67 ] = ( byte ) ( CB_PPu2 . SelectedIndex ) ;
pkx [ 0x68 ] = ( byte ) ( CB_PPu3 . SelectedIndex ) ;
pkx [ 0x69 ] = ( byte ) ( CB_PPu4 . SelectedIndex ) ;
2014-07-29 22:33:22 +00:00
// Don't allow PP Ups if there is no move.
for ( int i = 0 ; i < 4 ; i + + )
2014-08-03 05:15:47 +00:00
if ( pkx [ 0x62 + i ] = = 0 ) pkx [ 0x66 + i ] = 0 ;
2014-07-29 22:33:22 +00:00
2014-10-10 02:59:57 +00:00
Array . Copy ( BitConverter . GetBytes ( Util . getIndex ( CB_RelearnMove1 ) ) , 0 , pkx , 0x6A , 2 ) ; // EggMove 1
Array . Copy ( BitConverter . GetBytes ( Util . getIndex ( CB_RelearnMove2 ) ) , 0 , pkx , 0x6C , 2 ) ; // EggMove 2
Array . Copy ( BitConverter . GetBytes ( Util . getIndex ( CB_RelearnMove3 ) ) , 0 , pkx , 0x6E , 2 ) ; // EggMove 3
Array . Copy ( BitConverter . GetBytes ( Util . getIndex ( CB_RelearnMove4 ) ) , 0 , pkx , 0x70 , 2 ) ; // EggMove 4
2014-06-28 21:22:05 +00:00
// 0x72 - Ribbon editor sets this flag (Secret Super Training)
// 0x73
2014-10-10 02:59:57 +00:00
uint IV32 = Util . ToUInt32 ( TB_HPIV . Text ) & 0x1F ;
IV32 + = ( ( Util . ToUInt32 ( TB_ATKIV . Text ) & 0x1F ) < < 5 ) ;
IV32 + = ( ( Util . ToUInt32 ( TB_DEFIV . Text ) & 0x1F ) < < 10 ) ;
IV32 + = ( ( Util . ToUInt32 ( TB_SPEIV . Text ) & 0x1F ) < < 15 ) ;
IV32 + = ( ( Util . ToUInt32 ( TB_SPAIV . Text ) & 0x1F ) < < 20 ) ;
IV32 + = ( ( Util . ToUInt32 ( TB_SPDIV . Text ) & 0x1F ) < < 25 ) ;
2014-06-28 21:22:05 +00:00
IV32 + = ( Convert . ToUInt32 ( CHK_IsEgg . Checked ) < < 30 ) ;
IV32 + = ( Convert . ToUInt32 ( CHK_Nicknamed . Checked ) < < 31 ) ;
pkx [ 0x74 ] = ( byte ) ( ( IV32 > > 00 ) & 0xFF ) ; // IVs
pkx [ 0x75 ] = ( byte ) ( ( IV32 > > 08 ) & 0xFF ) ;
pkx [ 0x76 ] = ( byte ) ( ( IV32 > > 16 ) & 0xFF ) ;
pkx [ 0x77 ] = ( byte ) ( ( IV32 > > 24 ) & 0xFF ) ;
2014-07-26 21:56:06 +00:00
// Block C
2014-06-28 21:22:05 +00:00
// Convert OTT2 field back to bytes
byte [ ] OT2 = Encoding . Unicode . GetBytes ( TB_OTt2 . Text ) ;
Array . Resize ( ref OT2 , 24 ) ;
Array . Copy ( OT2 , 0 , pkx , 0x78 , OT2 . Length ) ;
//0x90-0xAF
2014-12-04 01:26:12 +00:00
pkx [ 0x92 ] = Convert . ToByte ( PKX . getGender ( Label_CTGender . Text ) = = 1 ) ;
2014-06-28 21:22:05 +00:00
//Plus more, set by MemoryAmie (already in buff)
2014-07-26 21:56:06 +00:00
// Block D
2014-06-28 21:22:05 +00:00
// Convert OT field back to bytes
byte [ ] OT = Encoding . Unicode . GetBytes ( TB_OT . Text ) ;
Array . Resize ( ref OT , 24 ) ;
Array . Copy ( OT , 0 , pkx , 0xB0 , OT . Length ) ;
if ( pkx [ 0x93 ] = = 0 )
2014-10-10 02:59:57 +00:00
pkx [ 0xCA ] = ( byte ) ( Util . ToInt32 ( TB_Friendship . Text ) & 0xFF ) ;
2014-07-26 21:56:06 +00:00
else // 1
2014-10-10 02:59:57 +00:00
pkx [ 0xA2 ] = ( byte ) ( Util . ToInt32 ( TB_Friendship . Text ) & 0xFF ) ;
2014-06-28 21:22:05 +00:00
int egg_year = 2000 ; // Dates
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
pkx [ 0xD1 ] = ( byte ) ( egg_year - 2000 ) ;
pkx [ 0xD2 ] = ( byte ) egg_month ;
pkx [ 0xD3 ] = ( byte ) egg_day ;
// Met Data
pkx [ 0xD4 ] = ( byte ) ( CAL_MetDate . Value . Year - 2000 ) ;
pkx [ 0xD5 ] = ( byte ) CAL_MetDate . Value . Month ;
pkx [ 0xD6 ] = ( byte ) CAL_MetDate . Value . Day ;
2014-09-23 04:05:27 +00:00
if ( CHK_IsEgg . Checked & & CB_MetLocation . SelectedIndex = = 0 ) // If still an egg, it has no hatch location/date. Zero it!
2014-06-28 21:22:05 +00:00
{
pkx [ 0xD4 ] = 0 ;
pkx [ 0xD5 ] = 0 ;
pkx [ 0xD6 ] = 0 ;
}
// 0xD7 Unknown
2014-10-10 02:59:57 +00:00
int met_location = Util . getIndex ( CB_MetLocation ) ; // Locations
2014-06-28 21:22:05 +00:00
Array . Copy ( BitConverter . GetBytes ( egg_location ) , 0 , pkx , 0xD8 , 2 ) ; // Egg Location
Array . Copy ( BitConverter . GetBytes ( met_location ) , 0 , pkx , 0xDA , 2 ) ; // Met Location
2014-10-10 02:59:57 +00:00
pkx [ 0xDC ] = ( byte ) Util . getIndex ( CB_Ball ) ;
2014-12-04 01:26:12 +00:00
pkx [ 0xDD ] = ( byte ) ( ( ( Util . ToInt32 ( TB_MetLevel . Text ) & 0x7F ) + ( Convert . ToInt32 ( PKX . getGender ( Label_OTGender . Text ) = = 1 ) < < 7 ) ) ) ;
2014-10-10 02:59:57 +00:00
pkx [ 0xDE ] = ( byte ) ( Util . ToInt32 ( CB_EncounterType . SelectedValue . ToString ( ) ) ) ;
pkx [ 0xDF ] = ( byte ) Util . getIndex ( CB_GameOrigin ) ;
pkx [ 0xE0 ] = ( byte ) Util . getIndex ( CB_Country ) ;
pkx [ 0xE1 ] = ( byte ) Util . getIndex ( CB_SubRegion ) ;
pkx [ 0xE2 ] = ( byte ) Util . getIndex ( CB_3DSReg ) ;
pkx [ 0xE3 ] = ( byte ) Util . getIndex ( CB_Language ) ;
2014-06-28 21:22:05 +00:00
// 0xE4-0xE7
Array . Resize ( ref pkx , 260 ) ;
// Party Stats
pkx [ 0xE8 ] = 0 ; pkx [ 0xE9 ] = 0 ;
pkx [ 0xEA ] = 0 ; pkx [ 0xEB ] = 0 ;
2014-11-26 03:55:46 +00:00
pkx [ 0xEC ] = ( byte ) Util . ToInt32 ( TB_Level . Text ) ; // Level
2014-06-28 21:22:05 +00:00
pkx [ 0xED ] = 0 ; pkx [ 0xEE ] = 0 ; pkx [ 0xEF ] = 0 ;
2014-10-10 02:59:57 +00:00
Array . Copy ( BitConverter . GetBytes ( Math . Min ( Util . ToInt32 ( Stat_HP . Text ) , 65535 ) ) , 0 , pkx , 0xF0 , 2 ) ; // Current HP
Array . Copy ( BitConverter . GetBytes ( Math . Min ( Util . ToInt32 ( Stat_HP . Text ) , 65535 ) ) , 0 , pkx , 0xF2 , 2 ) ; // Max HP
Array . Copy ( BitConverter . GetBytes ( Math . Min ( Util . ToInt32 ( Stat_ATK . Text ) , 65535 ) ) , 0 , pkx , 0xF4 , 2 ) ; // ATK
Array . Copy ( BitConverter . GetBytes ( Math . Min ( Util . ToInt32 ( Stat_DEF . Text ) , 65535 ) ) , 0 , pkx , 0xF6 , 2 ) ; // DEF
Array . Copy ( BitConverter . GetBytes ( Math . Min ( Util . ToInt32 ( Stat_SPE . Text ) , 65535 ) ) , 0 , pkx , 0xF8 , 2 ) ; // SPE
Array . Copy ( BitConverter . GetBytes ( Math . Min ( Util . ToInt32 ( Stat_SPA . Text ) , 65535 ) ) , 0 , pkx , 0xFA , 2 ) ; // SPA
Array . Copy ( BitConverter . GetBytes ( Math . Min ( Util . ToInt32 ( Stat_SPD . Text ) , 65535 ) ) , 0 , pkx , 0xFC , 2 ) ; // SPD
2014-08-17 01:42:51 +00:00
pkx [ 0xFE ] = 0 ; pkx [ 0xFF ] = 0 ;
2014-06-28 21:22:05 +00:00
pkx [ 0x100 ] = 0 ; pkx [ 0x101 ] = 0 ; pkx [ 0x102 ] = 0 ; pkx [ 0x103 ] = 0 ;
2014-08-17 01:42:51 +00:00
// Hax Illegality
2014-08-15 04:27:53 +00:00
if ( DEV_Ability . Enabled )
{
2014-11-26 03:55:46 +00:00
pkx [ 0x14 ] = ( byte ) Util . getIndex ( DEV_Ability ) ; // Ability
pkx [ 0xEC ] = ( byte ) Math . Min ( Convert . ToInt32 ( MT_Level . Text ) , 255 ) ; // Level
2014-10-11 07:22:22 +00:00
}
// Fix Moves if a slot is empty
for ( int i = 0 ; i < 3 ; i + + )
{
if ( BitConverter . ToUInt16 ( pkx , 0x5A + 2 * i ) = = 0 )
{
Array . Copy ( pkx , 0x5C + 2 * i , pkx , 0x5A + 2 * i , 2 ) ; // Shift moves down
2014-12-12 05:44:05 +00:00
Array . Copy ( new byte [ 2 ] , 0 , pkx , 0x5C + 2 * i , 2 ) ; // Clear next move (error shifted down)
2014-10-11 07:22:22 +00:00
// Move PP and PP Ups down one byte.
pkx [ 0x62 + i ] = pkx [ 0x63 + i ] ; pkx [ 0x63 + i ] = 0 ; // PP
pkx [ 0x66 + i ] = pkx [ 0x67 + i ] ; pkx [ 0x67 + i ] = 0 ; // PP Ups
}
}
// Fix Relearn moves if a slot is empty
for ( int i = 0 ; i < 3 ; i + + )
{
if ( BitConverter . ToUInt16 ( pkx , 0x6A + 2 * i ) = = 0 )
{
Array . Copy ( pkx , 0x6C + 2 * i , pkx , 0x6A + 2 * i , 2 ) ; // Shift moves down
2014-12-12 05:44:05 +00:00
Array . Copy ( new byte [ 2 ] , 0 , pkx , 0x6C + 2 * i , 2 ) ; // Clear next move (error shifted down)
2014-10-11 07:22:22 +00:00
}
}
// No foreign memories for Pokemon without a foreign trainer
if ( BitConverter . ToUInt16 ( pkx , 0x78 ) = = 0 )
{
pkx [ 0xA2 ] = pkx [ 0xA3 ] = // No Friendship/Affection
pkx [ 0xA8 ] = pkx [ 0xA9 ] = // No Memory Var
pkx [ 0xA4 ] = pkx [ 0xA5 ] = pkx [ 0xA6 ] = 0 ; // No Memory Types
2014-08-15 04:27:53 +00:00
}
2014-06-28 21:22:05 +00:00
// Now we fix the checksum!
2014-08-17 01:42:51 +00:00
ushort chk = 0 ;
2014-06-28 21:22:05 +00:00
for ( int i = 8 ; i < 232 ; i + = 2 ) // Loop through the entire PKX
2014-12-11 06:50:40 +00:00
chk + = BitConverter . ToUInt16 ( pkx , i ) ;
2014-06-28 21:22:05 +00:00
// Apply New Checksum
Array . Copy ( BitConverter . GetBytes ( chk ) , 0 , pkx , 06 , 2 ) ;
// PKX is now filled
return pkx ;
}
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 ) ;
string path = files [ 0 ] ; // open first D&D
2014-08-31 20:32:04 +00:00
openQuick ( path ) ;
2014-06-28 21:22:05 +00:00
}
// Decrypted Export
private void dragout_MouseDown ( object sender , MouseEventArgs e )
{
if ( ! verifiedpkx ( ) ) { return ; }
{
// Create Temp File to Drag
string basepath = System . Windows . Forms . Application . StartupPath ;
Cursor . Current = Cursors . Hand ;
2014-11-30 18:59:10 +00:00
// Make a new file name
2014-06-28 21:22:05 +00:00
byte [ ] dragdata = preparepkx ( buff ) ;
2014-11-30 18:59:10 +00:00
PKX pkx = new PKX ( dragdata ) ;
string filename = pkx . Nickname ;
if ( filename ! = pkx . Species )
filename + = " (" + pkx . Species + ")" ;
filename + = " - " + pkx . PID + ".pk6" ;
2014-06-28 21:22:05 +00:00
// Strip out party stats (if they are there)
Array . Resize ( ref dragdata , 232 ) ;
// Make File
2014-11-28 23:46:09 +00:00
string newfile = Path . Combine ( basepath , Util . CleanFileName ( filename ) ) ;
2014-06-28 21:22:05 +00:00
try
{
2014-07-14 18:44:40 +00:00
File . WriteAllBytes ( newfile , dragdata ) ;
2014-06-28 21:22:05 +00:00
2014-07-14 18:44:40 +00:00
string [ ] filesToDrag = { newfile } ;
2014-06-28 21:22:05 +00:00
dragout . DoDragDrop ( new DataObject ( DataFormats . FileDrop , filesToDrag ) , DragDropEffects . Move ) ;
2014-07-14 18:44:40 +00:00
File . Delete ( newfile ) ;
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
}
}
private void dragout_DragOver ( object sender , DragEventArgs e )
{
e . Effect = DragDropEffects . Move ;
}
// Encrypted Export
private void eragout_MouseDown ( object sender , MouseEventArgs e )
{
if ( ! verifiedpkx ( ) ) { return ; }
{
// Create Temp File to Drag
string basepath = System . Windows . Forms . Application . StartupPath ;
Cursor . Current = Cursors . Hand ;
2014-11-30 18:59:10 +00:00
// Make a new file name
byte [ ] dragdata = preparepkx ( buff ) ;
PKX pkx = new PKX ( dragdata ) ;
string filename = pkx . Nickname ;
if ( filename ! = pkx . Species )
filename + = " (" + pkx . Species + ")" ;
filename + = " - " + pkx . PID + ".ek6" ;
dragdata = PKX . encryptArray ( preparepkx ( buff ) ) ;
2014-06-28 21:22:05 +00:00
// Strip out party stats (if they are there)
Array . Resize ( ref dragdata , 232 ) ;
// Make file
2014-11-28 23:46:09 +00:00
string newfile = Path . Combine ( basepath , Util . CleanFileName ( filename ) ) ;
2014-06-28 21:22:05 +00:00
try
{
2014-07-14 18:44:40 +00:00
File . WriteAllBytes ( newfile , dragdata ) ;
2014-06-28 21:22:05 +00:00
2014-07-14 18:44:40 +00:00
string [ ] filesToDrag = { newfile } ;
2014-06-28 21:22:05 +00:00
dragout . DoDragDrop ( new DataObject ( DataFormats . FileDrop , filesToDrag ) , DragDropEffects . Move ) ;
2014-07-14 18:44:40 +00:00
File . Delete ( newfile ) ;
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
}
}
private void eragout_DragOver ( object sender , DragEventArgs e )
{
e . Effect = DragDropEffects . Move ;
}
// Dragout Hover Display
private void dragoutHover ( object sender , EventArgs e )
{
eragout . BackColor = dragout . BackColor = Color . LightGray ;
}
private void dragoutLeave ( object sender , EventArgs e )
{
2014-11-19 06:35:39 +00:00
eragout . BackColor = dragout . BackColor = Color . Transparent ;
2014-06-28 21:22:05 +00:00
}
#endregion
#region //// SAVE FILE FUNCTIONS ////
// Integrity Checks //
private void B_VerifyCHK_Click ( object sender , EventArgs e )
{
if ( savedited )
{
2014-12-11 06:50:40 +00:00
RTB_S . Text = "Save has been edited. Cannot integrity check." ;
2014-06-28 21:22:05 +00:00
return ;
}
// Verify Checksums
RTB_S . Text = "" ;
int invalid1 = 0 ;
2014-11-21 23:34:10 +00:00
uint [ ] start = { 0x05400 , 0x05800 , 0x06400 , 0x06600 , 0x06800 , 0x06A00 , 0x06C00 , 0x06E00 , 0x07000 , 0x07200 , 0x07400 , 0x09600 , 0x09800 , 0x09E00 , 0x0A400 , 0x0F400 , 0x14400 , 0x19400 , 0x19600 , 0x19E00 , 0x1A400 , 0x1AC00 , 0x1B400 , 0x1B600 , 0x1B800 , 0x1BE00 , 0x1C000 , 0x1C400 , 0x1CC00 , 0x1CE00 , 0x1D000 , 0x1D200 , 0x1D400 , 0x1D600 , 0x1DE00 , 0x1E400 , 0x1E800 , 0x20400 , 0x20600 , 0x20800 , 0x20C00 , 0x21000 , 0x22C00 , 0x23000 , 0x23800 , 0x23C00 , 0x24600 , 0x24A00 , 0x25200 , 0x26000 , 0x26200 , 0x26400 , 0x27200 , 0x27A00 , 0x5C600 , } ;
uint [ ] length = { 0x000002C8 , 0x00000B88 , 0x0000002C , 0x00000038 , 0x00000150 , 0x00000004 , 0x00000008 , 0x000001C0 , 0x000000BE , 0x00000024 , 0x00002100 , 0x00000140 , 0x00000440 , 0x00000574 , 0x00004E28 , 0x00004E28 , 0x00004E28 , 0x00000170 , 0x0000061C , 0x00000504 , 0x000006A0 , 0x00000644 , 0x00000104 , 0x00000004 , 0x00000420 , 0x00000064 , 0x000003F0 , 0x0000070C , 0x00000180 , 0x00000004 , 0x0000000C , 0x00000048 , 0x00000054 , 0x00000644 , 0x000005C8 , 0x000002F8 , 0x00001B40 , 0x000001F4 , 0x000001F0 , 0x00000216 , 0x00000390 , 0x00001A90 , 0x00000308 , 0x00000618 , 0x0000025C , 0x00000834 , 0x00000318 , 0x000007D0 , 0x00000C48 , 0x00000078 , 0x00000200 , 0x00000C84 , 0x00000628 , 0x00034AD0 , 0x0000E058 , } ;
2014-06-28 21:22:05 +00:00
int csoff = 0x6A81A ;
2014-11-21 23:34:10 +00:00
if ( savegame_oras )
2014-06-28 21:22:05 +00:00
{
2014-11-21 23:34:10 +00:00
start = new uint [ ] { 0x05400 , 0x05800 , 0x06400 , 0x06600 , 0x06800 , 0x06A00 , 0x06C00 , 0x06E00 , 0x07000 , 0x07200 , 0x07400 , 0x09600 , 0x09800 , 0x09E00 , 0x0A400 , 0x0F400 , 0x14400 , 0x19400 , 0x19600 , 0x19E00 , 0x1A400 , 0x1B600 , 0x1BE00 , 0x1C000 , 0x1C200 , 0x1C800 , 0x1CA00 , 0x1CE00 , 0x1D600 , 0x1D800 , 0x1DA00 , 0x1DC00 , 0x1DE00 , 0x1E000 , 0x1E800 , 0x1EE00 , 0x1F200 , 0x20E00 , 0x21000 , 0x21400 , 0x21800 , 0x22000 , 0x23C00 , 0x24000 , 0x24800 , 0x24C00 , 0x25600 , 0x25A00 , 0x26200 , 0x27000 , 0x27200 , 0x27400 , 0x28200 , 0x28A00 , 0x28E00 , 0x30A00 , 0x38400 , 0x6D000 , } ;
length = new uint [ ] { 0x000002C8 , 0x00000B90 , 0x0000002C , 0x00000038 , 0x00000150 , 0x00000004 , 0x00000008 , 0x000001C0 , 0x000000BE , 0x00000024 , 0x00002100 , 0x00000130 , 0x00000440 , 0x00000574 , 0x00004E28 , 0x00004E28 , 0x00004E28 , 0x00000170 , 0x0000061C , 0x00000504 , 0x000011CC , 0x00000644 , 0x00000104 , 0x00000004 , 0x00000420 , 0x00000064 , 0x000003F0 , 0x0000070C , 0x00000180 , 0x00000004 , 0x0000000C , 0x00000048 , 0x00000054 , 0x00000644 , 0x000005C8 , 0x000002F8 , 0x00001B40 , 0x000001F4 , 0x000003E0 , 0x00000216 , 0x00000640 , 0x00001A90 , 0x00000400 , 0x00000618 , 0x0000025C , 0x00000834 , 0x00000318 , 0x000007D0 , 0x00000C48 , 0x00000078 , 0x00000200 , 0x00000C84 , 0x00000628 , 0x00000400 , 0x00007AD0 , 0x000078B0 , 0x00034AD0 , 0x0000E058 , } ;
csoff = 0x7B21A ;
}
2014-06-28 21:22:05 +00:00
2014-11-21 23:34:10 +00:00
for ( int i = 0 ; i < length . Length ; i + + )
{
2014-12-12 05:44:05 +00:00
byte [ ] data = new byte [ length [ i ] ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , start [ i ] , data , 0 , length [ i ] ) ;
2014-10-11 07:22:22 +00:00
ushort checksum = PKX . ccitt16 ( data ) ;
2014-11-21 23:34:10 +00:00
ushort actualsum = BitConverter . ToUInt16 ( savefile , csoff + i * 0x8 ) ;
2014-06-28 21:22:05 +00:00
if ( checksum ! = actualsum )
{
invalid1 + + ;
2014-12-11 07:00:25 +00:00
RTB_S . Text + = "Invalid: " + i . ToString ( "X2" ) + " @ region " + start [ i ] . ToString ( "X5" ) + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
}
}
2014-12-11 07:00:25 +00:00
RTB_S . Text + = "1st SAV: " + ( start . Length - invalid1 ) . ToString ( ) + "/" + start . Length . ToString ( ) + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
2014-11-22 07:23:48 +00:00
if ( cybergadget ) return ;
2014-06-28 21:22:05 +00:00
// Do it again, but for the second SAV.
csoff + = 0x7F000 ;
2014-08-17 01:42:51 +00:00
for ( int i = 0 ; i < start . Length ; i + + ) // Shift all the save offsets...
2014-06-28 21:22:05 +00:00
start [ i ] + = 0x7F000 ;
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
int invalid2 = 0 ;
for ( int i = 0 ; i < length . Length ; i + + )
{
2014-12-12 05:44:05 +00:00
byte [ ] data = new byte [ length [ i ] ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , start [ i ] , data , 0 , length [ i ] ) ;
2014-10-11 07:22:22 +00:00
ushort checksum = PKX . ccitt16 ( data ) ;
2014-11-21 23:34:10 +00:00
ushort actualsum = BitConverter . ToUInt16 ( savefile , csoff + i * 0x8 ) ;
2014-06-28 21:22:05 +00:00
if ( checksum ! = actualsum )
{
invalid2 + + ;
2014-12-11 07:00:25 +00:00
RTB_S . Text + = "Invalid: " + i . ToString ( "X2" ) + " @ region " + start [ i ] . ToString ( "X5" ) + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
}
}
2014-12-11 07:00:25 +00:00
RTB_S . Text + = "2nd SAV: " + ( start . Length - invalid2 ) . ToString ( ) + "/" + start . Length . ToString ( ) + Environment . NewLine ;
2014-11-21 23:34:10 +00:00
if ( invalid1 + invalid2 = = ( start . Length * 2 ) )
2014-06-28 21:22:05 +00:00
RTB_S . Text = "No checksums are valid." ;
}
private void B_VerifySHA_Click ( object sender , EventArgs e )
{
if ( savedited )
{
2014-12-11 06:50:40 +00:00
RTB_S . Text = "Save has been edited. Cannot integrity check." ;
2014-06-28 21:22:05 +00:00
return ;
}
// Verify Hashes
RTB_S . Text = "" ;
int invalid1 = 0 ;
2014-08-17 01:42:51 +00:00
#region hash table data
2014-06-28 21:22:05 +00:00
uint [ ] hashtabledata = {
0x2020 , 0x203F , 0x2000 , 0x200 ,
0x2040 , 0x2FFF , 0x2020 , 0x1000 ,
0x3000 , 0x3FFF , 0x2040 , 0x1000 ,
0x4000 , 0x4FFF , 0x2060 , 0x1000 ,
0x5000 , 0x5FFF , 0x2080 , 0x1000 ,
0x6000 , 0x6FFF , 0x20A0 , 0x1000 ,
0x7000 , 0x7FFF , 0x20C0 , 0x1000 ,
0x8000 , 0x8FFF , 0x20E0 , 0x1000 ,
0x9000 , 0x9FFF , 0x2100 , 0x1000 ,
0xA000 , 0xAFFF , 0x2120 , 0x1000 ,
0xB000 , 0xBFFF , 0x2140 , 0x1000 ,
0xC000 , 0xCFFF , 0x2160 , 0x1000 ,
0xD000 , 0xDFFF , 0x2180 , 0x1000 ,
0xE000 , 0xEFFF , 0x21A0 , 0x1000 ,
0xF000 , 0xFFFF , 0x21C0 , 0x1000 ,
0x10000 , 0x10FFF , 0x21E0 , 0x1000 ,
0x11000 , 0x11FFF , 0x2200 , 0x1000 ,
0x12000 , 0x12FFF , 0x2220 , 0x1000 ,
0x13000 , 0x13FFF , 0x2240 , 0x1000 ,
0x14000 , 0x14FFF , 0x2260 , 0x1000 ,
0x15000 , 0x15FFF , 0x2280 , 0x1000 ,
0x16000 , 0x16FFF , 0x22A0 , 0x1000 ,
0x17000 , 0x17FFF , 0x22C0 , 0x1000 ,
0x18000 , 0x18FFF , 0x22E0 , 0x1000 ,
0x19000 , 0x19FFF , 0x2300 , 0x1000 ,
0x1A000 , 0x1AFFF , 0x2320 , 0x1000 ,
0x1B000 , 0x1BFFF , 0x2340 , 0x1000 ,
0x1C000 , 0x1CFFF , 0x2360 , 0x1000 ,
0x1D000 , 0x1DFFF , 0x2380 , 0x1000 ,
0x1E000 , 0x1EFFF , 0x23A0 , 0x1000 ,
0x1F000 , 0x1FFFF , 0x23C0 , 0x1000 ,
0x20000 , 0x20FFF , 0x23E0 , 0x1000 ,
0x21000 , 0x21FFF , 0x2400 , 0x1000 ,
0x22000 , 0x22FFF , 0x2420 , 0x1000 ,
0x23000 , 0x23FFF , 0x2440 , 0x1000 ,
0x24000 , 0x24FFF , 0x2460 , 0x1000 ,
0x25000 , 0x25FFF , 0x2480 , 0x1000 ,
0x26000 , 0x26FFF , 0x24A0 , 0x1000 ,
0x27000 , 0x27FFF , 0x24C0 , 0x1000 ,
0x28000 , 0x28FFF , 0x24E0 , 0x1000 ,
0x29000 , 0x29FFF , 0x2500 , 0x1000 ,
0x2A000 , 0x2AFFF , 0x2520 , 0x1000 ,
0x2B000 , 0x2BFFF , 0x2540 , 0x1000 ,
0x2C000 , 0x2CFFF , 0x2560 , 0x1000 ,
0x2D000 , 0x2DFFF , 0x2580 , 0x1000 ,
0x2E000 , 0x2EFFF , 0x25A0 , 0x1000 ,
0x2F000 , 0x2FFFF , 0x25C0 , 0x1000 ,
0x30000 , 0x30FFF , 0x25E0 , 0x1000 ,
0x31000 , 0x31FFF , 0x2600 , 0x1000 ,
0x32000 , 0x32FFF , 0x2620 , 0x1000 ,
0x33000 , 0x33FFF , 0x2640 , 0x1000 ,
0x34000 , 0x34FFF , 0x2660 , 0x1000 ,
0x35000 , 0x35FFF , 0x2680 , 0x1000 ,
0x36000 , 0x36FFF , 0x26A0 , 0x1000 ,
0x37000 , 0x37FFF , 0x26C0 , 0x1000 ,
0x38000 , 0x38FFF , 0x26E0 , 0x1000 ,
0x39000 , 0x39FFF , 0x2700 , 0x1000 ,
0x3A000 , 0x3AFFF , 0x2720 , 0x1000 ,
0x3B000 , 0x3BFFF , 0x2740 , 0x1000 ,
0x3C000 , 0x3CFFF , 0x2760 , 0x1000 ,
0x3D000 , 0x3DFFF , 0x2780 , 0x1000 ,
0x3E000 , 0x3EFFF , 0x27A0 , 0x1000 ,
0x3F000 , 0x3FFFF , 0x27C0 , 0x1000 ,
0x40000 , 0x40FFF , 0x27E0 , 0x1000 ,
0x41000 , 0x41FFF , 0x2800 , 0x1000 ,
0x42000 , 0x42FFF , 0x2820 , 0x1000 ,
0x43000 , 0x43FFF , 0x2840 , 0x1000 ,
0x44000 , 0x44FFF , 0x2860 , 0x1000 ,
0x45000 , 0x45FFF , 0x2880 , 0x1000 ,
0x46000 , 0x46FFF , 0x28A0 , 0x1000 ,
0x47000 , 0x47FFF , 0x28C0 , 0x1000 ,
0x48000 , 0x48FFF , 0x28E0 , 0x1000 ,
0x49000 , 0x49FFF , 0x2900 , 0x1000 ,
0x4A000 , 0x4AFFF , 0x2920 , 0x1000 ,
0x4B000 , 0x4BFFF , 0x2940 , 0x1000 ,
0x4C000 , 0x4CFFF , 0x2960 , 0x1000 ,
0x4D000 , 0x4DFFF , 0x2980 , 0x1000 ,
0x4E000 , 0x4EFFF , 0x29A0 , 0x1000 ,
0x4F000 , 0x4FFFF , 0x29C0 , 0x1000 ,
0x50000 , 0x50FFF , 0x29E0 , 0x1000 ,
0x51000 , 0x51FFF , 0x2A00 , 0x1000 ,
0x52000 , 0x52FFF , 0x2A20 , 0x1000 ,
0x53000 , 0x53FFF , 0x2A40 , 0x1000 ,
0x54000 , 0x54FFF , 0x2A60 , 0x1000 ,
0x55000 , 0x55FFF , 0x2A80 , 0x1000 ,
0x56000 , 0x56FFF , 0x2AA0 , 0x1000 ,
0x57000 , 0x57FFF , 0x2AC0 , 0x1000 ,
0x58000 , 0x58FFF , 0x2AE0 , 0x1000 ,
0x59000 , 0x59FFF , 0x2B00 , 0x1000 ,
0x5A000 , 0x5AFFF , 0x2B20 , 0x1000 ,
0x5B000 , 0x5BFFF , 0x2B40 , 0x1000 ,
0x5C000 , 0x5CFFF , 0x2B60 , 0x1000 ,
0x5D000 , 0x5DFFF , 0x2B80 , 0x1000 ,
0x5E000 , 0x5EFFF , 0x2BA0 , 0x1000 ,
0x5F000 , 0x5FFFF , 0x2BC0 , 0x1000 ,
0x60000 , 0x60FFF , 0x2BE0 , 0x1000 ,
0x61000 , 0x61FFF , 0x2C00 , 0x1000 ,
0x62000 , 0x62FFF , 0x2C20 , 0x1000 ,
0x63000 , 0x63FFF , 0x2C40 , 0x1000 ,
0x64000 , 0x64FFF , 0x2C60 , 0x1000 ,
0x65000 , 0x65FFF , 0x2C80 , 0x1000 ,
0x66000 , 0x66FFF , 0x2CA0 , 0x1000 ,
0x67000 , 0x67FFF , 0x2CC0 , 0x1000 ,
0x68000 , 0x68FFF , 0x2CE0 , 0x1000 ,
0x69000 , 0x69FFF , 0x2D00 , 0x1000 ,
0x6A000 , 0x6AFFF , 0x2D20 , 0x1000 ,
} ;
2014-08-17 01:42:51 +00:00
#endregion
2014-06-28 21:22:05 +00:00
SHA256 mySHA256 = SHA256Managed . Create ( ) ;
for ( int i = 0 ; i < hashtabledata . Length / 4 ; i + + )
{
uint start = hashtabledata [ 0 + 4 * i ] ;
uint length = hashtabledata [ 1 + 4 * i ] - hashtabledata [ 0 + 4 * i ] ;
uint offset = hashtabledata [ 2 + 4 * i ] ;
uint blocksize = hashtabledata [ 3 + 4 * i ] ;
2014-12-12 05:44:05 +00:00
byte [ ] zeroarray = new byte [ blocksize ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , start , zeroarray , 0 , length + 1 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
2014-12-12 05:44:05 +00:00
byte [ ] actualhash = new byte [ 0x20 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , offset , actualhash , 0 , 0x20 ) ;
if ( ! hashValue . SequenceEqual ( actualhash ) )
{
invalid1 + + ;
2014-12-11 07:00:25 +00:00
RTB_S . Text + = "Invalid: " + hashtabledata [ 2 + 4 * i ] . ToString ( "X5" ) + " @ " + hashtabledata [ 0 + 4 * i ] . ToString ( "X5" ) + "-" + hashtabledata [ 1 + 4 * i ] . ToString ( "X5" ) + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
}
}
2014-12-11 07:00:25 +00:00
RTB_S . Text + = "1st SAV: " + ( 106 - invalid1 ) . ToString ( ) + "/" + 106. ToString ( ) + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
// Check The Second Half of Hashes
for ( int i = 0 ; i < hashtabledata . Length ; i + = 4 )
{
hashtabledata [ i + 0 ] + = 0x7F000 ;
hashtabledata [ i + 1 ] + = 0x7F000 ;
hashtabledata [ i + 2 ] + = 0x7F000 ;
}
// Problem with save2 saves is that 0x3000-0x4FFF doesn't use save2 data. Probably different when hashed, but different when stored.
for ( int i = 2 ; i < 4 ; i + + )
{
hashtabledata [ i * 4 + 0 ] - = 0x7F000 ;
hashtabledata [ i * 4 + 1 ] - = 0x7F000 ;
}
int invalid2 = 0 ;
for ( int i = 0 ; i < hashtabledata . Length / 4 ; i + + )
{
uint start = hashtabledata [ 0 + 4 * i ] ;
uint length = hashtabledata [ 1 + 4 * i ] - hashtabledata [ 0 + 4 * i ] ;
uint offset = hashtabledata [ 2 + 4 * i ] ;
uint blocksize = hashtabledata [ 3 + 4 * i ] ;
2014-12-12 05:44:05 +00:00
byte [ ] zeroarray = new byte [ blocksize ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , start , zeroarray , 0 , length + 1 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
2014-12-12 05:44:05 +00:00
byte [ ] actualhash = new byte [ 0x20 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , offset , actualhash , 0 , 0x20 ) ;
if ( ! hashValue . SequenceEqual ( actualhash ) )
{
invalid2 + + ;
2014-12-11 07:00:25 +00:00
RTB_S . Text + = "Invalid: " + hashtabledata [ 2 + 4 * i ] . ToString ( "X5" ) + " @ " + hashtabledata [ 0 + 4 * i ] . ToString ( "X5" ) + "-" + hashtabledata [ 1 + 4 * i ] . ToString ( "X5" ) + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
}
}
2014-12-11 07:00:25 +00:00
RTB_S . Text + = "2nd SAV: " + ( 106 - invalid2 ) . ToString ( ) + "/" + 106. ToString ( ) + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
if ( invalid1 + invalid2 = = ( 2 * 106 ) )
2014-12-11 07:00:25 +00:00
RTB_S . Text = "None of the IVFC hashes are valid." + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
// Check the Upper Level IVFC Hashes
{
2014-12-12 05:44:05 +00:00
byte [ ] zeroarray = new byte [ 0x200 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , 0x2000 , zeroarray , 0 , 0x20 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
2014-12-12 05:44:05 +00:00
byte [ ] actualhash = new byte [ 0x20 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , 0x43C , actualhash , 0 , 0x20 ) ;
if ( ! hashValue . SequenceEqual ( actualhash ) )
{
2014-12-11 07:00:25 +00:00
RTB_S . Text + = "Invalid: " + 0x2000 . ToString ( "X5" ) + " @ " + 0x43C . ToString ( "X3" ) + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
}
}
{
2014-12-12 05:44:05 +00:00
byte [ ] zeroarray = new byte [ 0x200 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , 0x81000 , zeroarray , 0 , 0x20 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
2014-12-12 05:44:05 +00:00
byte [ ] actualhash = new byte [ 0x20 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , 0x30C , actualhash , 0 , 0x20 ) ;
if ( ! hashValue . SequenceEqual ( actualhash ) )
{
2014-12-11 07:00:25 +00:00
RTB_S . Text + = "Invalid: " + 0x81000 . ToString ( "X5" ) + " @ " + 0x30C . ToString ( "X3" ) + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
}
}
{
2014-12-12 05:44:05 +00:00
byte [ ] difihash1 = new byte [ 0x12C ] ;
byte [ ] difihash2 = new byte [ 0x12C ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , 0x330 , difihash1 , 0 , 0x12C ) ;
Array . Copy ( savefile , 0x200 , difihash2 , 0 , 0x12C ) ;
byte [ ] hashValue1 = mySHA256 . ComputeHash ( difihash1 ) ;
byte [ ] hashValue2 = mySHA256 . ComputeHash ( difihash2 ) ;
2014-12-12 05:44:05 +00:00
byte [ ] actualhash = new byte [ 0x20 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , 0x16C , actualhash , 0 , 0x20 ) ;
if ( hashValue1 . SequenceEqual ( actualhash ) )
{
RTB_S . Text + = "Active DIFI partition is Save 1." ;
}
else if ( hashValue2 . SequenceEqual ( actualhash ) )
{
RTB_S . Text + = "Active DIFI partition is Save 2." ;
}
else
{
RTB_S . Text + = "ERROR: NO ACTIVE DIFI HASH MATCH" ;
}
}
}
private void exportSAV ( object sender , EventArgs e )
{
// Create another version of the save file.
2014-12-12 05:44:05 +00:00
byte [ ] editedsav = new byte [ 0x100000 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , editedsav , savefile . Length ) ;
// Since we only edited one of the save files, we only have to fix half of the chk/hashes!
// Fix Checksums
{
2014-11-21 23:34:10 +00:00
uint [ ] start = { 0x05400 , 0x05800 , 0x06400 , 0x06600 , 0x06800 , 0x06A00 , 0x06C00 , 0x06E00 , 0x07000 , 0x07200 , 0x07400 , 0x09600 , 0x09800 , 0x09E00 , 0x0A400 , 0x0F400 , 0x14400 , 0x19400 , 0x19600 , 0x19E00 , 0x1A400 , 0x1AC00 , 0x1B400 , 0x1B600 , 0x1B800 , 0x1BE00 , 0x1C000 , 0x1C400 , 0x1CC00 , 0x1CE00 , 0x1D000 , 0x1D200 , 0x1D400 , 0x1D600 , 0x1DE00 , 0x1E400 , 0x1E800 , 0x20400 , 0x20600 , 0x20800 , 0x20C00 , 0x21000 , 0x22C00 , 0x23000 , 0x23800 , 0x23C00 , 0x24600 , 0x24A00 , 0x25200 , 0x26000 , 0x26200 , 0x26400 , 0x27200 , 0x27A00 , 0x5C600 , } ;
uint [ ] length = { 0x000002C8 , 0x00000B88 , 0x0000002C , 0x00000038 , 0x00000150 , 0x00000004 , 0x00000008 , 0x000001C0 , 0x000000BE , 0x00000024 , 0x00002100 , 0x00000140 , 0x00000440 , 0x00000574 , 0x00004E28 , 0x00004E28 , 0x00004E28 , 0x00000170 , 0x0000061C , 0x00000504 , 0x000006A0 , 0x00000644 , 0x00000104 , 0x00000004 , 0x00000420 , 0x00000064 , 0x000003F0 , 0x0000070C , 0x00000180 , 0x00000004 , 0x0000000C , 0x00000048 , 0x00000054 , 0x00000644 , 0x000005C8 , 0x000002F8 , 0x00001B40 , 0x000001F4 , 0x000001F0 , 0x00000216 , 0x00000390 , 0x00001A90 , 0x00000308 , 0x00000618 , 0x0000025C , 0x00000834 , 0x00000318 , 0x000007D0 , 0x00000C48 , 0x00000078 , 0x00000200 , 0x00000C84 , 0x00000628 , 0x00034AD0 , 0x0000E058 , } ;
2014-06-28 21:22:05 +00:00
int csoff = 0x6A81A ;
2014-11-21 23:34:10 +00:00
if ( savegame_oras )
{
start = new uint [ ] { 0x05400 , 0x05800 , 0x06400 , 0x06600 , 0x06800 , 0x06A00 , 0x06C00 , 0x06E00 , 0x07000 , 0x07200 , 0x07400 , 0x09600 , 0x09800 , 0x09E00 , 0x0A400 , 0x0F400 , 0x14400 , 0x19400 , 0x19600 , 0x19E00 , 0x1A400 , 0x1B600 , 0x1BE00 , 0x1C000 , 0x1C200 , 0x1C800 , 0x1CA00 , 0x1CE00 , 0x1D600 , 0x1D800 , 0x1DA00 , 0x1DC00 , 0x1DE00 , 0x1E000 , 0x1E800 , 0x1EE00 , 0x1F200 , 0x20E00 , 0x21000 , 0x21400 , 0x21800 , 0x22000 , 0x23C00 , 0x24000 , 0x24800 , 0x24C00 , 0x25600 , 0x25A00 , 0x26200 , 0x27000 , 0x27200 , 0x27400 , 0x28200 , 0x28A00 , 0x28E00 , 0x30A00 , 0x38400 , 0x6D000 , } ;
length = new uint [ ] { 0x000002C8 , 0x00000B90 , 0x0000002C , 0x00000038 , 0x00000150 , 0x00000004 , 0x00000008 , 0x000001C0 , 0x000000BE , 0x00000024 , 0x00002100 , 0x00000130 , 0x00000440 , 0x00000574 , 0x00004E28 , 0x00004E28 , 0x00004E28 , 0x00000170 , 0x0000061C , 0x00000504 , 0x000011CC , 0x00000644 , 0x00000104 , 0x00000004 , 0x00000420 , 0x00000064 , 0x000003F0 , 0x0000070C , 0x00000180 , 0x00000004 , 0x0000000C , 0x00000048 , 0x00000054 , 0x00000644 , 0x000005C8 , 0x000002F8 , 0x00001B40 , 0x000001F4 , 0x000003E0 , 0x00000216 , 0x00000640 , 0x00001A90 , 0x00000400 , 0x00000618 , 0x0000025C , 0x00000834 , 0x00000318 , 0x000007D0 , 0x00000C48 , 0x00000078 , 0x00000200 , 0x00000C84 , 0x00000628 , 0x00000400 , 0x00007AD0 , 0x000078B0 , 0x00034AD0 , 0x0000E058 , } ;
csoff = 0x7B21A ;
}
2014-06-28 21:22:05 +00:00
if ( savindex = = 1 )
{
csoff + = 0x7F000 ;
for ( int i = 0 ; i < start . Length ; i + + )
start [ i ] + = 0x7F000 ;
}
for ( int i = 0 ; i < length . Length ; i + + )
{
2014-12-12 05:44:05 +00:00
byte [ ] data = new byte [ length [ i ] ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( editedsav , start [ i ] , data , 0 , length [ i ] ) ;
2014-10-11 07:22:22 +00:00
ushort checksum = PKX . ccitt16 ( data ) ;
2014-06-28 21:22:05 +00:00
Array . Copy ( BitConverter . GetBytes ( checksum ) , 0 , editedsav , csoff + i * 8 , 2 ) ;
}
2014-11-21 23:34:10 +00:00
if ( cybergadget ) goto export ;
2014-06-28 21:22:05 +00:00
}
// Fix Hashes
{
2014-08-17 01:42:51 +00:00
#region hash table data
2014-06-28 21:22:05 +00:00
uint [ ] hashtabledata = {
0x2020 , 0x203F , 0x2000 , 0x200 ,
0x2040 , 0x2FFF , 0x2020 , 0x1000 ,
0x3000 , 0x3FFF , 0x2040 , 0x1000 ,
0x4000 , 0x4FFF , 0x2060 , 0x1000 ,
0x5000 , 0x5FFF , 0x2080 , 0x1000 ,
0x6000 , 0x6FFF , 0x20A0 , 0x1000 ,
0x7000 , 0x7FFF , 0x20C0 , 0x1000 ,
0x8000 , 0x8FFF , 0x20E0 , 0x1000 ,
0x9000 , 0x9FFF , 0x2100 , 0x1000 ,
0xA000 , 0xAFFF , 0x2120 , 0x1000 ,
0xB000 , 0xBFFF , 0x2140 , 0x1000 ,
0xC000 , 0xCFFF , 0x2160 , 0x1000 ,
0xD000 , 0xDFFF , 0x2180 , 0x1000 ,
0xE000 , 0xEFFF , 0x21A0 , 0x1000 ,
0xF000 , 0xFFFF , 0x21C0 , 0x1000 ,
0x10000 , 0x10FFF , 0x21E0 , 0x1000 ,
0x11000 , 0x11FFF , 0x2200 , 0x1000 ,
0x12000 , 0x12FFF , 0x2220 , 0x1000 ,
0x13000 , 0x13FFF , 0x2240 , 0x1000 ,
0x14000 , 0x14FFF , 0x2260 , 0x1000 ,
0x15000 , 0x15FFF , 0x2280 , 0x1000 ,
0x16000 , 0x16FFF , 0x22A0 , 0x1000 ,
0x17000 , 0x17FFF , 0x22C0 , 0x1000 ,
0x18000 , 0x18FFF , 0x22E0 , 0x1000 ,
0x19000 , 0x19FFF , 0x2300 , 0x1000 ,
0x1A000 , 0x1AFFF , 0x2320 , 0x1000 ,
0x1B000 , 0x1BFFF , 0x2340 , 0x1000 ,
0x1C000 , 0x1CFFF , 0x2360 , 0x1000 ,
0x1D000 , 0x1DFFF , 0x2380 , 0x1000 ,
0x1E000 , 0x1EFFF , 0x23A0 , 0x1000 ,
0x1F000 , 0x1FFFF , 0x23C0 , 0x1000 ,
0x20000 , 0x20FFF , 0x23E0 , 0x1000 ,
0x21000 , 0x21FFF , 0x2400 , 0x1000 ,
0x22000 , 0x22FFF , 0x2420 , 0x1000 ,
0x23000 , 0x23FFF , 0x2440 , 0x1000 ,
0x24000 , 0x24FFF , 0x2460 , 0x1000 ,
0x25000 , 0x25FFF , 0x2480 , 0x1000 ,
0x26000 , 0x26FFF , 0x24A0 , 0x1000 ,
0x27000 , 0x27FFF , 0x24C0 , 0x1000 ,
0x28000 , 0x28FFF , 0x24E0 , 0x1000 ,
0x29000 , 0x29FFF , 0x2500 , 0x1000 ,
0x2A000 , 0x2AFFF , 0x2520 , 0x1000 ,
0x2B000 , 0x2BFFF , 0x2540 , 0x1000 ,
0x2C000 , 0x2CFFF , 0x2560 , 0x1000 ,
0x2D000 , 0x2DFFF , 0x2580 , 0x1000 ,
0x2E000 , 0x2EFFF , 0x25A0 , 0x1000 ,
0x2F000 , 0x2FFFF , 0x25C0 , 0x1000 ,
0x30000 , 0x30FFF , 0x25E0 , 0x1000 ,
0x31000 , 0x31FFF , 0x2600 , 0x1000 ,
0x32000 , 0x32FFF , 0x2620 , 0x1000 ,
0x33000 , 0x33FFF , 0x2640 , 0x1000 ,
0x34000 , 0x34FFF , 0x2660 , 0x1000 ,
0x35000 , 0x35FFF , 0x2680 , 0x1000 ,
0x36000 , 0x36FFF , 0x26A0 , 0x1000 ,
0x37000 , 0x37FFF , 0x26C0 , 0x1000 ,
0x38000 , 0x38FFF , 0x26E0 , 0x1000 ,
0x39000 , 0x39FFF , 0x2700 , 0x1000 ,
0x3A000 , 0x3AFFF , 0x2720 , 0x1000 ,
0x3B000 , 0x3BFFF , 0x2740 , 0x1000 ,
0x3C000 , 0x3CFFF , 0x2760 , 0x1000 ,
0x3D000 , 0x3DFFF , 0x2780 , 0x1000 ,
0x3E000 , 0x3EFFF , 0x27A0 , 0x1000 ,
0x3F000 , 0x3FFFF , 0x27C0 , 0x1000 ,
0x40000 , 0x40FFF , 0x27E0 , 0x1000 ,
0x41000 , 0x41FFF , 0x2800 , 0x1000 ,
0x42000 , 0x42FFF , 0x2820 , 0x1000 ,
0x43000 , 0x43FFF , 0x2840 , 0x1000 ,
0x44000 , 0x44FFF , 0x2860 , 0x1000 ,
0x45000 , 0x45FFF , 0x2880 , 0x1000 ,
0x46000 , 0x46FFF , 0x28A0 , 0x1000 ,
0x47000 , 0x47FFF , 0x28C0 , 0x1000 ,
0x48000 , 0x48FFF , 0x28E0 , 0x1000 ,
0x49000 , 0x49FFF , 0x2900 , 0x1000 ,
0x4A000 , 0x4AFFF , 0x2920 , 0x1000 ,
0x4B000 , 0x4BFFF , 0x2940 , 0x1000 ,
0x4C000 , 0x4CFFF , 0x2960 , 0x1000 ,
0x4D000 , 0x4DFFF , 0x2980 , 0x1000 ,
0x4E000 , 0x4EFFF , 0x29A0 , 0x1000 ,
0x4F000 , 0x4FFFF , 0x29C0 , 0x1000 ,
0x50000 , 0x50FFF , 0x29E0 , 0x1000 ,
0x51000 , 0x51FFF , 0x2A00 , 0x1000 ,
0x52000 , 0x52FFF , 0x2A20 , 0x1000 ,
0x53000 , 0x53FFF , 0x2A40 , 0x1000 ,
0x54000 , 0x54FFF , 0x2A60 , 0x1000 ,
0x55000 , 0x55FFF , 0x2A80 , 0x1000 ,
0x56000 , 0x56FFF , 0x2AA0 , 0x1000 ,
0x57000 , 0x57FFF , 0x2AC0 , 0x1000 ,
0x58000 , 0x58FFF , 0x2AE0 , 0x1000 ,
0x59000 , 0x59FFF , 0x2B00 , 0x1000 ,
0x5A000 , 0x5AFFF , 0x2B20 , 0x1000 ,
0x5B000 , 0x5BFFF , 0x2B40 , 0x1000 ,
0x5C000 , 0x5CFFF , 0x2B60 , 0x1000 ,
0x5D000 , 0x5DFFF , 0x2B80 , 0x1000 ,
0x5E000 , 0x5EFFF , 0x2BA0 , 0x1000 ,
0x5F000 , 0x5FFFF , 0x2BC0 , 0x1000 ,
0x60000 , 0x60FFF , 0x2BE0 , 0x1000 ,
0x61000 , 0x61FFF , 0x2C00 , 0x1000 ,
0x62000 , 0x62FFF , 0x2C20 , 0x1000 ,
0x63000 , 0x63FFF , 0x2C40 , 0x1000 ,
0x64000 , 0x64FFF , 0x2C60 , 0x1000 ,
0x65000 , 0x65FFF , 0x2C80 , 0x1000 ,
0x66000 , 0x66FFF , 0x2CA0 , 0x1000 ,
0x67000 , 0x67FFF , 0x2CC0 , 0x1000 ,
0x68000 , 0x68FFF , 0x2CE0 , 0x1000 ,
0x69000 , 0x69FFF , 0x2D00 , 0x1000 ,
0x6A000 , 0x6AFFF , 0x2D20 , 0x1000 ,
} ;
2014-08-17 01:42:51 +00:00
#endregion
2014-06-28 21:22:05 +00:00
if ( savindex = = 1 )
{
for ( int i = 0 ; i < hashtabledata . Length / 4 ; i + + )
{
hashtabledata [ i * 4 + 0 ] + = 0x7F000 ;
hashtabledata [ i * 4 + 1 ] + = 0x7F000 ;
hashtabledata [ i * 4 + 2 ] + = 0x7F000 ;
}
// Problem with save2 saves is that 0x3000-0x4FFF doesn't use save2 data. Probably different when hashed, but different when stored.
for ( int i = 2 ; i < 4 ; i + + )
{
hashtabledata [ i * 4 + 0 ] - = 0x7F000 ;
hashtabledata [ i * 4 + 1 ] - = 0x7F000 ;
}
}
SHA256 mySHA256 = SHA256Managed . Create ( ) ;
// Hash for 0x3000 onwards
for ( int i = 2 ; i < hashtabledata . Length / 4 ; i + + )
{
uint start = hashtabledata [ 0 + 4 * i ] ;
uint length = hashtabledata [ 1 + 4 * i ] - hashtabledata [ 0 + 4 * i ] ;
uint offset = hashtabledata [ 2 + 4 * i ] ;
uint blocksize = hashtabledata [ 3 + 4 * i ] ;
2014-12-12 05:44:05 +00:00
byte [ ] zeroarray = new byte [ blocksize ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( editedsav , start , zeroarray , 0 , length + 1 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
Array . Copy ( hashValue , 0 , editedsav , offset , 0x20 ) ;
}
// Fix 2nd Hash
{
uint start = hashtabledata [ 0 + 4 * 1 ] ;
uint length = hashtabledata [ 1 + 4 * 1 ] - hashtabledata [ 0 + 4 * 1 ] ;
uint offset = hashtabledata [ 2 + 4 * 1 ] ;
uint blocksize = hashtabledata [ 3 + 4 * 1 ] ;
2014-12-12 05:44:05 +00:00
byte [ ] zeroarray = new byte [ blocksize ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( editedsav , start , zeroarray , 0 , length + 1 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
Array . Copy ( hashValue , 0 , editedsav , offset , 0x20 ) ;
}
// Fix 1st Hash
{
uint start = hashtabledata [ 0 + 4 * 0 ] ;
uint length = hashtabledata [ 1 + 4 * 0 ] - hashtabledata [ 0 + 4 * 0 ] ;
uint offset = hashtabledata [ 2 + 4 * 0 ] ;
uint blocksize = hashtabledata [ 3 + 4 * 0 ] ;
2014-12-12 05:44:05 +00:00
byte [ ] zeroarray = new byte [ blocksize ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( editedsav , start , zeroarray , 0 , length + 1 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
Array . Copy ( hashValue , 0 , editedsav , offset , 0x20 ) ;
}
// Fix IVFC Hash
{
2014-12-12 05:44:05 +00:00
byte [ ] zeroarray = new byte [ 0x200 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( editedsav , 0x2000 + savindex * 0x7F000 , zeroarray , 0 , 0x20 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
Array . Copy ( hashValue , 0 , editedsav , 0x43C - savindex * 0x130 , 0x20 ) ;
}
// Fix DISA Hash
{
2014-12-12 05:44:05 +00:00
byte [ ] difihash = new byte [ 0x12C ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( editedsav , 0x330 - savindex * 0x130 , difihash , 0 , 0x12C ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( difihash ) ;
Array . Copy ( hashValue , 0 , editedsav , 0x16C , 0x20 ) ;
}
}
// Write the active save index
2014-11-21 23:34:10 +00:00
editedsav [ 0x168 ] = ( byte ) ( savindex ^ 1 ) ;
export :
// File Integrity has been restored as well as it can. Export!
2014-07-26 21:56:06 +00:00
// If CyberGadget
2014-11-21 23:34:10 +00:00
if ( cybergadget )
2014-07-26 21:56:06 +00:00
{
2014-12-12 05:44:05 +00:00
byte [ ] cybersav = new byte [ 0x65600 ] ;
if ( savegame_oras ) cybersav = new byte [ 0x76000 ] ;
2014-11-21 23:34:10 +00:00
Array . Copy ( editedsav , 0x5400 , cybersav , 0 , cybersav . Length ) ;
2014-08-31 20:32:04 +00:00
// Chunk Error Checking
2014-12-12 05:44:05 +00:00
byte [ ] FFFF = new byte [ 0x200 ] ;
byte [ ] section = new byte [ 0x200 ] ;
2014-08-31 20:32:04 +00:00
for ( int i = 0 ; i < 0x200 ; i + + )
FFFF [ i ] = 0xFF ;
for ( int i = 0 ; i < cybersav . Length / 0x200 ; i + + )
{
Array . Copy ( cybersav , i * 0x200 , section , 0 , 0x200 ) ;
if ( section . SequenceEqual ( FFFF ) )
{
string problem = String . Format ( "0x200 chunk @ 0x{0} is FF'd." , ( i * 0x200 ) . ToString ( "X5" ) )
2014-12-11 07:00:25 +00:00
+ Environment . NewLine + "Cyber will screw up (as of August 31st)." + Environment . NewLine + Environment . NewLine ;
2014-08-31 20:32:04 +00:00
// Check to see if it is in the Pokedex
if ( i * 0x200 > 0x14E00 & & i * 0x200 < 0x15700 )
{
2014-12-11 06:50:40 +00:00
problem + = "Problem lies in the Pokedex. " ;
2014-08-31 20:32:04 +00:00
if ( i * 0x200 = = 0x15400 )
2014-12-11 06:50:40 +00:00
problem + = "Remove a language flag for a species ~ ex " + specieslist [ 548 ] ;
2014-08-31 20:32:04 +00:00
}
2014-12-11 06:50:40 +00:00
if ( Util . Prompt ( MessageBoxButtons . YesNo , problem , "Continue saving?" ) ! = DialogResult . Yes )
2014-08-31 20:32:04 +00:00
return ;
}
2014-12-07 01:13:06 +00:00
}
2014-07-26 21:56:06 +00:00
SaveFileDialog cySAV = new SaveFileDialog ( ) ;
2014-08-01 07:55:28 +00:00
// Try for file path
string cyberpath = Util . GetTempFolder ( ) ;
2014-11-28 03:26:42 +00:00
if ( SDFLoc ! = null )
{
if ( Directory . Exists ( SDFLoc ) )
{
cySAV . InitialDirectory = SDFLoc ;
cySAV . RestoreDirectory = true ;
}
}
2014-11-28 23:46:09 +00:00
else if ( Directory . Exists ( Path . Combine ( cyberpath , "root" ) ) )
2014-08-02 00:24:22 +00:00
{
2014-11-28 23:46:09 +00:00
cySAV . InitialDirectory = Path . Combine ( cyberpath , "root" ) ;
2014-08-02 00:24:22 +00:00
cySAV . RestoreDirectory = true ;
}
2014-08-01 07:55:28 +00:00
else if ( Directory . Exists ( cyberpath ) )
2014-08-02 00:24:22 +00:00
{
2014-08-01 07:55:28 +00:00
cySAV . InitialDirectory = cyberpath ;
2014-08-02 00:24:22 +00:00
cySAV . RestoreDirectory = true ;
}
2014-08-01 07:55:28 +00:00
2014-07-26 21:56:06 +00:00
cySAV . Filter = "Cyber SAV|*.*" ;
cySAV . FileName = Regex . Split ( L_Save . Text , ": " ) [ 1 ] ;
DialogResult sdr = cySAV . ShowDialog ( ) ;
if ( sdr = = DialogResult . OK )
{
string path = cySAV . FileName ;
File . WriteAllBytes ( path , cybersav ) ;
2014-12-11 06:50:40 +00:00
Util . Alert ( "Saved Cyber SAV to:" , path ) ;
2014-07-26 21:56:06 +00:00
}
}
2014-08-01 19:37:30 +00:00
else
2014-06-28 21:22:05 +00:00
{
2014-08-01 19:37:30 +00:00
// Save Full Save File
SaveFileDialog savesav = new SaveFileDialog ( ) ;
savesav . Filter = "SAV|*.bin;*.sav" ;
savesav . FileName = Regex . Split ( L_Save . Text , ": " ) [ 1 ] ;
DialogResult result = savesav . ShowDialog ( ) ;
if ( result = = DialogResult . OK )
2014-06-28 21:22:05 +00:00
{
2014-08-01 19:37:30 +00:00
string path = savesav . FileName ;
2014-06-28 21:22:05 +00:00
2014-08-01 19:37:30 +00:00
if ( File . Exists ( path ) )
{
// File already exists, save a .bak
byte [ ] backupfile = File . ReadAllBytes ( path ) ;
File . WriteAllBytes ( path + ".bak" , backupfile ) ;
}
File . WriteAllBytes ( path , editedsav ) ;
2014-12-11 06:50:40 +00:00
Util . Alert ( "Saved 1MB SAV to:" , path ) ;
2014-08-01 19:37:30 +00:00
}
2014-06-28 21:22:05 +00:00
}
}
// Box/SAV Functions //
private void B_BoxRight_Click ( object sender , EventArgs e )
{
if ( C_BoxSelect . SelectedIndex < 30 )
C_BoxSelect . SelectedIndex + + ;
2014-07-31 22:06:48 +00:00
else C_BoxSelect . SelectedIndex = 0 ;
2014-06-28 21:22:05 +00:00
}
private void B_BoxLeft_Click ( object sender , EventArgs e )
{
if ( C_BoxSelect . SelectedIndex > 0 )
C_BoxSelect . SelectedIndex - - ;
2014-07-31 22:06:48 +00:00
else C_BoxSelect . SelectedIndex = 30 ;
2014-06-28 21:22:05 +00:00
}
private void rcmView_Click ( object sender , EventArgs e )
{
int slot = getSlot ( sender ) ;
int offset = getPKXOffset ( slot ) ;
PictureBox [ ] pba = {
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 ,
} ;
PictureBox picturebox = pba [ slot ] ;
if ( picturebox . Image = = null )
2014-11-28 10:14:15 +00:00
{ System . Media . SystemSounds . Exclamation . Play ( ) ; return ; }
2014-06-28 21:22:05 +00:00
// Load the PKX file
if ( BitConverter . ToUInt64 ( savefile , offset + 8 ) ! = 0 )
{
2014-12-12 05:44:05 +00:00
byte [ ] ekxdata = new byte [ 0xE8 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , offset , ekxdata , 0 , 0xE8 ) ;
2014-10-10 02:59:57 +00:00
byte [ ] pkxdata = PKX . decryptArray ( ekxdata ) ;
2014-06-28 21:22:05 +00:00
int species = BitConverter . ToInt16 ( pkxdata , 0x08 ) ; // Get Species
if ( species = = 0 )
{
2014-07-31 22:06:48 +00:00
System . Media . SystemSounds . Exclamation . Play ( ) ;
2014-06-28 21:22:05 +00:00
return ;
}
2014-07-31 22:06:48 +00:00
try
2014-06-28 21:22:05 +00:00
{
Array . Copy ( pkxdata , buff , 0xE8 ) ;
2014-10-10 02:59:57 +00:00
populateFields ( buff ) ;
2014-06-28 21:22:05 +00:00
}
catch // If it fails, try XORing encrypted zeroes
{
try
{
2014-12-12 05:44:05 +00:00
byte [ ] blank = PKX . encryptArray ( new byte [ 0xE8 ] ) ;
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < 0xE8 ; i + + )
blank [ i ] = ( byte ) ( buff [ i ] ^ blank [ i ] ) ;
2014-08-17 01:42:51 +00:00
2014-10-10 02:59:57 +00:00
populateFields ( blank ) ;
2014-06-28 21:22:05 +00:00
}
catch // Still fails, just let the original errors occur.
2014-11-28 10:14:15 +00:00
{ populateFields ( buff ) ; }
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
System . Media . SystemSounds . Exclamation . Play ( ) ;
2014-06-28 21:22:05 +00:00
}
private void rcmSet_Click ( object sender , EventArgs e )
{
if ( ! verifiedpkx ( ) ) { return ; }
int slot = getSlot ( sender ) ;
2014-12-11 06:50:40 +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
int offset = getPKXOffset ( slot ) ;
byte [ ] pkxdata = preparepkx ( buff ) ;
byte [ ] ekxdata = PKX . encryptArray ( pkxdata ) ;
2014-07-26 21:56:06 +00:00
2014-11-22 07:23:48 +00:00
if ( ! savegame_oras )
{
// User Protection
int move1 = BitConverter . ToInt16 ( pkxdata , 0x5A ) ;
int move2 = BitConverter . ToInt16 ( pkxdata , 0x5C ) ;
int move3 = BitConverter . ToInt16 ( pkxdata , 0x5E ) ;
int move4 = BitConverter . ToInt16 ( pkxdata , 0x60 ) ;
int ability = pkxdata [ 0x14 ] ;
int item = BitConverter . ToInt16 ( pkxdata , 0x0A ) ;
2014-12-11 06:50:40 +00:00
string err = "" ;
2014-11-22 07:23:48 +00:00
if ( move1 > 617 | | move2 > 617 | | move3 > 617 | | move4 > 617 )
2014-12-11 06:50:40 +00:00
err = "Move does not exist in X/Y." ;
2014-11-22 07:23:48 +00:00
else if ( ability > 188 )
2014-12-11 06:50:40 +00:00
err = "Ability does not exist in X/Y." ;
2014-11-22 07:23:48 +00:00
else if ( item > 717 )
2014-12-11 06:50:40 +00:00
err = "Item does not exist in X/Y." ;
2014-11-22 07:23:48 +00:00
else goto next ;
2014-12-11 06:50:40 +00:00
if ( Util . Prompt ( MessageBoxButtons . YesNo , err , "Continue?" ) ! = DialogResult . Yes )
2014-11-22 07:23:48 +00:00
return ;
}
next :
2014-07-26 21:56:06 +00:00
if ( slot > = 30 & & slot < 36 ) // Party
Array . Copy ( ekxdata , 0 , savefile , offset , 0x104 ) ;
2014-10-11 07:22:22 +00:00
else if ( slot < 30 | | ( slot > = 36 & & slot < 42 & & DEV_Ability . Enabled ) )
2014-07-26 21:56:06 +00:00
Array . Copy ( ekxdata , 0 , savefile , offset , 0xE8 ) ;
2014-10-11 07:22:22 +00:00
else return ;
setParty ( ) ;
setPokedex ( pkxdata ) ;
2014-10-10 02:59:57 +00:00
setPKXBoxes ( ) ;
2014-06-28 21:22:05 +00:00
savedited = true ;
2014-08-01 23:53:09 +00:00
getSlotColor ( slot , Properties . Resources . slotSet ) ;
2014-06-28 21:22:05 +00:00
}
2014-10-11 07:22:22 +00:00
private void rcmDelete_Click ( object sender , EventArgs e )
{
byte partycount = setParty ( ) ;
int slot = getSlot ( sender ) ;
2014-12-11 06:50:40 +00:00
if ( slot = = 30 & & partycount = = 1 & & ! DEV_Ability . Enabled ) { Util . Alert ( "Can't delete first slot." ) ; return ; }
2014-10-11 07:22:22 +00:00
int offset = getPKXOffset ( slot ) ;
2014-12-12 05:44:05 +00:00
byte [ ] pkxdata = new byte [ 0x104 ] ;
2014-10-11 07:22:22 +00:00
byte [ ] ekxdata = PKX . encryptArray ( pkxdata ) ;
if ( slot > = 30 & & slot < 36 ) // Party
Array . Copy ( ekxdata , 0 , savefile , offset , 0x104 ) ;
else if ( slot < 30 | | ( slot > = 36 & & slot < 42 & & DEV_Ability . Enabled ) )
Array . Copy ( ekxdata , 0 , savefile , offset , 0xE8 ) ;
else return ;
setParty ( ) ;
setPKXBoxes ( ) ;
savedited = true ;
getSlotColor ( slot , Properties . Resources . slotDel ) ;
}
2014-11-29 19:07:01 +00:00
private void cloneBox ( object sender , EventArgs e )
{
2014-12-06 02:14:04 +00:00
if ( ! verifiedpkx ( ) ) { return ; } // don't copy garbage to the box
if ( getSlot ( sender ) > 30 ) return ; // only perform action if cloning to boxes
2014-11-29 19:07:01 +00:00
2014-12-06 02:14:04 +00:00
int box = C_BoxSelect . SelectedIndex + 1 ; // get box we're cloning to
2014-11-30 01:47:17 +00:00
{
2014-12-11 06:50:40 +00:00
DialogResult sdr = Util . Prompt ( MessageBoxButtons . YesNo , String . Format ( "Clone Pokemon from Editing Tabs to all slots in Box {0}?" , box ) ) ;
2014-12-06 02:14:04 +00:00
if ( sdr ! = DialogResult . Yes ) // give the option to abort
2014-11-30 01:47:17 +00:00
return ;
}
2014-11-29 19:07:01 +00:00
byte [ ] pkxdata = preparepkx ( buff ) ;
byte [ ] ekxdata = PKX . encryptArray ( pkxdata ) ;
2014-12-06 02:14:04 +00:00
for ( int i = 0 ; i < 30 ; i + + ) // write encrypted array to all box slots
2014-11-29 19:07:01 +00:00
Array . Copy ( ekxdata , 0 , savefile , getPKXOffset ( i ) , 0xE8 ) ;
2014-12-06 02:14:04 +00:00
setPokedex ( pkxdata ) ; // set pokedex data if necessary
setPKXBoxes ( ) ; // refresh box view
2014-11-29 19:07:01 +00:00
savedited = true ;
}
2014-08-16 04:40:58 +00:00
private void setPokedex ( byte [ ] pkxdata )
2014-08-10 03:56:26 +00:00
{
if ( savindex > 1 ) return ;
int species = BitConverter . ToUInt16 ( pkxdata , 0x8 ) ; // Species
int lang = pkxdata [ 0xE3 ] - 1 ; if ( lang > 5 ) lang - - ; // 0-6 language vals
int origin = pkxdata [ 0xDF ] ; // Native / Non Native
int gender = ( pkxdata [ 0x1D ] & 2 ) > > 1 ; // Gender
uint pid = BitConverter . ToUInt32 ( pkxdata , 0x18 ) ;
ushort TID = BitConverter . ToUInt16 ( pkxdata , 0xC ) ;
ushort SID = BitConverter . ToUInt16 ( pkxdata , 0xE ) ;
2014-11-28 10:14:15 +00:00
int shiny = Convert . ToInt16 ( Convert . ToBoolean ( ( PKX . getPSV ( pid ) ^ PKX . getTSV ( TID , SID ) ) < 16 ) ) ;
2014-11-30 01:47:17 +00:00
int dexoff = savindex * 0x7F000 + SaveGame . PokeDex ; // Same offset for XY-ORAS
int langoff = 0x3C8 ; if ( savegame_oras ) langoff = 0x400 ; // Not the same offset for language bools
2014-11-30 05:28:48 +00:00
int shiftoff = ( shiny * 0x60 * 2 ) + ( gender * 0x60 ) + 0x60 ;
2014-08-10 03:56:26 +00:00
2014-11-30 01:47:17 +00:00
// Set the [Species/Gender/Shiny] Owned Flag
2014-11-30 05:28:48 +00:00
savefile [ dexoff + shiftoff + ( species - 1 ) / 8 + 0x8 ] | = ( byte ) ( 1 < < ( ( species - 1 ) % 8 ) ) ;
2014-08-10 03:56:26 +00:00
2014-11-30 01:47:17 +00:00
// Owned quality flag
if ( origin < 0x18 & & species < 650 & & ! savegame_oras ) // Pre 650 for X/Y, and not for ORAS; Set the Foreign Owned Flag
2014-08-10 03:56:26 +00:00
savefile [ 0x1AA4C + 0x7F000 * savindex + ( species - 1 ) / 8 ] | = ( byte ) ( 1 < < ( ( species - 1 ) % 8 ) ) ;
2014-11-30 01:47:17 +00:00
else if ( origin > = 0x18 | | savegame_oras ) // Set Native Owned Flag (should always happen)
savefile [ dexoff + ( species - 1 ) / 8 + 0x8 ] | = ( byte ) ( 1 < < ( ( species - 1 ) % 8 ) ) ;
2014-08-10 10:50:20 +00:00
// Set the Language
2014-08-31 20:32:04 +00:00
if ( lang < 0 ) lang = 1 ;
2014-11-30 01:47:17 +00:00
savefile [ dexoff + langoff + ( ( species - 1 ) * 7 + lang ) / 8 ] | = ( byte ) ( 1 < < ( ( ( ( species - 1 ) * 7 ) + lang ) % 8 ) ) ;
2014-08-10 03:56:26 +00:00
}
2014-10-11 07:22:22 +00:00
private byte setParty ( )
2014-07-26 21:56:06 +00:00
{
2014-12-06 02:14:04 +00:00
byte partymembers = 0 ; // start off with a ctr of 0
2014-07-26 21:56:06 +00:00
int offset = SaveGame . Party + 0x7F000 * savindex ;
for ( int i = 0 ; i < 6 ; i + + )
{
// Gather all the species
2014-12-12 05:44:05 +00:00
byte [ ] data = new byte [ 0x104 ] ;
2014-07-26 21:56:06 +00:00
Array . Copy ( savefile , offset + i * 0x104 , data , 0 , 0x104 ) ;
2014-10-10 02:59:57 +00:00
byte [ ] decdata = PKX . decryptArray ( data ) ;
2014-07-26 21:56:06 +00:00
int species = BitConverter . ToInt16 ( decdata , 8 ) ;
if ( ( species ! = 0 ) & & ( species < 722 ) )
{
2014-10-11 07:22:22 +00:00
Array . Copy ( data , 0 , savefile , offset + ( partymembers ) * 0x104 , 0x104 ) ;
2014-07-26 21:56:06 +00:00
partymembers + + ; // Copy in our party member
}
}
2014-12-06 02:14:04 +00:00
2014-07-26 21:56:06 +00:00
// Write in the current party count
2014-10-11 07:22:22 +00:00
savefile [ offset + 6 * 0x104 + savindex * 0x7F000 ] = partymembers ;
2014-07-26 21:56:06 +00:00
// Zero out the party slots that are empty.
for ( int i = 0 ; i < 6 ; i + + )
if ( i > = partymembers )
2014-12-12 05:44:05 +00:00
Array . Copy ( PKX . encryptArray ( new byte [ 0x104 ] ) , 0 , savefile , offset + ( i * 0x104 ) , 0x104 ) ;
2014-10-11 07:22:22 +00:00
// Repeat for Battle Box.
byte battlemem = 0 ;
int offset2 = SaveGame . BattleBox + 0x7F000 * savindex ;
for ( int i = 0 ; i < 6 ; i + + )
2014-07-26 21:56:06 +00:00
{
2014-10-11 07:22:22 +00:00
// Gather all the species
2014-12-12 05:44:05 +00:00
byte [ ] data = new byte [ 0x104 ] ;
2014-10-11 07:22:22 +00:00
Array . Copy ( savefile , offset2 + i * 0xE8 , data , 0 , 0xE8 ) ;
byte [ ] decdata = PKX . decryptArray ( data ) ;
int species = BitConverter . ToInt16 ( decdata , 8 ) ;
if ( ( species ! = 0 ) & & ( species < 722 ) )
{
Array . Copy ( data , 0 , savefile , offset2 + ( battlemem ) * 0xE8 , 0xE8 ) ;
battlemem + + ; // Copy in our party member
}
2014-07-26 21:56:06 +00:00
}
2014-10-11 07:22:22 +00:00
// Zero out the party slots that are empty.
for ( int i = 0 ; i < 6 ; i + + )
if ( i > = battlemem )
2014-12-12 05:44:05 +00:00
Array . Copy ( PKX . encryptArray ( new byte [ 0x104 ] ) , 0 , savefile , offset2 + ( i * 0xE8 ) , 0xE8 ) ;
2014-11-28 10:14:15 +00:00
2014-10-11 07:22:22 +00:00
if ( battlemem = = 0 )
savefile [ offset2 + 6 * 0xE8 + savindex * 0x7F000 ] = 0 ;
2014-06-28 21:22:05 +00:00
2014-10-11 07:22:22 +00:00
return partymembers ;
2014-06-28 21:22:05 +00:00
}
private void slotModifier_Click ( object sender , EventArgs e )
{
2014-11-29 19:07:01 +00:00
if ( ModifierKeys = = ( Keys . Control | Keys . Alt ) )
cloneBox ( sender , e ) ;
else if ( ModifierKeys = = Keys . Control )
2014-10-11 07:22:22 +00:00
rcmView_Click ( sender , e ) ;
else if ( ModifierKeys = = Keys . Shift )
rcmSet_Click ( sender , e ) ;
else if ( ModifierKeys = = Keys . Alt )
rcmDelete_Click ( sender , e ) ;
2014-06-28 21:22:05 +00:00
}
// Subfunctions //
private int getPKXOffset ( int slot )
{
int offset = SaveGame . Box + C_BoxSelect . SelectedIndex * ( 0xE8 * 30 ) + slot * 0xE8 ;
if ( slot > 29 ) // Not a party
{
if ( slot < 36 ) // Party Slot
offset = SaveGame . Party + ( slot - 30 ) * 0x104 ;
else if ( slot < 42 ) // Battle Box Slot
offset = SaveGame . BattleBox + ( slot - 36 ) * 0xE8 ;
else if ( slot < 44 ) // Daycare
offset = SaveGame . Daycare + 8 + ( slot - 42 ) * 0xF0 ;
else if ( slot < 45 ) // GTS
offset = SaveGame . GTS ;
else if ( slot < 46 ) // Fused
offset = SaveGame . Fused ;
else // SUBE
offset = SaveGame . SUBE + ( slot - 46 ) * 0xEC ;
}
offset + = 0x7F000 * savindex ;
return offset ;
}
private int getSlot ( object sender )
{
2014-10-11 07:22:22 +00:00
Control sourceControl = null ;
2014-06-28 21:22:05 +00:00
// Try to cast the sender to a ToolStripItem
2014-11-22 07:23:48 +00:00
try { ToolStripItem menuItem = sender as ToolStripItem ; ContextMenuStrip owner = menuItem . Owner as ContextMenuStrip ; sourceControl = owner . SourceControl ; }
catch
{ // try to cast as picturebox
try { PictureBox pbItem = sender as PictureBox ; sourceControl = pbItem as Control ; }
catch
2014-12-11 06:50:40 +00:00
{ Util . Error ( "Invalid slot!" , "getSlot could not cast the control element." ) ; return 0 ; }
2014-10-11 07:22:22 +00:00
}
2014-06-28 21:22:05 +00:00
2014-10-11 07:22:22 +00:00
string [ ] pba = {
"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" ,
2014-06-28 21:22:05 +00:00
2014-10-11 07:22:22 +00:00
"ppkx1" , "ppkx2" , "ppkx3" , "ppkx4" , "ppkx5" , "ppkx6" ,
"bbpkx1" , "bbpkx2" , "bbpkx3" , "bbpkx4" , "bbpkx5" , "bbpkx6" ,
2014-06-28 21:22:05 +00:00
2014-10-11 07:22:22 +00:00
"dcpkx1" , "dcpkx2" , "gtspkx" , "fusedpkx" , "subepkx1" , "subepkx2" , "subepkx3" ,
} ;
int slot = Array . IndexOf ( pba , sourceControl . Name ) ;
return slot ;
2014-06-28 21:22:05 +00:00
}
2014-10-10 02:59:57 +00:00
public void setPKXBoxes ( )
2014-06-28 21:22:05 +00:00
{
2014-11-21 23:34:10 +00:00
int boxoffset = SaveGame . Box + 0x7F000 * savindex + C_BoxSelect . SelectedIndex * ( 0xE8 * 30 ) ;
2014-06-28 21:22:05 +00:00
2014-08-01 23:53:09 +00:00
int boxbgofst = ( 0x7F000 * savindex ) + 0x9C1E + C_BoxSelect . SelectedIndex ;
int boxbgval = 1 + savefile [ boxbgofst ] ;
2014-11-22 03:26:16 +00:00
string imagename = "box_wp" + boxbgval . ToString ( "00" ) ; if ( savegame_oras & & boxbgval > 16 ) imagename + = "o" ;
PAN_Box . BackgroundImage = ( Image ) Properties . Resources . ResourceManager . GetObject ( imagename ) ;
2014-08-01 23:53:09 +00:00
2014-06-28 21:22:05 +00:00
PictureBox [ ] pba = {
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 ,
} ;
for ( int i = 0 ; i < 30 ; i + + )
{
int offset = boxoffset + 0xE8 * i ;
getSlotFiller ( offset , pba [ i ] ) ;
}
// Reload Party
for ( int i = 0 ; i < 6 ; i + + )
{
2014-11-22 03:26:16 +00:00
int offset = SaveGame . Party + ( 0x7F000 * savindex ) + 0x104 * i ;
2014-06-28 21:22:05 +00:00
getSlotFiller ( offset , pba [ i + 30 ] ) ;
}
2014-12-06 02:14:04 +00:00
2014-06-28 21:22:05 +00:00
// Reload Battle Box
for ( int i = 0 ; i < 6 ; i + + )
{
2014-11-22 03:26:16 +00:00
int offset = SaveGame . BattleBox + ( 0x7F000 * savindex ) + 0xE8 * i ;
2014-06-28 21:22:05 +00:00
getSlotFiller ( offset , pba [ i + 36 ] ) ;
}
2014-12-06 02:14:04 +00:00
2014-06-28 21:22:05 +00:00
// Reload Daycare
2014-12-06 02:14:04 +00:00
Label [ ] dclabela = { L_DC1 , L_DC2 , } ;
TextBox [ ] dctexta = { TB_Daycare1XP , TB_Daycare2XP } ;
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < 2 ; i + + )
{
2014-11-22 03:26:16 +00:00
int offset = SaveGame . Daycare + ( 0x7F000 * savindex ) + 0xE8 * i + 8 * ( i + 1 ) ;
2014-06-28 21:22:05 +00:00
getSlotFiller ( offset , pba [ i + 42 ] ) ;
2014-11-22 03:26:16 +00:00
dctexta [ i ] . Text = BitConverter . ToUInt32 ( savefile , SaveGame . Daycare + ( 0x7F000 * savindex ) + 0xF0 * i + 4 ) . ToString ( ) ;
if ( Convert . ToBoolean ( savefile [ SaveGame . Daycare + ( 0x7F000 * savindex ) + 0xF0 * i ] ) ) // If Occupied
2014-06-28 21:22:05 +00:00
{
2014-10-11 07:22:22 +00:00
pba [ i + 42 ] . Image = Util . ChangeOpacity ( pba [ i + 42 ] . Image , 1 ) ;
2014-06-28 21:22:05 +00:00
dclabela [ i ] . Text = ( i + 1 ) + ": Occupied" ;
}
else
{
2014-10-11 07:22:22 +00:00
pba [ i + 42 ] . Image = Util . ChangeOpacity ( pba [ i + 42 ] . Image , 0.6 ) ;
2014-06-28 21:22:05 +00:00
dclabela [ i ] . Text = ( i + 1 ) + ": Not Occupied" ;
}
}
2014-11-22 03:26:16 +00:00
DayCare_HasEgg . Checked = Convert . ToBoolean ( savefile [ SaveGame . Daycare + ( 0x7F000 * savindex ) + 0x1E0 ] ) ;
TB_RNGSeed . Text = BitConverter . ToUInt64 ( savefile , SaveGame . Daycare + ( 0x7F000 * savindex ) + 0x1E8 ) . ToString ( "X16" ) ;
2014-06-28 21:22:05 +00:00
// GTS
2014-11-22 03:26:16 +00:00
getSlotFiller ( SaveGame . GTS + ( 0x7F000 * savindex ) , pba [ 44 ] ) ;
2014-06-28 21:22:05 +00:00
// Fused
2014-11-22 03:26:16 +00:00
getSlotFiller ( SaveGame . Fused + ( 0x7F000 * savindex ) , pba [ 45 ] ) ;
2014-06-28 21:22:05 +00:00
// SUBE
for ( int i = 0 ; i < 3 ; i + + )
{
int offset = 0x22C90 + i * 0xEC + ( 0x7F000 * savindex ) ;
if ( BitConverter . ToUInt64 ( savefile , offset ) ! = 0 )
getSlotFiller ( offset , pba [ 46 + i ] ) ;
else pba [ 46 + i ] . Image = null ;
}
// Recoloring of a storage box slot (to not show for other storage boxes)
if ( colorizedslot < 32 )
{
if ( colorizedbox = = C_BoxSelect . SelectedIndex )
2014-08-01 23:53:09 +00:00
pba [ colorizedslot ] . BackgroundImage = colorizedcolor ;
2014-06-28 21:22:05 +00:00
else
2014-08-17 01:42:51 +00:00
pba [ colorizedslot ] . BackgroundImage = null ;
2014-06-28 21:22:05 +00:00
}
}
2014-10-10 02:59:57 +00:00
public void setBoxNames ( )
2014-06-28 21:22:05 +00:00
{
int selectedbox = C_BoxSelect . SelectedIndex ; // precache selected box
// Build ComboBox Dropdown Items
try
{
C_BoxSelect . Items . Clear ( ) ;
for ( int i = 0 ; i < 31 ; i + + )
{
string boxname = Encoding . Unicode . GetString ( savefile , SaveGame . PCLayout + ( 0x7F000 * savindex ) + 0x22 * i , 0x22 ) ;
C_BoxSelect . Items . Add ( boxname ) ;
}
}
catch
{
for ( int i = 1 ; i < 32 ; i + + )
C_BoxSelect . Items . Add ( "Box " + i ) ;
}
C_BoxSelect . SelectedIndex = selectedbox ; // restore selected box
}
2014-10-10 02:59:57 +00:00
private void setSAVLabel ( )
2014-06-28 21:22:05 +00:00
{
L_SAVINDEX . Text = ( savindex + 1 ) . ToString ( ) ;
2014-12-11 07:00:25 +00:00
RTB_S . AppendText ( "Loaded Save File " + ( savindex + 1 ) . ToString ( ) + Environment . NewLine ) ;
2014-06-28 21:22:05 +00:00
}
private void getSAVOffsets ( )
{
// Get the save file offsets for the input game
bool enableInterface = false ;
if ( BitConverter . ToUInt32 ( savefile , 0x6A810 + 0x7F000 * savindex ) = = 0x42454546 )
{
enableInterface = true ;
SaveGame = new SaveGames . SaveStruct ( "XY" ) ;
}
else
{
2014-12-11 06:50:40 +00:00
Util . Error ( "Unrecognized Save File loaded." ) ;
2014-06-28 21:22:05 +00:00
SaveGame = new SaveGames . SaveStruct ( "Error" ) ;
}
// Enable Buttons
2014-08-01 05:36:42 +00:00
GB_SAVtools . Enabled = B_JPEG . Enabled = B_BoxIO . Enabled = B_VerifyCHK . Enabled = B_VerifySHA . Enabled = B_SwitchSAV . Enabled
2014-06-28 21:22:05 +00:00
= enableInterface ;
}
private void getSlotFiller ( int offset , PictureBox pb )
{
2014-12-12 05:44:05 +00:00
byte [ ] slotdata = new byte [ 0xE8 ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , offset , slotdata , 0 , 0xE8 ) ; // Fill Our EKX Slot
2014-10-10 02:59:57 +00:00
byte [ ] dslotdata = PKX . decryptArray ( slotdata ) ;
2014-06-28 21:22:05 +00:00
2014-08-07 00:10:29 +00:00
ushort chk = 0 ;
for ( int i = 8 ; i < 232 ; i + = 2 ) // Loop through the entire PKX
2014-11-30 01:47:17 +00:00
chk + = BitConverter . ToUInt16 ( dslotdata , i ) ;
2014-08-07 00:10:29 +00:00
2014-12-12 05:44:05 +00:00
if ( chk ! = BitConverter . ToUInt16 ( dslotdata , 6 ) & & ( ! savLoaded & & ! slotdata . SequenceEqual ( new byte [ 0xE8 ] ) ) ) // Bad Egg
2014-08-07 00:10:29 +00:00
{
pb . Image = null ;
pb . BackColor = Color . Red ;
return ;
}
else pb . BackColor = Color . Transparent ;
2014-06-28 21:22:05 +00:00
int species = BitConverter . ToInt16 ( dslotdata , 0x08 ) ; // Get Species
uint isegg = ( BitConverter . ToUInt32 ( dslotdata , 0x74 ) > > 30 ) & 1 ;
int altforms = ( dslotdata [ 0x1D ] > > 3 ) ;
int gender = ( dslotdata [ 0x1D ] > > 1 ) & 0x3 ;
string file ;
2014-12-03 06:53:09 +00:00
2014-07-28 22:28:06 +00:00
if ( species = = 0 )
2014-12-03 06:53:09 +00:00
{ pb . Image = ( Image ) Properties . Resources . ResourceManager . GetObject ( "_0" ) ; return ; }
2014-12-06 02:14:04 +00:00
2014-06-28 21:22:05 +00:00
else
{
file = "_" + species . ToString ( ) ;
if ( altforms > 0 ) // Alt Form Handling
file = file + "_" + altforms . ToString ( ) ;
2014-12-05 03:19:53 +00:00
else if ( ( gender = = 1 ) & & ( species = = 521 | | species = = 668 ) ) // Unfezant & Pyroar
2014-06-28 21:22:05 +00:00
file = file = "_" + species . ToString ( ) + "f" ;
}
2014-07-28 22:28:06 +00:00
2014-07-31 22:06:48 +00:00
// Redrawing logic
2014-07-28 22:28:06 +00:00
uint PID = BitConverter . ToUInt32 ( dslotdata , 0x18 ) ;
2014-11-28 10:14:15 +00:00
ushort PSV = PKX . getPSV ( PID ) ;
2014-12-03 06:53:09 +00:00
ushort TSV = PKX . getTSV ( BitConverter . ToUInt16 ( dslotdata , 0x0C ) , BitConverter . ToUInt16 ( dslotdata , 0x0E ) ) ;
2014-11-28 10:14:15 +00:00
ushort XOR = ( ushort ) ( TSV ^ PSV ) ;
2014-06-28 21:22:05 +00:00
2014-07-31 22:06:48 +00:00
Image baseImage = ( Image ) Properties . Resources . ResourceManager . GetObject ( file ) ;
2014-08-15 04:27:53 +00:00
if ( baseImage = = null )
{
2014-12-03 06:53:09 +00:00
if ( species < 722 )
2014-08-15 04:27:53 +00:00
{
2014-10-11 07:22:22 +00:00
baseImage = PKHeX . Util . LayerImage (
2014-08-15 04:27:53 +00:00
( Image ) Properties . Resources . ResourceManager . GetObject ( "_" + species . ToString ( ) ) ,
( Image ) Properties . Resources . unknown ,
0 , 0 , . 5 ) ;
}
else
baseImage = ( Image ) Properties . Resources . unknown ;
}
2014-12-03 06:53:09 +00:00
if ( isegg = = 1 )
2014-07-31 22:06:48 +00:00
{
file = "_0" ; // Start with a partially transparent species
2014-10-11 07:22:22 +00:00
baseImage = PKHeX . Util . LayerImage ( ( Image ) Properties . Resources . ResourceManager . GetObject ( file ) , baseImage , 0 , 0 , 0.33 ) ;
2014-07-31 22:06:48 +00:00
file = "egg" ; // Add the egg layer over-top.
2014-10-11 07:22:22 +00:00
baseImage = PKHeX . Util . LayerImage ( baseImage , ( Image ) Properties . Resources . ResourceManager . GetObject ( file ) , 0 , 0 , 1 ) ;
2014-07-31 22:06:48 +00:00
}
2014-12-03 06:53:09 +00:00
if ( XOR = = 0 )
2014-07-28 22:28:06 +00:00
{ // Is Shiny
// Redraw our image
2014-10-11 07:22:22 +00:00
baseImage = PKHeX . Util . LayerImage ( baseImage , Properties . Resources . rare_icon , 0 , 0 , 0.7 ) ;
2014-07-28 22:28:06 +00:00
}
2014-12-03 06:53:09 +00:00
if ( BitConverter . ToUInt16 ( dslotdata , 0xA ) > 0 )
2014-07-31 22:06:48 +00:00
{
// Has Item
2014-08-03 05:15:47 +00:00
int item = BitConverter . ToUInt16 ( dslotdata , 0xA ) ;
Image itemimg = ( Image ) Properties . Resources . ResourceManager . GetObject ( "item_" + item . ToString ( ) ) ;
if ( itemimg = = null ) itemimg = Properties . Resources . helditem ;
2014-07-31 22:06:48 +00:00
// Redraw
2014-10-11 07:22:22 +00:00
baseImage = PKHeX . Util . LayerImage ( baseImage , itemimg , 22 + ( 15 - itemimg . Width ) / 2 , 15 + ( 15 - itemimg . Height ) , 1 ) ;
2014-07-31 22:06:48 +00:00
}
2014-07-28 22:28:06 +00:00
pb . Image = baseImage ;
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
{
PictureBox [ ] pba = {
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-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < pba . Length ; i + + )
2014-08-01 23:53:09 +00:00
pba [ i ] . BackgroundImage = null ;
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
if ( slot < 32 )
colorizedbox = C_BoxSelect . SelectedIndex ;
2014-08-17 01:42:51 +00:00
2014-08-01 23:53:09 +00:00
pba [ 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
}
private void getTSV ( object sender , EventArgs e )
{
2014-10-10 02:59:57 +00:00
uint TID = Util . ToUInt32 ( TB_TID . Text ) ;
uint SID = Util . ToUInt32 ( TB_SID . Text ) ;
2014-11-28 10:14:15 +00:00
uint tsv = PKX . getTSV ( ( ushort ) TID , ( ushort ) SID ) ;
2014-06-28 21:22:05 +00:00
Tip1 . SetToolTip ( this . TB_TID , "TSV: " + tsv . ToString ( "0000" ) ) ;
Tip2 . SetToolTip ( this . TB_SID , "TSV: " + tsv . ToString ( "0000" ) ) ;
2014-10-10 02:59:57 +00:00
uint PID = Util . getHEXval ( TB_PID ) ;
2014-11-28 10:14:15 +00:00
uint psv = PKX . getPSV ( PID ) ;
2014-06-28 21:22:05 +00:00
Tip3 . SetToolTip ( this . TB_PID , "PSV: " + psv . ToString ( "0000" ) ) ;
}
private void Menu_DumpLoadBoxes_Click ( object sender , EventArgs e )
{
2014-12-11 07:00:25 +00:00
DialogResult dr = Util . Prompt ( MessageBoxButtons . YesNoCancel , "Press Yes to Import All from Folder." + Environment . NewLine + "Press No to Dump All to Folder." , "Press Cancel to Abort." ) ;
2014-06-28 21:22:05 +00:00
if ( dr ! = DialogResult . Cancel )
{
string exepath = System . Windows . Forms . Application . StartupPath ;
string path = "" ;
{
int offset = SaveGame . Box ;
int size = 232 ;
if ( dr = = DialogResult . Yes ) // Import
{
2014-11-28 23:46:09 +00:00
if ( Directory . Exists ( Path . Combine ( exepath , "db" ) ) )
2014-06-28 21:22:05 +00:00
{
2014-12-11 06:50:40 +00:00
DialogResult ld = Util . Prompt ( MessageBoxButtons . YesNo , "Load from PKHeX's database?" ) ;
2014-06-28 21:22:05 +00:00
if ( ld = = DialogResult . Yes )
2014-11-28 23:46:09 +00:00
path = Path . Combine ( exepath , "db" ) ;
2014-06-28 21:22:05 +00:00
else if ( ld = = DialogResult . No )
{
// open folder dialog
FolderBrowserDialog fbd = new FolderBrowserDialog ( ) ;
if ( fbd . ShowDialog ( ) = = DialogResult . OK )
path = fbd . SelectedPath ;
}
else return ;
}
else
{
// open folder dialog
FolderBrowserDialog fbd = new FolderBrowserDialog ( ) ;
if ( fbd . ShowDialog ( ) = = DialogResult . OK )
path = fbd . SelectedPath ;
}
loadBoxesFromDB ( path ) ;
}
else if ( dr = = DialogResult . No )
{
// Dump all of box content to files.
{
2014-12-11 06:50:40 +00:00
DialogResult ld = Util . Prompt ( MessageBoxButtons . YesNo , "Save to PKHeX's database?" ) ;
2014-06-28 21:22:05 +00:00
if ( ld = = DialogResult . Yes )
{
2014-11-28 23:46:09 +00:00
path = Path . Combine ( exepath , "db" ) ;
2014-06-28 21:22:05 +00:00
if ( ! Directory . Exists ( path ) )
2014-11-22 07:23:48 +00:00
Directory . CreateDirectory ( path ) ;
2014-06-28 21:22:05 +00:00
}
else if ( ld = = DialogResult . No )
{
// open folder dialog
FolderBrowserDialog fbd = new FolderBrowserDialog ( ) ;
if ( fbd . ShowDialog ( ) = = DialogResult . OK )
path = fbd . SelectedPath ;
}
else return ;
}
for ( int i = 0 ; i < 31 * 30 * size ; i + = size )
{
2014-12-12 05:44:05 +00:00
byte [ ] ekxdata = new byte [ size ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , offset + i , ekxdata , 0 , size ) ;
2014-10-10 02:59:57 +00:00
byte [ ] pkxdata = PKX . decryptArray ( ekxdata ) ;
2014-06-28 21:22:05 +00:00
int species = BitConverter . ToInt16 ( pkxdata , 0x08 ) ;
if ( species = = 0 ) continue ;
uint chk = BitConverter . ToUInt16 ( pkxdata , 0x06 ) ;
uint EC = BitConverter . ToUInt32 ( pkxdata , 0 ) ;
uint IV32 = BitConverter . ToUInt32 ( pkxdata , 0x74 ) ;
string nick = "" ;
if ( Convert . ToBoolean ( ( IV32 > > 31 ) & 1 ) )
2014-08-31 20:32:04 +00:00
nick = Util . TrimFromZero ( Encoding . Unicode . GetString ( pkxdata , 0x40 , 24 ) ) + " (" + specieslist [ species ] + ")" ;
2014-06-28 21:22:05 +00:00
else
nick = specieslist [ species ] ;
if ( Convert . ToBoolean ( ( IV32 > > 30 ) & 1 ) )
nick + = " (" + eggname + ")" ;
string isshiny = "" ;
int gamevers = pkxdata [ 0xDF ] ;
uint PID = BitConverter . ToUInt32 ( pkxdata , 0x18 ) ;
uint UID = ( PID > > 16 ) ;
uint LID = ( PID & 0xFFFF ) ;
uint PSV = UID ^ LID ;
2014-10-10 02:59:57 +00:00
uint TSV = Util . ToUInt32 ( TB_TID . Text ) ^ Util . ToUInt32 ( TB_SID . Text ) ;
2014-06-28 21:22:05 +00:00
uint XOR = TSV ^ PSV ;
2014-11-22 07:23:48 +00:00
if ( XOR < 16 ) // Is Shiny
2014-06-28 21:22:05 +00:00
isshiny = " ★" ;
2014-11-22 07:23:48 +00:00
2014-06-28 21:22:05 +00:00
string savedname =
species . ToString ( "000" ) + isshiny + " - "
+ nick + " - "
+ chk . ToString ( "X4" ) + EC . ToString ( "X8" )
+ ".pk6" ;
Array . Resize ( ref pkxdata , 232 ) ;
2014-11-28 23:46:09 +00:00
if ( ! File . Exists ( Path . Combine ( path , savedname ) ) )
File . WriteAllBytes ( Path . Combine ( path , Util . CleanFileName ( savedname ) ) , pkxdata ) ;
2014-06-28 21:22:05 +00:00
}
}
}
}
}
private void loadBoxesFromDB ( string path )
{
if ( path = = "" ) return ;
int offset = SaveGame . Box ;
2014-09-05 06:23:05 +00:00
int ctr = C_BoxSelect . SelectedIndex * 30 ;
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-11 06:50:40 +00:00
if ( Util . Prompt ( MessageBoxButtons . YesNo , "Clear subsequent boxes when importing data?" , "If you only want to overwrite for new data, press no." ) = = DialogResult . Yes )
2014-09-06 19:52:36 +00:00
{
2014-12-12 05:44:05 +00:00
byte [ ] ezeros = PKX . encryptArray ( new byte [ 232 ] ) ;
2014-09-06 19:52:36 +00:00
for ( int i = ctr ; i < 30 * 31 ; i + + )
Array . Copy ( ezeros , 0 , savefile , offset + i * 232 , 232 ) ;
}
2014-08-15 04:27:53 +00:00
string [ ] filepaths = Directory . GetFiles ( path , "*.*" , SearchOption . TopDirectoryOnly ) ;
2014-10-11 07:22:22 +00:00
var Converter = new pk2pk ( ) ;
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < filepaths . Length ; i + + )
{
long len = new FileInfo ( filepaths [ i ] ) . Length ;
2014-08-22 05:54:14 +00:00
if ( len > 260 ) continue ;
else if (
2014-08-15 22:28:33 +00:00
len ! = 232 & & len ! = 260 // 6th Gen
& & len ! = 136 & & len ! = 220 & & len ! = 236 // 5th Gen
& & len ! = 100 & & len ! = 80 ) // 4th Gen
2014-06-28 21:22:05 +00:00
continue ;
2014-08-15 04:27:53 +00:00
string name = filepaths [ i ] ;
2014-12-12 05:44:05 +00:00
byte [ ] data = new byte [ 232 ] ;
2014-06-28 21:22:05 +00:00
string ext = Path . GetExtension ( filepaths [ i ] ) ;
2014-08-15 22:28:33 +00:00
if ( ext = = ".pkm" | | ext = = ".3gpkm" | | ext = = ".pk3" | | ext = = ".pk4" | | ext = = ".pk5" )
2014-08-15 04:27:53 +00:00
{
// Verify PKM (decrypted)
byte [ ] input = File . ReadAllBytes ( filepaths [ i ] ) ;
2014-11-15 05:08:00 +00:00
if ( ! PKX . verifychk ( input ) )
2014-08-15 04:27:53 +00:00
continue ;
else
{
try // to convert g5pkm
2014-11-22 07:23:48 +00:00
{ data = PKX . encryptArray ( Converter . ConvertPKM ( input , savefile , savindex ) ) ; pastctr + + ; }
catch
{ continue ; }
2014-08-15 04:27:53 +00:00
}
}
else if ( ext = = ".pkx" | | ext = = ".pk6" )
2014-06-28 21:22:05 +00:00
{
byte [ ] input = File . ReadAllBytes ( filepaths [ i ] ) ;
2014-08-17 01:42:51 +00:00
if ( ( BitConverter . ToUInt16 ( input , 0xC8 ) = = 0 ) & & ( BitConverter . ToUInt16 ( input , 0x58 ) = = 0 ) )
2014-06-28 21:22:05 +00:00
{
2014-08-15 04:27:53 +00:00
if ( BitConverter . ToUInt16 ( input , 0x8 ) = = 0 ) // if species = 0
continue ;
2014-06-28 21:22:05 +00:00
Array . Resize ( ref input , 232 ) ;
2014-08-17 01:42:51 +00:00
ushort chk = 0 ;
for ( int z = 8 ; z < 232 ; z + = 2 ) // Loop through the entire PKX
2014-11-30 01:47:17 +00:00
chk + = BitConverter . ToUInt16 ( input , z ) ;
2014-08-17 01:42:51 +00:00
if ( chk ! = BitConverter . ToUInt16 ( input , 0x6 ) ) continue ;
2014-10-10 02:59:57 +00:00
data = PKX . encryptArray ( input ) ;
2014-06-28 21:22:05 +00:00
}
}
else if ( ext = = ".ekx" | | ext = = ".ek6" )
{
byte [ ] input = File . ReadAllBytes ( filepaths [ i ] ) ;
Array . Resize ( ref input , 232 ) ;
Array . Copy ( input , data , 232 ) ;
// check if it is good data
2014-10-10 02:59:57 +00:00
byte [ ] decrypteddata = PKX . decryptArray ( input ) ;
2014-06-28 21:22:05 +00:00
if ( ! ( BitConverter . ToUInt16 ( decrypteddata , 0xC8 ) = = 0 ) & & ! ( BitConverter . ToUInt16 ( decrypteddata , 0x58 ) = = 0 ) )
continue ; // don't allow improperly encrypted files. they must be encrypted properly.
2014-08-15 04:27:53 +00:00
else if ( BitConverter . ToUInt16 ( decrypteddata , 0x8 ) = = 0 ) // if species = 0
continue ;
2014-06-28 21:22:05 +00:00
2014-08-17 01:42:51 +00:00
ushort chk = 0 ;
for ( int z = 8 ; z < 232 ; z + = 2 ) // Loop through the entire PKX
2014-10-11 07:22:22 +00:00
chk + = BitConverter . ToUInt16 ( decrypteddata , z ) ;
2014-08-17 01:42:51 +00:00
if ( chk ! = BitConverter . ToUInt16 ( decrypteddata , 0x6 ) ) continue ;
2014-06-28 21:22:05 +00:00
}
2014-08-15 04:27:53 +00:00
else continue ;
2014-08-31 20:32:04 +00:00
Array . Copy ( data , 0 , savefile , offset + ctr * 232 , 232 ) ;
2014-10-10 02:59:57 +00:00
setPokedex ( PKX . decryptArray ( data ) ) ; // Set the Pokedex data
2014-06-28 21:22:05 +00:00
ctr + + ;
if ( ctr = = 30 * 31 ) break ; // break out if we have written all 31 boxes
}
if ( ctr > 0 ) // if we've written at least one pk6 in, go ahead and make sure the window is stretched.
{
if ( Width < Height ) // expand if boxes aren't visible
{
2014-07-29 22:33:22 +00:00
this . Width = largeWidth ;
2014-06-28 21:22:05 +00:00
tabBoxMulti . Enabled = true ;
tabBoxMulti . SelectedIndex = 0 ;
}
2014-10-10 02:59:57 +00:00
setPKXBoxes ( ) ;
2014-12-11 06:50:40 +00:00
string result = String . Format ( "Loaded {0} files to boxes." , ctr ) ;
2014-08-15 04:27:53 +00:00
if ( pastctr > 0 )
2014-12-11 06:50:40 +00:00
Util . Alert ( result , String . Format ( "Conversion successful for {0} past generation files." , pastctr ) ) ;
else
Util . Alert ( result ) ;
2014-06-28 21:22:05 +00:00
}
}
// Subfunction Save Buttons //
private void B_OpenWondercards_Click ( object sender , EventArgs e )
{
// Open Wondercard Menu
2014-12-06 02:14:04 +00:00
new SAV_Wondercard ( this ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenBoxLayout_Click ( object sender , EventArgs e )
{
// Open Box Layout Menu
2014-12-06 02:14:04 +00:00
new SAV_BoxLayout ( this ) . ShowDialog ( ) ;
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 )
{
2014-12-06 02:14:04 +00:00
new SAV_Trainer ( this ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenPokepuffs_Click ( object sender , EventArgs e )
{
2014-12-06 02:14:04 +00:00
new SAV_Pokepuff ( this ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenItemPouch_Click ( object sender , EventArgs e )
{
2014-12-06 02:14:04 +00:00
new SAV_Inventory ( this ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenBerryField_Click ( object sender , EventArgs e )
{
2014-11-26 06:24:32 +00:00
if ( savegame_oras )
{
2014-12-11 06:50:40 +00:00
DialogResult dr = Util . Prompt ( MessageBoxButtons . YesNo , "No editing support for ORAS :(" , "Repopulate all with random berries?" ) ;
2014-11-26 06:24:32 +00:00
if ( dr = = DialogResult . Yes )
{
// Randomize the trees.
int offset = 0x1C400 + 0x5400 + savindex * 0x7F000 ;
byte [ ] ready = new byte [ ] { 0x05 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xFF , 0xFF , 0x00 , 0x00 , 0x80 , 0x40 , 0x01 , 0x00 , 0x00 , 0x00 , } ;
2014-12-06 02:14:04 +00:00
int [ ] berrylist = new int [ ]
2014-11-26 06:24:32 +00:00
{
0 , 149 , 150 , 151 , 152 , 153 , 154 , 155 , 156 , 157 , 158 , 159 , 160 , 161 , 162 ,
163 , 164 , 165 , 166 , 167 , 168 , 169 , 170 , 171 , 172 , 173 , 174 , 175 , 176 , 177 ,
178 , 179 , 180 , 181 , 182 , 183 , 184 , 185 , 186 , 187 , 188 , 189 , 190 , 191 , 192 ,
193 , 194 , 195 , 196 , 197 , 198 , 199 , 200 , 201 , 202 , 203 , 204 , 205 , 206 , 207 ,
208 , 209 , 210 , 211 , 212 , 686 , 687 , 688 ,
} ;
for ( int i = 0 ; i < 90 ; i + + )
{
2014-12-06 02:14:04 +00:00
Array . Copy ( ready , 0 , savefile , offset + 0x10 * i , 0x10 ) ; // prep the berry template tree (which we replace offset 0x6 for the Tree Item)
int randberry = ( int ) ( Util . rnd32 ( ) % berrylist . Length ) ; // generate a random berry that will go into the tree
int index = berrylist [ randberry ] ; // get berry item ID from list
Array . Copy ( BitConverter . GetBytes ( index ) , 0 , savefile , offset + 0x10 * i + 6 , 2 ) ; // put berry into tree.
2014-11-26 06:24:32 +00:00
}
}
}
else
2014-12-06 02:14:04 +00:00
new SAV_BerryField ( this , SaveGame . BerryField ) . ShowDialog ( ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenEventFlags_Click ( object sender , EventArgs e )
{
// Open Flag Menu
2014-12-06 02:14:04 +00:00
if ( savegame_oras )
new SAV_EventFlagsORAS ( this ) . ShowDialog ( ) ;
else
new SAV_EventFlagsXY ( this ) . 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
2014-12-06 02:14:04 +00:00
new SAV_SuperTrain ( this ) . 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
2014-11-25 03:53:10 +00:00
if ( savegame_oras )
{
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?" ) ;
2014-11-25 03:53:10 +00:00
if ( dr = = DialogResult . Yes )
{
byte [ ] maxoras = new byte [ ]
{
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 ,
0x01 , 0x00 , 0x00 , 0x00 ,
} ;
2014-11-26 03:55:46 +00:00
Array . Copy ( maxoras , 0 , savefile , 0x17400 + 0x5400 + 0x7F000 * savindex , 0x44 ) ;
2014-11-25 03:53:10 +00:00
}
}
2014-12-06 02:14:04 +00:00
else
new SAV_OPower ( this ) . 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
2014-12-06 02:14:04 +00:00
if ( savegame_oras )
new SAV_PokedexORAS ( this ) . ShowDialog ( ) ;
else
new SAV_PokedexXY ( this ) . 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 )
{
2014-07-31 22:06:48 +00:00
string result = "" ;
2014-12-11 07:00:25 +00:00
result + = "PSS List" + Environment . NewLine + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
string [ ] headers = {
"PSS Data - Friends" ,
"PSS Data - Acquaintances" ,
"PSS Data - Passerby" ,
} ;
int offset = savindex * 0x7F000 + SaveGame . PSS ;
for ( int g = 0 ; g < 3 ; g + + )
{
2014-12-11 07:00:25 +00:00
result + = "----" + Environment . NewLine + headers [ g ] + Environment . NewLine + "----" + Environment . NewLine + Environment . NewLine ;
2014-06-28 21:22:05 +00:00
uint count = BitConverter . ToUInt32 ( savefile , offset + 0x4E20 ) ;
int r_offset = offset ;
for ( int i = 0 ; i < 100 ; i + + )
{
ulong unkn = BitConverter . ToUInt64 ( savefile , r_offset ) ;
2014-08-17 01:42:51 +00:00
if ( unkn = = 0 ) break ;
2014-06-28 21:22:05 +00:00
2014-08-31 20:32:04 +00:00
string otname = Util . TrimFromZero ( Encoding . Unicode . GetString ( savefile , r_offset + 8 , 0x1A ) ) ;
string message = Util . TrimFromZero ( Encoding . Unicode . GetString ( savefile , r_offset + 0x22 , 0x22 ) ) ;
2014-06-28 21:22:05 +00:00
// Trim terminated
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 ) ;
byte region = savefile [ r_offset + 0x56 ] ;
byte country = savefile [ r_offset + 0x57 ] ;
byte _3dsreg = savefile [ r_offset + 0x58 ] ;
byte _lang = savefile [ r_offset + 0x59 ] ;
byte game = savefile [ r_offset + 0x5A ] ;
ulong outfit = BitConverter . ToUInt64 ( savefile , r_offset + 0x5C ) ;
int favpkm = BitConverter . ToUInt16 ( savefile , r_offset + 0x9C ) & 0x7FF ;
string gamename ;
2014-11-22 07:23:48 +00:00
if ( game = = 24 )
2014-06-28 21:22:05 +00:00
gamename = "X" ;
2014-11-22 07:23:48 +00:00
else if ( game = = 25 )
gamename = "Y" ;
else if ( game = = 26 )
gamename = "AS" ;
else if ( game = = 27 )
gamename = "OR" ;
else gamename = "UNK GAME" ;
2014-12-11 06:50:40 +00:00
result + =
2014-12-11 07:00:25 +00:00
"OT: " + otname + Environment . NewLine +
"Message: " + message + Environment . NewLine +
"Game: " + gamename + Environment . NewLine +
"Country ID: " + country + Environment . NewLine +
"Region ID: " + region + Environment . NewLine +
"Favorite: " + specieslist [ favpkm ] + Environment . NewLine ;
result + = Environment . NewLine ;
2014-06-28 21:22:05 +00:00
r_offset + = 0xC8 ;
}
offset + = 0x5000 ;
}
2014-07-31 22:06:48 +00:00
RTB_T . Text = result ;
2014-06-28 21:22:05 +00:00
RTB_T . Font = new Font ( "Courier New" , 8 ) ;
2014-07-31 22:06:48 +00:00
tabBoxMulti . SelectedIndex = 3 ;
2014-06-28 21:22:05 +00:00
}
private void B_OUTHallofFame_Click ( object sender , EventArgs e )
{
// Open HoF Menu
2014-12-06 02:14:04 +00:00
new SAV_HallOfFame ( this ) . 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
2014-12-06 02:14:04 +00:00
new SAV_SecretBase ( this ) . ShowDialog ( ) ; ;
2014-11-23 22:23:40 +00:00
}
2014-10-11 07:22:22 +00:00
2014-08-01 05:36:42 +00:00
private void B_OpenTemp_Click ( object sender , EventArgs e )
2014-07-31 22:06:48 +00:00
{
2014-08-12 23:37:26 +00:00
string path ;
if ( ModifierKeys = = Keys . Control )
{
path = Util . GetCacheFolder ( ) ;
if ( Directory . Exists ( path ) )
System . Diagnostics . Process . Start ( "explorer.exe" , @path ) ;
else
2014-12-11 06:50:40 +00:00
Util . Alert ( "Can't find the cache folder." ) ;
2014-08-12 23:37:26 +00:00
}
else
{
path = Util . GetTempFolder ( ) ;
2014-11-28 23:46:09 +00:00
if ( Directory . Exists ( Path . Combine ( path , "root" ) ) )
System . Diagnostics . Process . Start ( "explorer.exe" , @Path . Combine ( path , "root" ) ) ;
2014-08-12 23:37:26 +00:00
else if ( Directory . Exists ( path ) )
System . Diagnostics . Process . Start ( "explorer.exe" , @path ) ;
2014-12-11 06:50:40 +00:00
else { Util . Error ( "Can't find the temporary file." , "Make sure the Cyber Gadget software is paused." ) ; }
2014-08-12 23:37:26 +00:00
}
2014-07-31 22:06:48 +00:00
}
2014-06-28 21:22:05 +00:00
private void B_SwitchSAV_Click ( object sender , EventArgs e )
{
2014-12-11 06:50:40 +00:00
DialogResult switchsav = Util . Prompt ( MessageBoxButtons . YesNo , String . Format ( "Current Savefile is Save {0}." , ( savindex + 1 ) ) , String . Format ( "Would you like to switch to Save {0}?" , ( ( savindex + 1 ) % 2 + 1 ) ) ) ;
2014-06-28 21:22:05 +00:00
if ( switchsav = = DialogResult . Yes )
{
savindex = ( savindex + 1 ) % 2 ;
2014-10-10 02:59:57 +00:00
setBoxNames ( ) ;
setPKXBoxes ( ) ;
setSAVLabel ( ) ;
2014-06-28 21:22:05 +00:00
}
}
private void B_JPEG_Click ( object sender , EventArgs e )
{
int offset = 0x7F000 * savindex + SaveGame . JPEG ;
string filename = Encoding . Unicode . GetString ( savefile , offset + 0 , 0x1A ) . Replace ( "\0" , string . Empty ) ;
filename + = "'s picture" ;
offset + = 0x54 ;
if ( savefile [ offset ] ! = 0xFF )
{
2014-12-11 06:50:40 +00:00
Util . Alert ( "No PGL picture data found in the save file!" ) ;
2014-06-28 21:22:05 +00:00
return ;
}
int length = 0xE004 ;
2014-12-12 05:44:05 +00:00
byte [ ] jpeg = new byte [ length ] ;
2014-06-28 21:22:05 +00:00
Array . Copy ( savefile , offset , jpeg , 0 , length ) ;
SaveFileDialog savejpeg = new SaveFileDialog ( ) ;
savejpeg . FileName = filename ;
savejpeg . Filter = "JPEG|*.jpeg" ;
if ( savejpeg . ShowDialog ( ) = = DialogResult . OK )
{
string path = savejpeg . FileName ;
if ( File . Exists ( path ) )
{
// File already exists, save a .bak
byte [ ] backupfile = File . ReadAllBytes ( path ) ;
File . WriteAllBytes ( path + ".bak" , backupfile ) ;
}
File . WriteAllBytes ( path , jpeg ) ;
}
}
private void B_BoxIO_Click ( object sender , EventArgs e )
{
// Allow Import/Export of Boxes
2014-12-06 02:14:04 +00:00
new PKHeX . SAV_BoxIO ( this , SaveGame . Box , SaveGame . PCLayout ) . ShowDialog ( ) ;
2014-08-01 23:53:09 +00:00
}
2014-06-28 21:22:05 +00:00
#endregion
// Language Translation
private void changeMainLanguage ( object sender , EventArgs e )
{
if ( init )
buff = preparepkx ( buff ) ; // get data currently in form
2014-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
Menu_Options . DropDown . Close ( ) ;
InitializeStrings ( ) ;
InitializeLanguage ( ) ;
2014-12-11 06:50:40 +00:00
Util . TranslateInterface ( "Form1" , curlanguage , Controls , menuStrip1 ) ;
2014-10-10 02:59:57 +00:00
populateFields ( buff ) ; // put data back in form
2014-06-28 21:22:05 +00:00
}
private void InitializeStrings ( )
{
2014-12-08 01:40:00 +00:00
string [ ] lang_val = { "en" , "ja" , "fr" , "it" , "de" , "es" , "ko" , "zh" } ;
2014-06-28 21:22:05 +00:00
curlanguage = lang_val [ CB_MainLanguage . SelectedIndex ] ;
string l = curlanguage ;
2014-08-31 20:32:04 +00:00
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 ) ;
2014-12-11 06:50:40 +00:00
itempouch = Util . getStringList ( "ItemPouch" , l ) ;
if ( ( l ! = "zh" ) | | ( l = = "zh" & & ! init ) ) // load initial binaries
{
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-08-07 00:10:29 +00:00
// Fix Item Names (Duplicate entries)
2014-11-27 07:06:10 +00:00
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-08-07 00:10:29 +00:00
2014-06-28 21:22:05 +00:00
// Get the Egg Name and then replace it with --- for the comboboxes.
eggname = specieslist [ 0 ] ;
specieslist [ 0 ] = "---" ;
// Get the met locations... for all of the games...
2014-08-31 20:32:04 +00:00
metHGSS_00000 = Util . getStringList ( "hgss_00000" , l ) ;
metHGSS_02000 = Util . getStringList ( "hgss_02000" , l ) ;
metHGSS_03000 = Util . getStringList ( "hgss_03000" , l ) ;
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 ) ;
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-11-28 17:56:29 +00:00
// Fix up some of the Location strings to make them more descriptive:
2014-06-28 21:22:05 +00:00
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-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +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-08-17 01:42:51 +00:00
2014-06-28 21:22:05 +00:00
// Localize the Poketransfer to the language (30001)
2014-12-08 01:40:00 +00:00
string [ ] ptransp = { "Poké Transfer" , "ポケシフター" , "Poké Fret" , "Pokétrasporto" , "Poképorter" , "Pokétransfer" , "포케시프터" , "ポケシフター" } ;
2014-06-28 21:22:05 +00:00
metBW2_30000 [ 1 - 1 ] = ptransp [ CB_MainLanguage . SelectedIndex ] ;
metBW2_30000 [ 2 - 1 ] + = " (NPC)" ; // Anything from an NPC
metBW2_30000 [ 3 - 1 ] + = " (" + eggname + ")" ; // Egg From Link Trade
// 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
metBW2_60000 [ 3 - 1 ] + = " (" + eggname + ")" ; // Egg Treasure Hunter/Breeder, whatever...
2014-12-08 02:23:23 +00:00
metXY_00000 [ 104 ] + = " (X/Y)" ; // Victory Road
metXY_00000 [ 298 ] + = " (OR/AS)" ; // Victory Road
2014-06-28 21:22:05 +00:00
metXY_30000 [ 0 ] + = " (NPC)" ; // Anything from an NPC
metXY_30000 [ 1 ] + = " (" + eggname + ")" ; // Egg From Link Trade
// Set the first entry of a met location to "" (nothing)
2014-11-28 17:56:29 +00:00
// 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
// Force an update to the met locations
origintrack = "" ;
2014-12-06 02:14:04 +00:00
if ( init )
updateIVs ( null , null ) ; // Prompt an update for the characteristics
2014-08-15 04:27:53 +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 )
{
2014-11-29 19:07:01 +00:00
if ( ModifierKeys = = Keys . Control | | ModifierKeys = = Keys . Alt | | ModifierKeys = = Keys . Shift | | ModifierKeys = = ( Keys . Control | Keys . Alt ) )
{ slotModifier_Click ( sender , ( EventArgs ) e ) ; return ; }
2014-11-26 04:43:02 +00:00
PictureBox pb = ( PictureBox ) ( sender ) ;
if ( pb . Image = = null )
return ;
int slot = getSlot ( sender ) ;
int offset = getPKXOffset ( slot ) ;
if ( e . Button = = MouseButtons . Left & & e . Clicks = = 1 )
{
2014-11-30 18:59:10 +00:00
// Create Temp File to Drag
string basepath = System . Windows . Forms . Application . StartupPath ;
Cursor . Current = Cursors . Hand ;
// Prepare Data
2014-11-26 04:43:02 +00:00
Array . Copy ( savefile , offset , pkm_from , 0 , 0xE8 ) ;
pkm_from_offset = offset ;
2014-11-30 18:59:10 +00:00
// Make a new file name based off the PID
byte [ ] dragdata = PKX . decryptArray ( pkm_from ) ;
Array . Resize ( ref dragdata , 0xE8 ) ;
PKX pkx = new PKX ( dragdata ) ;
string filename = pkx . Nickname ;
if ( filename ! = pkx . Species )
filename + = " (" + pkx . Species + ")" ;
filename + = " - " + pkx . PID + ".pk6" ;
// Make File
string newfile = Path . Combine ( basepath , Util . CleanFileName ( filename ) ) ;
try
{
File . WriteAllBytes ( newfile , dragdata ) ;
string [ ] filesToDrag = { newfile } ;
( sender as PictureBox ) . DoDragDrop ( new DataObject ( DataFormats . FileDrop , filesToDrag ) , DragDropEffects . Move ) ;
2014-12-06 02:14:04 +00:00
File . Delete ( newfile ) ; // after drop, delete the temporary file
2014-11-30 18:59:10 +00:00
}
catch ( ArgumentException x )
2014-12-11 06:50:40 +00:00
{ Util . Error ( "Drag & Drop Error:" , x . ToString ( ) ) ; }
2014-11-30 18:59:10 +00:00
File . Delete ( newfile ) ;
pkm_from_offset = 0 ;
2014-11-26 04:43:02 +00:00
}
}
private void pbBoxSlot_DragDrop ( object sender , DragEventArgs e )
{
PictureBox pb = ( PictureBox ) ( sender ) ;
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 ) ;
if ( files ! = null & & pkm_from_offset = = 0 )
{
if ( files . Length > 0 )
{
FileInfo fi = new FileInfo ( files [ 0 ] ) ;
// Detect if PKM/PKX
if ( ( fi . Length = = 136 ) | | ( fi . Length = = 220 ) | | ( fi . Length = = 236 ) | | ( fi . Length = = 100 ) | | ( fi . Length = = 80 ) )
{
byte [ ] input = File . ReadAllBytes ( files [ 0 ] ) ;
var Converter = new pk2pk ( ) ;
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
{
byte [ ] data = Converter . ConvertPKM ( input , savefile , savindex ) ;
Array . Copy ( PKX . encryptArray ( data ) , 0 , savefile , offset , 0xE8 ) ;
}
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
}
else if ( fi . Length = = 232 | | fi . Length = = 260 )
{
byte [ ] data = File . ReadAllBytes ( files [ 0 ] ) ;
if ( fi . Extension = = ".pkx" | | fi . Extension = = ".pk6" )
data = PKX . encryptArray ( data ) ;
else if ( fi . Extension ! = ".ekx" | | fi . Extension ! = ".ekx" )
2014-12-06 02:14:04 +00:00
{ openQuick ( files [ 0 ] ) ; return ; } // lazy way of aborting
2014-11-30 18:59:10 +00:00
Array . Copy ( data , 0 , savefile , offset , 0xE8 ) ;
}
else // not PKX/EKX, so load with the general function
{ openQuick ( files [ 0 ] ) ; }
}
}
else
{
if ( ModifierKeys = = Keys . Alt )
2014-12-12 05:44:05 +00:00
Array . Copy ( PKX . encryptArray ( new byte [ 0xE8 ] ) , 0 , savefile , pkm_from_offset , 0xE8 ) ;
2014-11-30 18:59:10 +00:00
else if ( ModifierKeys ! = Keys . Control )
Array . Copy ( savefile , offset , savefile , pkm_from_offset , 0xE8 ) ; // Copy from new slot to old slot.
Array . Copy ( pkm_from , 0 , savefile , offset , 0xE8 ) ; // Copy from temp slot to new.
pkm_from_offset = 0 ; // Clear offset value
}
2014-11-26 04:43:02 +00:00
setPKXBoxes ( ) ;
}
private void pbBoxSlot_DragEnter ( object sender , DragEventArgs e )
{
if ( e . Data ! = null )
e . Effect = DragDropEffects . Move ;
}
2014-12-12 05:44:05 +00:00
private byte [ ] pkm_from = PKX . encryptArray ( new byte [ 0xE8 ] ) ;
2014-11-30 18:59:10 +00:00
private int pkm_from_offset = 0 ;
2014-11-28 03:26:42 +00:00
private void L_Save_Click ( object sender , EventArgs e )
{
// Get latest SaveDataFiler save location
SDFLoc = Util . GetSDFLocation ( ) ;
string path = null ;
if ( SDFLoc ! = null & & ModifierKeys ! = Keys . Control ) // if we have a result
path = Path . Combine ( SDFLoc , "main" ) ;
2014-11-28 23:46:09 +00:00
else if ( File . Exists ( Util . NormalizePath ( Path . Combine ( Util . GetTempFolder ( ) , "root" + Path . DirectorySeparatorChar + "main" ) ) ) ) // else if cgse exists
path = Util . NormalizePath ( Path . Combine ( Util . GetTempFolder ( ) , "root" + Path . DirectorySeparatorChar + "main" ) ) ;
2014-11-28 03:26:42 +00:00
if ( path ! = null )
{
2014-12-11 06:50:40 +00:00
if ( Util . Prompt ( MessageBoxButtons . YesNo , "Open save file from the following location?" , path ) = = DialogResult . Yes )
2014-11-28 03:26:42 +00:00
openQuick ( path ) ; // load save
}
}
2014-12-04 01:26:12 +00:00
bool unicode = false ;
private void Menu_Unicode_Click ( object sender , EventArgs e )
{
unicode = ( gendersymbols [ 0 ] = = "♂" ) ;
if ( unicode )
{
gendersymbols = new string [ ] { "M" , "F" , "-" } ;
BTN_Shinytize . Text = "*" ;
}
else
{
gendersymbols = new string [ ] { "♂" , "♀" , "-" } ;
BTN_Shinytize . Text = "☆" ;
}
}
2014-12-12 05:44:05 +00:00
2014-12-13 06:58:34 +00:00
2014-12-12 05:44:05 +00:00
2014-06-28 21:22:05 +00:00
}
#region Structs & Classes
public class cbItem
{
public string Text { get ; set ; }
public object Value { get ; set ; }
public override string ToString ( )
{
return Text ;
}
}
public class SaveGames
{
public struct SaveStruct
{
2014-11-22 03:26:16 +00:00
public int Box , TrainerCard , Party , BattleBox , GTS , Daycare , Fused , SUBE , Puff , Item , Trainer1 , Trainer2 , PCLayout , Wondercard , BerryField , OPower , EventFlag , PokeDex , HoF , PSS , JPEG ;
2014-06-28 21:22:05 +00:00
public string Name ;
public SaveStruct ( string GameID )
{
if ( GameID = = "XY" )
{
Name = "XY" ;
Box = 0x27A00 ;
2014-11-22 03:26:16 +00:00
TrainerCard = 0x19400 ;
2014-06-28 21:22:05 +00:00
Party = 0x19600 ;
BattleBox = 0x09E00 ;
Daycare = 0x20600 ;
GTS = 0x1CC00 ;
Fused = 0x1B400 ;
SUBE = 0x22C90 ;
Puff = 0x5400 ;
Item = 0x5800 ;
Trainer1 = 0x6800 ;
Trainer2 = 0x9600 ;
PCLayout = 0x9800 ;
Wondercard = 0x21000 ;
BerryField = 0x20C00 ;
OPower = 0x1BE00 ;
EventFlag = 0x19E00 ;
PokeDex = 0x1A400 ;
HoF = 0x1E800 ;
JPEG = 0x5C600 ;
PSS = 0x0A400 ;
}
else if ( GameID = = "ORAS" )
{
// Temp
Name = "ORAS" ;
2014-11-21 23:34:10 +00:00
Box = 0x38400 ; // Confirmed
2014-11-22 07:23:48 +00:00
TrainerCard = 0x19400 ; // Confirmed
2014-11-21 23:34:10 +00:00
Party = 0x19600 ; // Confirmed
BattleBox = 0x09E00 ; // Confirmed
2014-11-22 07:23:48 +00:00
Daycare = 0x21000 ; // Confirmed (thanks Rei)
GTS = 0x1D600 ; // Confirmed
Fused = 0x1BE00 ; // Confirmed
SUBE = 0x22C90 ; // ****not in use, not updating?****
Puff = 0x5400 ; // Confirmed
Item = 0x5800 ; // Confirmed
Trainer1 = 0x6800 ; // Confirmed
Trainer2 = 0x9600 ; // Confirmed
PCLayout = 0x9800 ; // Confirmed
Wondercard = 0x22000 ; // Confirmed
BerryField = 0x20C00 ; // ****changed****
2014-06-28 21:22:05 +00:00
OPower = 0x1BE00 ;
2014-11-22 07:23:48 +00:00
EventFlag = 0x19E00 ; // Confirmed
2014-06-28 21:22:05 +00:00
PokeDex = 0x1A400 ;
2014-11-22 07:23:48 +00:00
HoF = 0x1F200 ; // Confirmed
JPEG = 0x6D000 ; // Confirmed
PSS = 0x0A400 ; // Confirmed (thanks Rei)
2014-06-28 21:22:05 +00:00
}
else
{
// Copied...
Name = "Unknown" ;
Box = 0x27A00 ;
2014-11-22 03:26:16 +00:00
TrainerCard = 0x19400 ;
2014-06-28 21:22:05 +00:00
Party = 0x19600 ;
BattleBox = 0x09E00 ;
Daycare = 0x20600 ;
GTS = 0x1CC00 ;
Fused = 0x1B400 ;
SUBE = 0x22C90 ;
Puff = 0x5400 ;
Item = 0x5800 ;
Trainer1 = 0x6800 ;
Trainer2 = 0x9600 ;
PCLayout = 0x9800 ;
Wondercard = 0x21000 ;
BerryField = 0x20C00 ;
OPower = 0x1BE00 ;
EventFlag = 0x19E00 ;
PokeDex = 0x1A400 ;
HoF = 0x1E800 ;
JPEG = 0x5C600 ;
PSS = 0x0A400 ;
}
}
}
}
#endregion
2014-12-11 07:09:50 +00:00
}