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
} ;
int [ ] main_langnum = new int [ ]
{ 2 , 1 , 3 , 4 , 5 , 7 , 8 } ;
string [ ] lang_val = { "en" , "ja" , "fr" , "it" , "de" , "es" , "ko" } ;
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-08-31 20:32:04 +00:00
// Load the command line arguments
string [ ] args = Environment . GetCommandLineArgs ( ) ;
if ( args . Length > 1 )
openQuick ( args [ 1 ] ) ;
else if ( File . Exists ( Util . GetTempFolder ( ) + "\\root\\main" ) )
openQuick ( Util . GetTempFolder ( ) + "\\root\\main" ) ;
2014-06-28 21:22:05 +00:00
// Close splash screen.
init = true ;
SplashSCR . Join ( ) ;
this . BringToFront ( ) ;
this . WindowState = FormWindowState . Minimized ;
this . Show ( ) ;
this . WindowState = FormWindowState . Normal ;
2014-10-25 22:52:24 +00:00
if ( HaX )
{
System . Media . SystemSounds . Exclamation . Play ( ) ;
MessageBox . Show ( "Illegal mode activated.\n\nPlease behave." , "Alert" ) ;
}
2014-06-28 21:22:05 +00:00
#endregion
}
#region Global Variables : Always Visible !
public byte [ ] buff = new Byte [ 260 ] ;
public byte [ ] savefile = new Byte [ 0x100000 ] ;
2014-07-26 21:56:06 +00:00
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-06-28 21:22:05 +00:00
public int gt = 258 ;
public int genderflag , species ;
public int savindex ;
public bool savedited ;
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 = "" ;
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 ////
// Randomization //
// Index Tables //
// Functions that Set Stuff up for PKX viewing //
private void InitializeFields ( )
{
// Initialize Fields
{
#region ability table
2014-08-17 05:09:39 +00:00
speciesability = new int [ ] {
// If you're tinkering with the program, just change the "e" in PKHeX to an "a".
// You can then choose any ability or use hacked stats. Please act responsibly.
2014-06-28 21:22:05 +00:00
000 , 000 , 000 , 000 ,
001 , 065 , 065 , 034 ,
002 , 065 , 065 , 034 ,
003 , 065 , 065 , 034 ,
004 , 066 , 066 , 094 ,
005 , 066 , 066 , 094 ,
006 , 066 , 066 , 094 ,
007 , 067 , 067 , 044 ,
008 , 067 , 067 , 044 ,
009 , 067 , 067 , 044 ,
010 , 019 , 019 , 050 ,
011 , 061 , 061 , 061 ,
012 , 014 , 014 , 110 ,
013 , 019 , 019 , 050 ,
014 , 061 , 061 , 061 ,
015 , 068 , 068 , 097 ,
016 , 051 , 077 , 145 ,
017 , 051 , 077 , 145 ,
018 , 051 , 077 , 145 ,
019 , 050 , 062 , 055 ,
020 , 050 , 062 , 055 ,
021 , 051 , 051 , 097 ,
022 , 051 , 051 , 097 ,
023 , 022 , 061 , 127 ,
024 , 022 , 061 , 127 ,
025 , 009 , 009 , 031 ,
026 , 009 , 009 , 031 ,
027 , 008 , 008 , 146 ,
028 , 008 , 008 , 146 ,
029 , 038 , 079 , 055 ,
030 , 038 , 079 , 055 ,
031 , 038 , 079 , 125 ,
032 , 038 , 079 , 055 ,
033 , 038 , 079 , 055 ,
034 , 038 , 079 , 125 ,
035 , 056 , 098 , 132 ,
036 , 056 , 098 , 109 ,
037 , 018 , 018 , 070 ,
038 , 018 , 018 , 070 ,
039 , 056 , 172 , 132 ,
040 , 056 , 172 , 119 ,
041 , 039 , 039 , 151 ,
042 , 039 , 039 , 151 ,
043 , 034 , 034 , 050 ,
044 , 034 , 034 , 001 ,
045 , 034 , 034 , 027 ,
046 , 027 , 087 , 006 ,
047 , 027 , 087 , 006 ,
048 , 014 , 110 , 050 ,
049 , 019 , 110 , 147 ,
050 , 008 , 071 , 159 ,
051 , 008 , 071 , 159 ,
052 , 053 , 101 , 127 ,
053 , 007 , 101 , 127 ,
054 , 006 , 013 , 033 ,
055 , 006 , 013 , 033 ,
056 , 072 , 083 , 128 ,
057 , 072 , 083 , 128 ,
058 , 022 , 018 , 154 ,
059 , 022 , 018 , 154 ,
060 , 011 , 006 , 033 ,
061 , 011 , 006 , 033 ,
062 , 011 , 006 , 033 ,
063 , 028 , 039 , 098 ,
064 , 028 , 039 , 098 ,
065 , 028 , 039 , 098 ,
066 , 062 , 099 , 080 ,
067 , 062 , 099 , 080 ,
068 , 062 , 099 , 080 ,
069 , 034 , 034 , 082 ,
070 , 034 , 034 , 082 ,
071 , 034 , 034 , 082 ,
072 , 029 , 064 , 044 ,
073 , 029 , 064 , 044 ,
074 , 069 , 005 , 008 ,
075 , 069 , 005 , 008 ,
076 , 069 , 005 , 008 ,
077 , 050 , 018 , 049 ,
078 , 050 , 018 , 049 ,
079 , 012 , 020 , 144 ,
080 , 012 , 020 , 144 ,
081 , 042 , 005 , 148 ,
082 , 042 , 005 , 148 ,
083 , 051 , 039 , 128 ,
084 , 050 , 048 , 077 ,
085 , 050 , 048 , 077 ,
086 , 047 , 093 , 115 ,
087 , 047 , 093 , 115 ,
088 , 001 , 060 , 143 ,
089 , 001 , 060 , 143 ,
090 , 075 , 092 , 142 ,
091 , 075 , 092 , 142 ,
092 , 026 , 026 , 026 ,
093 , 026 , 026 , 026 ,
094 , 026 , 026 , 026 ,
095 , 069 , 005 , 133 ,
096 , 015 , 108 , 039 ,
097 , 015 , 108 , 039 ,
098 , 052 , 075 , 125 ,
099 , 052 , 075 , 125 ,
100 , 043 , 009 , 106 ,
101 , 043 , 009 , 106 ,
102 , 034 , 034 , 139 ,
103 , 034 , 034 , 139 ,
104 , 069 , 031 , 004 ,
105 , 069 , 031 , 004 ,
106 , 007 , 120 , 084 ,
107 , 051 , 089 , 039 ,
108 , 020 , 012 , 013 ,
109 , 026 , 026 , 026 ,
110 , 026 , 026 , 026 ,
111 , 031 , 069 , 120 ,
112 , 031 , 069 , 120 ,
113 , 030 , 032 , 131 ,
114 , 034 , 102 , 144 ,
115 , 048 , 113 , 039 ,
116 , 033 , 097 , 006 ,
117 , 038 , 097 , 006 ,
118 , 033 , 041 , 031 ,
119 , 033 , 041 , 031 ,
120 , 035 , 030 , 148 ,
121 , 035 , 030 , 148 ,
122 , 043 , 111 , 101 ,
123 , 068 , 101 , 080 ,
124 , 012 , 108 , 087 ,
125 , 009 , 009 , 072 ,
126 , 049 , 049 , 072 ,
127 , 052 , 104 , 153 ,
128 , 022 , 083 , 125 ,
129 , 033 , 033 , 155 ,
130 , 022 , 022 , 153 ,
131 , 011 , 075 , 093 ,
132 , 007 , 007 , 150 ,
133 , 050 , 091 , 107 ,
134 , 011 , 011 , 093 ,
135 , 010 , 010 , 095 ,
136 , 018 , 018 , 062 ,
137 , 036 , 088 , 148 ,
138 , 033 , 075 , 133 ,
139 , 033 , 075 , 133 ,
140 , 033 , 004 , 133 ,
141 , 033 , 004 , 133 ,
142 , 069 , 046 , 127 ,
143 , 017 , 047 , 082 ,
144 , 046 , 046 , 081 ,
145 , 046 , 046 , 009 ,
146 , 046 , 046 , 049 ,
147 , 061 , 061 , 063 ,
148 , 061 , 061 , 063 ,
149 , 039 , 039 , 136 ,
150 , 046 , 046 , 127 ,
151 , 028 , 028 , 028 ,
152 , 065 , 065 , 102 ,
153 , 065 , 065 , 102 ,
154 , 065 , 065 , 102 ,
155 , 066 , 066 , 018 ,
156 , 066 , 066 , 018 ,
157 , 066 , 066 , 018 ,
158 , 067 , 067 , 125 ,
159 , 067 , 067 , 125 ,
160 , 067 , 067 , 125 ,
161 , 050 , 051 , 119 ,
162 , 050 , 051 , 119 ,
163 , 015 , 051 , 110 ,
164 , 015 , 051 , 110 ,
165 , 068 , 048 , 155 ,
166 , 068 , 048 , 089 ,
167 , 068 , 015 , 097 ,
168 , 068 , 015 , 097 ,
169 , 039 , 039 , 151 ,
170 , 010 , 035 , 011 ,
171 , 010 , 035 , 011 ,
172 , 009 , 009 , 031 ,
173 , 056 , 098 , 132 ,
174 , 056 , 172 , 132 ,
175 , 055 , 032 , 105 ,
176 , 055 , 032 , 105 ,
177 , 028 , 048 , 156 ,
178 , 028 , 048 , 156 ,
179 , 009 , 009 , 057 ,
180 , 009 , 009 , 057 ,
181 , 009 , 009 , 057 ,
182 , 034 , 034 , 131 ,
183 , 047 , 037 , 157 ,
184 , 047 , 037 , 157 ,
185 , 005 , 069 , 155 ,
186 , 011 , 006 , 002 ,
187 , 034 , 102 , 151 ,
188 , 034 , 102 , 151 ,
189 , 034 , 102 , 151 ,
190 , 050 , 053 , 092 ,
191 , 034 , 094 , 048 ,
192 , 034 , 094 , 048 ,
193 , 003 , 014 , 119 ,
194 , 006 , 011 , 109 ,
195 , 006 , 011 , 109 ,
196 , 028 , 028 , 156 ,
197 , 028 , 028 , 039 ,
198 , 015 , 105 , 158 ,
199 , 012 , 020 , 144 ,
200 , 026 , 026 , 026 ,
201 , 026 , 026 , 026 ,
202 , 023 , 023 , 140 ,
203 , 039 , 048 , 157 ,
204 , 005 , 005 , 142 ,
205 , 005 , 005 , 142 ,
206 , 032 , 050 , 155 ,
207 , 052 , 008 , 017 ,
208 , 069 , 005 , 125 ,
209 , 022 , 050 , 155 ,
210 , 022 , 095 , 155 ,
211 , 038 , 033 , 022 ,
212 , 068 , 101 , 135 ,
213 , 005 , 082 , 126 ,
214 , 068 , 062 , 153 ,
215 , 039 , 051 , 124 ,
216 , 053 , 095 , 118 ,
217 , 062 , 095 , 127 ,
218 , 040 , 049 , 133 ,
219 , 040 , 049 , 133 ,
220 , 012 , 081 , 047 ,
221 , 012 , 081 , 047 ,
222 , 055 , 030 , 144 ,
223 , 055 , 097 , 141 ,
224 , 021 , 097 , 141 ,
225 , 072 , 055 , 015 ,
226 , 033 , 011 , 041 ,
227 , 051 , 005 , 133 ,
228 , 048 , 018 , 127 ,
229 , 048 , 018 , 127 ,
230 , 033 , 097 , 006 ,
231 , 053 , 053 , 008 ,
232 , 005 , 005 , 008 ,
233 , 036 , 088 , 148 ,
234 , 022 , 119 , 157 ,
235 , 020 , 101 , 141 ,
236 , 062 , 080 , 072 ,
237 , 022 , 101 , 080 ,
238 , 012 , 108 , 093 ,
239 , 009 , 009 , 072 ,
240 , 049 , 049 , 072 ,
241 , 047 , 113 , 157 ,
242 , 030 , 032 , 131 ,
243 , 046 , 046 , 010 ,
244 , 046 , 046 , 018 ,
245 , 046 , 046 , 011 ,
246 , 062 , 062 , 008 ,
247 , 061 , 061 , 061 ,
248 , 045 , 045 , 127 ,
249 , 046 , 046 , 136 ,
250 , 046 , 046 , 144 ,
251 , 030 , 030 , 030 ,
252 , 065 , 065 , 084 ,
253 , 065 , 065 , 084 ,
254 , 065 , 065 , 084 ,
255 , 066 , 066 , 003 ,
256 , 066 , 066 , 003 ,
257 , 066 , 066 , 003 ,
258 , 067 , 067 , 006 ,
259 , 067 , 067 , 006 ,
260 , 067 , 067 , 006 ,
261 , 050 , 095 , 155 ,
262 , 022 , 095 , 153 ,
263 , 053 , 082 , 095 ,
264 , 053 , 082 , 095 ,
265 , 019 , 019 , 050 ,
266 , 061 , 061 , 061 ,
267 , 068 , 068 , 079 ,
268 , 061 , 061 , 061 ,
269 , 019 , 019 , 014 ,
270 , 033 , 044 , 020 ,
271 , 033 , 044 , 020 ,
272 , 033 , 044 , 020 ,
273 , 034 , 048 , 124 ,
274 , 034 , 048 , 124 ,
275 , 034 , 048 , 124 ,
276 , 062 , 062 , 113 ,
277 , 062 , 062 , 113 ,
278 , 051 , 051 , 044 ,
279 , 051 , 051 , 044 ,
280 , 028 , 036 , 140 ,
281 , 028 , 036 , 140 ,
282 , 028 , 036 , 140 ,
283 , 033 , 033 , 044 ,
284 , 022 , 022 , 127 ,
285 , 027 , 090 , 095 ,
286 , 027 , 090 , 101 ,
287 , 054 , 054 , 054 ,
288 , 072 , 072 , 072 ,
289 , 054 , 054 , 054 ,
290 , 014 , 014 , 050 ,
291 , 003 , 003 , 151 ,
292 , 025 , 025 , 025 ,
293 , 043 , 043 , 155 ,
294 , 043 , 043 , 113 ,
295 , 043 , 043 , 113 ,
296 , 047 , 062 , 125 ,
297 , 047 , 062 , 125 ,
298 , 047 , 037 , 157 ,
299 , 005 , 042 , 159 ,
300 , 056 , 096 , 147 ,
301 , 056 , 096 , 147 ,
302 , 051 , 100 , 158 ,
303 , 052 , 022 , 125 ,
304 , 005 , 069 , 134 ,
305 , 005 , 069 , 134 ,
306 , 005 , 069 , 134 ,
307 , 074 , 074 , 140 ,
308 , 074 , 074 , 140 ,
309 , 009 , 031 , 058 ,
310 , 009 , 031 , 058 ,
311 , 057 , 057 , 031 ,
312 , 058 , 058 , 010 ,
313 , 035 , 068 , 158 ,
314 , 012 , 110 , 158 ,
315 , 030 , 038 , 102 ,
316 , 064 , 060 , 082 ,
317 , 064 , 060 , 082 ,
318 , 024 , 024 , 003 ,
319 , 024 , 024 , 003 ,
320 , 041 , 012 , 046 ,
321 , 041 , 012 , 046 ,
322 , 012 , 086 , 020 ,
323 , 040 , 116 , 083 ,
324 , 073 , 073 , 075 ,
325 , 047 , 020 , 082 ,
326 , 047 , 020 , 082 ,
327 , 020 , 077 , 126 ,
328 , 052 , 071 , 125 ,
329 , 026 , 026 , 026 ,
330 , 026 , 026 , 026 ,
331 , 008 , 008 , 011 ,
332 , 008 , 008 , 011 ,
333 , 030 , 030 , 013 ,
334 , 030 , 030 , 013 ,
335 , 017 , 017 , 137 ,
336 , 061 , 061 , 151 ,
337 , 026 , 026 , 026 ,
338 , 026 , 026 , 026 ,
339 , 012 , 107 , 093 ,
340 , 012 , 107 , 093 ,
341 , 052 , 075 , 091 ,
342 , 052 , 075 , 091 ,
343 , 026 , 026 , 026 ,
344 , 026 , 026 , 026 ,
345 , 021 , 021 , 114 ,
346 , 021 , 021 , 114 ,
347 , 004 , 004 , 033 ,
348 , 004 , 004 , 033 ,
349 , 033 , 012 , 091 ,
350 , 063 , 172 , 056 ,
351 , 059 , 059 , 059 ,
352 , 016 , 016 , 168 ,
353 , 015 , 119 , 130 ,
354 , 015 , 119 , 130 ,
355 , 026 , 026 , 119 ,
356 , 046 , 046 , 119 ,
357 , 034 , 094 , 139 ,
358 , 026 , 026 , 026 ,
359 , 046 , 105 , 154 ,
360 , 023 , 023 , 140 ,
361 , 039 , 115 , 141 ,
362 , 039 , 115 , 141 ,
363 , 047 , 115 , 012 ,
364 , 047 , 115 , 012 ,
365 , 047 , 115 , 012 ,
366 , 075 , 075 , 155 ,
367 , 033 , 033 , 041 ,
368 , 033 , 033 , 093 ,
369 , 033 , 069 , 005 ,
370 , 033 , 033 , 093 ,
371 , 069 , 069 , 125 ,
372 , 069 , 069 , 142 ,
373 , 022 , 022 , 153 ,
374 , 029 , 029 , 135 ,
375 , 029 , 029 , 135 ,
376 , 029 , 029 , 135 ,
377 , 029 , 029 , 005 ,
378 , 029 , 029 , 115 ,
379 , 029 , 029 , 135 ,
380 , 026 , 026 , 026 ,
381 , 026 , 026 , 026 ,
382 , 002 , 002 , 002 ,
383 , 070 , 070 , 070 ,
384 , 076 , 076 , 076 ,
385 , 032 , 032 , 032 ,
386 , 046 , 046 , 046 ,
387 , 065 , 065 , 075 ,
388 , 065 , 065 , 075 ,
389 , 065 , 065 , 075 ,
390 , 066 , 066 , 089 ,
391 , 066 , 066 , 089 ,
392 , 066 , 066 , 089 ,
393 , 067 , 067 , 128 ,
394 , 067 , 067 , 128 ,
395 , 067 , 067 , 128 ,
396 , 051 , 051 , 120 ,
397 , 022 , 022 , 120 ,
398 , 022 , 022 , 120 ,
399 , 086 , 109 , 141 ,
400 , 086 , 109 , 141 ,
401 , 061 , 061 , 050 ,
402 , 068 , 068 , 101 ,
403 , 079 , 022 , 062 ,
404 , 079 , 022 , 062 ,
405 , 079 , 022 , 062 ,
406 , 030 , 038 , 102 ,
407 , 030 , 038 , 101 ,
408 , 104 , 104 , 125 ,
409 , 104 , 104 , 125 ,
410 , 005 , 005 , 043 ,
411 , 005 , 005 , 043 ,
412 , 061 , 061 , 142 ,
413 , 107 , 107 , 142 ,
414 , 068 , 068 , 110 ,
415 , 118 , 118 , 055 ,
416 , 046 , 046 , 127 ,
417 , 050 , 053 , 010 ,
418 , 033 , 033 , 041 ,
419 , 033 , 033 , 041 ,
420 , 034 , 034 , 034 ,
421 , 122 , 122 , 122 ,
422 , 060 , 114 , 159 ,
423 , 060 , 114 , 159 ,
424 , 101 , 053 , 092 ,
425 , 106 , 084 , 138 ,
426 , 106 , 084 , 138 ,
427 , 050 , 103 , 007 ,
428 , 056 , 103 , 007 ,
429 , 026 , 026 , 026 ,
430 , 015 , 105 , 153 ,
431 , 007 , 020 , 051 ,
432 , 047 , 020 , 128 ,
433 , 026 , 026 , 026 ,
434 , 001 , 106 , 051 ,
435 , 001 , 106 , 051 ,
436 , 026 , 085 , 134 ,
437 , 026 , 085 , 134 ,
438 , 005 , 069 , 155 ,
439 , 043 , 111 , 101 ,
440 , 030 , 032 , 132 ,
441 , 051 , 077 , 145 ,
442 , 046 , 046 , 151 ,
443 , 008 , 008 , 024 ,
444 , 008 , 008 , 024 ,
445 , 008 , 008 , 024 ,
446 , 053 , 047 , 082 ,
447 , 080 , 039 , 158 ,
448 , 080 , 039 , 154 ,
449 , 045 , 045 , 159 ,
450 , 045 , 045 , 159 ,
451 , 004 , 097 , 051 ,
452 , 004 , 097 , 051 ,
453 , 107 , 087 , 143 ,
454 , 107 , 087 , 143 ,
455 , 026 , 026 , 026 ,
456 , 033 , 114 , 041 ,
457 , 033 , 114 , 041 ,
458 , 033 , 011 , 041 ,
459 , 117 , 117 , 043 ,
460 , 117 , 117 , 043 ,
461 , 046 , 046 , 124 ,
462 , 042 , 005 , 148 ,
463 , 020 , 012 , 013 ,
464 , 031 , 116 , 120 ,
465 , 034 , 102 , 144 ,
466 , 078 , 078 , 072 ,
467 , 049 , 049 , 072 ,
468 , 055 , 032 , 105 ,
469 , 003 , 110 , 119 ,
470 , 102 , 102 , 034 ,
471 , 081 , 081 , 115 ,
472 , 052 , 008 , 090 ,
473 , 012 , 081 , 047 ,
474 , 091 , 088 , 148 ,
475 , 080 , 080 , 154 ,
476 , 005 , 042 , 159 ,
477 , 046 , 046 , 119 ,
478 , 081 , 081 , 130 ,
479 , 026 , 026 , 026 ,
480 , 026 , 026 , 026 ,
481 , 026 , 026 , 026 ,
482 , 026 , 026 , 026 ,
483 , 046 , 046 , 140 ,
484 , 046 , 046 , 140 ,
485 , 018 , 018 , 049 ,
486 , 112 , 112 , 112 ,
487 , 046 , 046 , 140 ,
488 , 026 , 026 , 026 ,
489 , 093 , 093 , 093 ,
490 , 093 , 093 , 093 ,
491 , 123 , 123 , 123 ,
492 , 030 , 030 , 030 ,
493 , 121 , 121 , 121 ,
494 , 162 , 162 , 162 ,
495 , 065 , 065 , 126 ,
496 , 065 , 065 , 126 ,
497 , 065 , 065 , 126 ,
498 , 066 , 066 , 047 ,
499 , 066 , 066 , 047 ,
500 , 066 , 066 , 120 ,
501 , 067 , 067 , 075 ,
502 , 067 , 067 , 075 ,
503 , 067 , 067 , 075 ,
504 , 050 , 051 , 148 ,
505 , 035 , 051 , 148 ,
506 , 072 , 053 , 050 ,
507 , 022 , 146 , 113 ,
508 , 022 , 146 , 113 ,
509 , 007 , 084 , 158 ,
510 , 007 , 084 , 158 ,
511 , 082 , 082 , 065 ,
512 , 082 , 082 , 065 ,
513 , 082 , 082 , 066 ,
514 , 082 , 082 , 066 ,
515 , 082 , 082 , 067 ,
516 , 082 , 082 , 067 ,
517 , 108 , 028 , 140 ,
518 , 108 , 028 , 140 ,
519 , 145 , 105 , 079 ,
520 , 145 , 105 , 079 ,
521 , 145 , 105 , 079 ,
522 , 031 , 078 , 157 ,
523 , 031 , 078 , 157 ,
524 , 005 , 005 , 159 ,
525 , 005 , 005 , 159 ,
526 , 005 , 005 , 159 ,
527 , 109 , 103 , 086 ,
528 , 109 , 103 , 086 ,
529 , 146 , 159 , 104 ,
530 , 146 , 159 , 104 ,
531 , 131 , 144 , 103 ,
532 , 062 , 125 , 089 ,
533 , 062 , 125 , 089 ,
534 , 062 , 125 , 089 ,
535 , 033 , 093 , 011 ,
536 , 033 , 093 , 011 ,
537 , 033 , 143 , 011 ,
538 , 062 , 039 , 104 ,
539 , 005 , 039 , 104 ,
540 , 068 , 034 , 142 ,
541 , 102 , 034 , 142 ,
542 , 068 , 034 , 142 ,
543 , 038 , 068 , 003 ,
544 , 038 , 068 , 003 ,
545 , 038 , 068 , 003 ,
546 , 158 , 151 , 034 ,
547 , 158 , 151 , 034 ,
548 , 034 , 020 , 102 ,
549 , 034 , 020 , 102 ,
550 , 120 , 091 , 104 ,
551 , 022 , 153 , 083 ,
552 , 022 , 153 , 083 ,
553 , 022 , 153 , 083 ,
554 , 055 , 055 , 039 ,
555 , 125 , 125 , 161 ,
556 , 011 , 034 , 114 ,
557 , 005 , 075 , 133 ,
558 , 005 , 075 , 133 ,
559 , 061 , 153 , 022 ,
560 , 061 , 153 , 022 ,
561 , 147 , 098 , 110 ,
562 , 152 , 152 , 152 ,
563 , 152 , 152 , 152 ,
564 , 116 , 005 , 033 ,
565 , 116 , 005 , 033 ,
566 , 129 , 129 , 129 ,
567 , 129 , 129 , 129 ,
568 , 001 , 060 , 106 ,
569 , 001 , 133 , 106 ,
570 , 149 , 149 , 149 ,
571 , 149 , 149 , 149 ,
572 , 056 , 101 , 092 ,
573 , 056 , 101 , 092 ,
574 , 119 , 172 , 023 ,
575 , 119 , 172 , 023 ,
576 , 119 , 172 , 023 ,
577 , 142 , 098 , 144 ,
578 , 142 , 098 , 144 ,
579 , 142 , 098 , 144 ,
580 , 051 , 145 , 093 ,
581 , 051 , 145 , 093 ,
582 , 115 , 115 , 133 ,
583 , 115 , 115 , 133 ,
584 , 115 , 115 , 133 ,
585 , 034 , 157 , 032 ,
586 , 034 , 157 , 032 ,
587 , 009 , 009 , 078 ,
588 , 068 , 061 , 099 ,
589 , 068 , 075 , 142 ,
590 , 027 , 027 , 144 ,
591 , 027 , 027 , 144 ,
592 , 011 , 130 , 006 ,
593 , 011 , 130 , 006 ,
594 , 131 , 093 , 144 ,
595 , 014 , 127 , 068 ,
596 , 014 , 127 , 068 ,
597 , 160 , 160 , 160 ,
598 , 160 , 160 , 107 ,
599 , 057 , 058 , 029 ,
600 , 057 , 058 , 029 ,
601 , 057 , 058 , 029 ,
602 , 026 , 026 , 026 ,
603 , 026 , 026 , 026 ,
604 , 026 , 026 , 026 ,
605 , 140 , 028 , 148 ,
606 , 140 , 028 , 148 ,
607 , 018 , 049 , 151 ,
608 , 018 , 049 , 151 ,
609 , 018 , 049 , 151 ,
610 , 079 , 104 , 127 ,
611 , 079 , 104 , 127 ,
612 , 079 , 104 , 127 ,
613 , 081 , 081 , 155 ,
614 , 081 , 081 , 033 ,
615 , 026 , 026 , 026 ,
616 , 093 , 075 , 142 ,
617 , 093 , 060 , 084 ,
618 , 009 , 007 , 008 ,
619 , 039 , 144 , 120 ,
620 , 039 , 144 , 120 ,
621 , 024 , 125 , 104 ,
622 , 089 , 103 , 099 ,
623 , 089 , 103 , 099 ,
624 , 128 , 039 , 046 ,
625 , 128 , 039 , 046 ,
626 , 120 , 157 , 043 ,
627 , 051 , 125 , 055 ,
628 , 051 , 125 , 128 ,
629 , 145 , 142 , 133 ,
630 , 145 , 142 , 133 ,
631 , 082 , 018 , 073 ,
632 , 068 , 055 , 054 ,
633 , 055 , 055 , 055 ,
634 , 055 , 055 , 055 ,
635 , 026 , 026 , 026 ,
636 , 049 , 049 , 068 ,
637 , 049 , 049 , 068 ,
638 , 154 , 154 , 154 ,
639 , 154 , 154 , 154 ,
640 , 154 , 154 , 154 ,
641 , 158 , 158 , 128 ,
642 , 158 , 158 , 128 ,
643 , 163 , 163 , 163 ,
644 , 164 , 164 , 164 ,
645 , 159 , 159 , 125 ,
646 , 046 , 046 , 046 ,
647 , 154 , 154 , 154 ,
648 , 032 , 032 , 032 ,
649 , 088 , 088 , 088 ,
650 , 065 , 065 , 171 ,
651 , 065 , 065 , 171 ,
652 , 065 , 065 , 171 ,
653 , 066 , 066 , 170 ,
654 , 066 , 066 , 170 ,
655 , 066 , 066 , 170 ,
656 , 067 , 067 , 168 ,
657 , 067 , 067 , 168 ,
658 , 067 , 067 , 168 ,
659 , 053 , 167 , 037 ,
660 , 053 , 167 , 037 ,
661 , 145 , 145 , 177 ,
662 , 049 , 049 , 177 ,
663 , 049 , 049 , 177 ,
664 , 019 , 014 , 132 ,
665 , 061 , 061 , 132 ,
666 , 019 , 014 , 132 ,
667 , 079 , 127 , 153 ,
668 , 079 , 127 , 153 ,
669 , 166 , 166 , 180 ,
670 , 166 , 166 , 180 ,
671 , 166 , 166 , 180 ,
672 , 157 , 157 , 179 ,
673 , 157 , 157 , 179 ,
674 , 089 , 104 , 113 ,
675 , 089 , 104 , 113 ,
676 , 169 , 169 , 169 ,
677 , 051 , 151 , 020 ,
678 , 051 , 151 , 158 ,
679 , 099 , 099 , 099 ,
680 , 099 , 099 , 099 ,
681 , 176 , 176 , 176 ,
682 , 131 , 131 , 165 ,
683 , 131 , 131 , 165 ,
684 , 175 , 175 , 084 ,
685 , 175 , 175 , 084 ,
686 , 126 , 021 , 151 ,
687 , 126 , 021 , 151 ,
688 , 181 , 097 , 124 ,
689 , 181 , 097 , 124 ,
690 , 038 , 143 , 091 ,
691 , 038 , 143 , 091 ,
692 , 178 , 178 , 178 ,
693 , 178 , 178 , 178 ,
694 , 087 , 008 , 094 ,
695 , 087 , 008 , 094 ,
696 , 173 , 173 , 005 ,
697 , 173 , 173 , 069 ,
698 , 174 , 174 , 117 ,
699 , 174 , 174 , 117 ,
700 , 056 , 056 , 182 ,
701 , 007 , 084 , 104 ,
702 , 167 , 053 , 057 ,
703 , 029 , 029 , 005 ,
704 , 157 , 093 , 183 ,
705 , 157 , 093 , 183 ,
706 , 157 , 093 , 183 ,
707 , 158 , 158 , 170 ,
708 , 030 , 119 , 139 ,
709 , 030 , 119 , 139 ,
710 , 053 , 119 , 015 ,
711 , 053 , 119 , 015 ,
712 , 020 , 115 , 005 ,
713 , 020 , 115 , 005 ,
714 , 119 , 151 , 140 ,
715 , 119 , 151 , 140 ,
716 , 187 , 187 , 187 ,
717 , 186 , 186 , 186 ,
718 , 188 , 188 , 188 ,
719 , 029 , 029 , 029 ,
720 , 170 , 170 , 170 ,
721 , 011 , 011 , 011 ,
722 , 046 , 046 , 046 ,
723 , 046 , 046 , 046 ,
724 , 046 , 046 , 046 ,
725 , 107 , 107 , 142 ,
726 , 107 , 107 , 142 ,
727 , 032 , 032 , 032 ,
728 , 026 , 026 , 026 ,
729 , 026 , 026 , 026 ,
730 , 026 , 026 , 026 ,
731 , 026 , 026 , 026 ,
732 , 026 , 026 , 026 ,
733 , 026 , 026 , 026 ,
734 , 059 , 059 , 059 ,
735 , 059 , 059 , 059 ,
736 , 059 , 059 , 059 ,
737 , 122 , 122 , 122 ,
738 , 069 , 091 , 104 ,
739 , 125 , 125 , 161 ,
740 , 032 , 032 , 032 ,
741 , 163 , 163 , 163 ,
742 , 164 , 164 , 164 ,
743 , 154 , 154 , 154 ,
744 , 144 , 144 , 144 ,
745 , 010 , 010 , 010 ,
746 , 022 , 022 , 022 ,
747 , 023 , 023 , 023 ,
748 , 051 , 151 , 172 ,
749 , 169 , 169 , 169 ,
750 , 169 , 169 , 169 ,
751 , 169 , 169 , 169 ,
752 , 169 , 169 , 169 ,
753 , 169 , 169 , 169 ,
754 , 169 , 169 , 169 ,
755 , 169 , 169 , 169 ,
756 , 169 , 169 , 169 ,
757 , 169 , 169 , 169 ,
758 , 182 , 182 , 182 ,
759 , 104 , 104 , 104 ,
760 , 047 , 047 , 047 ,
761 , 181 , 181 , 181 ,
762 , 070 , 070 , 070 ,
763 , 080 , 080 , 080 ,
764 , 015 , 015 , 015 ,
765 , 003 , 003 , 003 ,
766 , 074 , 074 , 074 ,
767 , 094 , 094 , 094 ,
768 , 111 , 111 , 111 ,
769 , 158 , 158 , 158 ,
770 , 045 , 045 , 045 ,
771 , 101 , 101 , 101 ,
772 , 184 , 184 , 184 ,
773 , 181 , 181 , 181 ,
774 , 091 , 091 , 091 ,
775 , 117 , 117 , 117 ,
776 , 176 , 176 , 176 ,
777 , 178 , 178 , 178 ,
778 , 185 , 185 , 185 ,
779 , 104 , 104 , 104 ,
780 , 156 , 156 , 156 ,
781 , 036 , 036 , 036 ,
782 , 092 , 092 , 092 ,
783 , 037 , 037 , 037 ,
784 , 022 , 022 , 022 ,
785 , 159 , 159 , 159 ,
786 , 026 , 026 , 026 ,
787 , 026 , 026 , 026 ,
788 , 053 , 119 , 015 ,
789 , 053 , 119 , 015 ,
790 , 053 , 119 , 015 ,
791 , 053 , 119 , 015 ,
792 , 053 , 119 , 015 ,
793 , 053 , 119 , 015 ,
794 , 166 , 166 , 180 ,
795 , 166 , 166 , 180 ,
796 , 166 , 166 , 180 ,
797 , 166 , 166 , 180 ,
2014-11-15 05:02:34 +00:00
798 , 166 , 166 , 180 ,
799 , 033 , 033 , 033 ,
800 , 031 , 031 , 031 ,
801 , 156 , 156 , 156 ,
802 , 182 , 182 , 182 ,
803 , 039 , 039 , 039 ,
804 , 131 , 131 , 131 ,
805 , 173 , 173 , 173 ,
806 , 075 , 075 , 075 ,
807 , 159 , 159 , 159 ,
808 , 099 , 099 , 099 ,
809 , 174 , 174 , 174 ,
810 , 156 , 156 , 156 ,
811 , 181 , 181 , 181 ,
812 , 189 , 189 , 189 ,
813 , 190 , 190 , 190 ,
814 , 191 , 191 , 191 ,
815 , 009 , 009 , 031 ,
816 , 009 , 009 , 031 ,
817 , 009 , 009 , 031 ,
818 , 009 , 009 , 031 ,
819 , 009 , 009 , 031 ,
820 , 009 , 009 , 031 ,
821 , 170 , 170 , 170 ,
822 , 125 , 125 , 125 ,
823 , 113 , 113 , 113 ,
824 , 184 , 184 , 184 ,
825 , 091 , 091 , 091 ,
2014-06-28 21:22:05 +00:00
} ;
#endregion
}
{
#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 }
} ;
var subreg_list = new [ ] {
new { Text = "sr_0" , Value = 0 } ,
new { Text = "sr_1" , Value = 1 } ,
new { Text = "sr_2" , Value = 2 } ,
new { Text = "sr_3" , Value = 3 } ,
new { Text = "sr_4" , Value = 4 } ,
new { Text = "sr_5" , Value = 5 } ,
new { Text = "sr_6" , Value = 6 } ,
new { Text = "sr_7" , Value = 7 } ,
new { Text = "sr_8" , Value = 8 } ,
new { Text = "sr_9" , Value = 9 } ,
new { Text = "sr_10" , Value = 10 } ,
new { Text = "sr_11" , Value = 11 } ,
new { Text = "sr_12" , Value = 12 } ,
new { Text = "sr_13" , Value = 13 } ,
new { Text = "sr_14" , Value = 14 } ,
new { Text = "sr_15" , Value = 15 } ,
new { Text = "sr_16" , Value = 16 } ,
new { Text = "sr_17" , Value = 17 } ,
new { Text = "sr_18" , Value = 18 } ,
new { Text = "sr_19" , Value = 19 } ,
new { Text = "sr_20" , Value = 20 } ,
new { Text = "sr_21" , Value = 21 } ,
new { Text = "sr_22" , Value = 22 } ,
new { Text = "sr_23" , Value = 23 } ,
new { Text = "sr_24" , Value = 24 } ,
new { Text = "sr_25" , Value = 25 } ,
new { Text = "sr_26" , Value = 26 } ,
new { Text = "sr_27" , Value = 27 } ,
new { Text = "sr_28" , Value = 28 } ,
new { Text = "sr_29" , Value = 29 } ,
new { Text = "sr_30" , Value = 30 } ,
new { Text = "sr_31" , Value = 31 } ,
new { Text = "sr_32" , Value = 32 } ,
new { Text = "sr_33" , Value = 33 } ,
new { Text = "sr_34" , Value = 34 } ,
new { Text = "sr_35" , Value = 35 } ,
new { Text = "sr_36" , Value = 36 } ,
new { Text = "sr_37" , Value = 37 } ,
new { Text = "sr_38" , Value = 38 } ,
new { Text = "sr_39" , Value = 39 } ,
new { Text = "sr_40" , Value = 40 } ,
new { Text = "sr_41" , Value = 41 } ,
new { Text = "sr_42" , Value = 42 } ,
new { Text = "sr_43" , Value = 43 } ,
new { Text = "sr_44" , Value = 44 } ,
new { Text = "sr_45" , Value = 45 } ,
new { Text = "sr_46" , Value = 46 } ,
new { Text = "sr_47" , Value = 47 } ,
new { Text = "sr_48" , Value = 48 } ,
new { Text = "sr_49" , Value = 49 } ,
new { Text = "sr_50" , Value = 50 } ,
new { Text = "sr_51" , Value = 51 } ,
new { Text = "sr_52" , Value = 52 } ,
new { Text = "sr_53" , Value = 53 } ,
new { Text = "sr_54" , Value = 54 } ,
new { Text = "sr_55" , Value = 55 } ,
new { Text = "sr_56" , Value = 56 } ,
new { Text = "sr_57" , Value = 57 } ,
new { Text = "sr_58" , Value = 58 } ,
new { Text = "sr_59" , Value = 59 } ,
new { Text = "sr_60" , Value = 60 } ,
new { Text = "sr_61" , Value = 61 } ,
new { Text = "sr_62" , Value = 62 } ,
new { Text = "sr_63" , Value = 63 } ,
new { Text = "sr_64" , Value = 64 } ,
new { Text = "sr_65" , Value = 65 } ,
new { Text = "sr_66" , Value = 66 } ,
new { Text = "sr_67" , Value = 67 } ,
new { Text = "sr_68" , Value = 68 } ,
new { Text = "sr_69" , Value = 69 } ,
new { Text = "sr_70" , Value = 70 } ,
new { Text = "sr_71" , Value = 71 } ,
new { Text = "sr_72" , Value = 72 } ,
new { Text = "sr_73" , Value = 73 } ,
new { Text = "sr_74" , Value = 74 } ,
new { Text = "sr_75" , Value = 75 } ,
new { Text = "sr_76" , Value = 76 } ,
new { Text = "sr_77" , Value = 77 } ,
new { Text = "sr_78" , Value = 78 } ,
new { Text = "sr_79" , Value = 79 } ,
new { Text = "sr_80" , Value = 80 } ,
} ;
#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-10-11 07:22:22 +00:00
setCountry ( CB_Country ) ;
2014-06-28 21:22:05 +00:00
CB_SubRegion . DataSource = subreg_list ;
CB_SubRegion . DisplayMember = "Text" ;
CB_SubRegion . ValueMember = "Value" ;
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 ( )
{
#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-07-20 05:10:46 +00:00
// ID // EN // JP // FR // IT // DE // ES // KO
2014-11-21 23:34:10 +00:00
"27" , "OR" , "OR" , "OR" , "OR" , "OR" , "OR" , "OR" ,
"26" , "AS" , "AS" , "AS" , "AS" , "AS" , "AS" , "AS" ,
2014-06-28 21:22:05 +00:00
"24" , "X" , "X" , "X" , "X" , "X" , "X" , "X" ,
"25" , "Y" , "Y" , "Y" , "Y" , "Y" , "Y" , "Y" ,
"20" , "White" , "ホワイト" , "Blanche" , "Bianca" , "Weiße" , "Blanca" , "화이트" ,
"21" , "Black" , "ブラック" , "Noire" , "Nera" , "Schwarze" , "Negra" , "블랙" ,
2014-07-20 05:10:46 +00:00
"22" , "White2" , "ホワイト2" , "Blanche 2" , "Bianca2" , "Weiße2" , "Blanca2" , "화이트2" ,
"23" , "Black2" , "ブラック2" , "Noire 2" , "Nera2" , "Schwarze2" , "Negra2" , "블랙2" ,
2014-06-28 21:22:05 +00:00
"10" , "Diamond" , "ダイヤモンド" , "Diamant" , "Diamante" , "Diamant" , "Diamante" , "디아루가" ,
"11" , "Pearl" , "パール" , "Perle" , "Perla" , "Perl" , "Perla" , "펄기아" ,
"12" , "Platinum" , "プラチナ" , "Platine" , "Platino" , "Platin" , "Platino" , "Pt 기라티나" ,
2014-07-20 05:10:46 +00:00
"7" , "HeartGold" , "ハートゴールド" , "Or HeartGold" , "HeartGold" , "HeartGold" , "HeartGold" , "하트골드" ,
"8" , "SoulSilver" , "ソウルシルバー " , "Argent SoulSilver" , "SoulSilver" , "SoulSilver" , "SoulSilver" , "소울실버" ,
2014-06-28 21:22:05 +00:00
"2" , "Ruby" , "ルビー" , "Rubis" , "Rubino" , "Rubin" , "Rubí" , "루비" ,
"1" , "Sapphire" , "サファイア" , "Saphir" , "Zaffiro" , "Saphir" , "Zafiro" , "사파이어" ,
"3" , "Emerald" , "エメラルド" , "Émeraude" , "Smeraldo" , "Smaragd" , "Esmeralda" , "에메랄드" ,
2014-07-20 05:10:46 +00:00
"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" ,
2014-06-28 21:22:05 +00:00
} ;
// populate the list
for ( int i = 0 ; i < langlistorigin . Length / 8 ; i + + )
{
cbItem item = new cbItem ( ) ;
item . Text = langlistorigin [ i * 8 + CB_MainLanguage . SelectedIndex + 1 ] ;
item . Value = Convert . ToInt32 ( langlistorigin [ i * 8 ] ) ;
origin_list . Add ( item ) ;
}
CB_GameOrigin . DataSource = origin_list ;
CB_GameOrigin . DisplayMember = "Text" ;
CB_GameOrigin . ValueMember = "Value" ;
#endregion
}
public void TranslateInterface ( string FORM_NAME )
{
// Fetch a File
// Check to see if a the translation file exists in the same folder as the executable
string externalLangPath = System . Windows . Forms . Application . StartupPath + "\\lang_" + curlanguage + ".txt" ;
string [ ] rawlist ;
if ( File . Exists ( externalLangPath ) )
rawlist = File . ReadAllLines ( externalLangPath ) ;
else
{
object txt ;
txt = Properties . Resources . ResourceManager . GetObject ( "lang_" + curlanguage ) ; // Fetch File, \n to list.
if ( txt = = null ) return ; // Translation file does not exist as a resource; abort this function and don't translate UI.
string [ ] stringSeparators = new string [ ] { "\r\n" } ;
rawlist = ( ( string ) txt ) . Split ( stringSeparators , StringSplitOptions . None ) ;
}
string [ ] stringdata = new string [ rawlist . Length ] ;
int itemsToRename = 0 ;
for ( int i = 0 ; i < rawlist . Length ; i + + )
{
// Find our starting point
if ( rawlist [ i ] = = "! " + FORM_NAME ) // Start our data
{
// Copy our Control Names and Text to a new array for later processing.
for ( int j = i + 1 ; j < rawlist . Length ; j + + )
{
if ( rawlist [ j ] . Length = = 0 )
continue ; // Skip Over Empty Lines, errhandled
if ( rawlist [ j ] [ 0 ] . ToString ( ) ! = "-" ) // If line is not a comment line...
{
if ( rawlist [ j ] [ 0 ] . ToString ( ) = = "!" ) // Stop if we have reached the end of translation
break ; // exit inner loop
stringdata [ itemsToRename ] = rawlist [ j ] ; // Add the entry to process later.
itemsToRename + + ;
}
}
break ; // exit outer loop
}
}
// Now that we have our items to rename in: Control = Text format, let's execute the changes!
for ( int i = 0 ; i < itemsToRename ; i + + )
{
string [ ] SplitString = Regex . Split ( stringdata [ i ] , " = " ) ;
if ( SplitString . Length < 2 )
continue ; // Error in Input, errhandled
string ctrl = SplitString [ 0 ] ; // Control to change the text of...
string text = SplitString [ 1 ] ; // Text to set Control.Text to...
Control [ ] controllist = Controls . Find ( ctrl , true ) ;
if ( controllist . Length = = 0 ) // If Control isn't found...
{
// Menu Items can't be found with Controls.Find as they aren't Controls
ToolStripDropDownItem TSI = ( ToolStripDropDownItem ) menuStrip1 . Items [ ctrl ] ;
if ( TSI ! = null )
{
// We'll rename the main and child in a row.
string [ ] ToolItems = Regex . Split ( SplitString [ 1 ] , " ; " ) ;
TSI . Text = ToolItems [ 0 ] ; // Set parent's text first
if ( TSI . DropDownItems . Count ! = ToolItems . Length - 1 )
continue ; // Error in Input, errhandled
for ( int ti = 1 ; ti < = TSI . DropDownItems . Count ; ti + + )
TSI . DropDownItems [ ti - 1 ] . Text = ToolItems [ ti ] ; // Set child text
}
// If not found, it is not something to rename and is thus skipped.
}
else // Set the input control's text.
controllist [ 0 ] . Text = text ;
}
}
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 ) )
{
Label_OTGender . Text = "♀" ;
}
else Label_OTGender . Text = "♂" ;
// 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
{
CAL_MetDate . Value = new DateTime ( met_year + 2000 , met_month , met_day ) ;
}
catch { CAL_MetDate . Value = new DateTime ( 2000 , 1 , 1 ) ; }
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
{
CAL_EggDate . Value = new DateTime ( egg_year + 2000 , egg_month , egg_day ) ;
}
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 ;
if ( notOTG ) Label_CTGender . Text = "♀" ;
else Label_CTGender . Text = "♂" ;
if ( TB_OTt2 . Text = = "" ) Label_CTGender . Text = "" ;
2014-09-23 04:05:27 +00:00
//if (CHK_IsEgg.Checked)
//{
// CB_MetLocation.Enabled = false;
// CAL_MetDate.Enabled = false;
//}
//else
//{
// CB_MetLocation.Enabled = true;
// CAL_MetDate.Enabled = true;
//}
2014-06-28 21:22:05 +00:00
// reset
CHK_Cured . Checked = false ;
CHK_Infected . Checked = false ;
TB_MetLevel . Text = metlevel . ToString ( ) ;
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
{
CB_Form . SelectedIndex = altforms ;
}
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 = "" ;
}
// 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 )
{
uint chk = 0 ;
for ( int i = 8 ; i < 232 ; i + = 2 ) // Loop through the entire PKX
chk + = ( uint ) ( buff [ i ] + buff [ i + 1 ] * 0x100 ) ;
chk & = 0xFFFF ;
ushort actualsum = BitConverter . ToUInt16 ( buff , 0x6 ) ;
if ( chk ! = actualsum )
MessageBox . Show ( "PKX File has an invalid checksum." , "Alert" ) ;
}
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 [ ] {
new { Text = "♂" , Value = 0 } , // Male
new { Text = "♀" , Value = 1 } , // Female
} ;
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
new { Text = forms [ 830 ] , Value = 1 } , // Resolute
} ;
var form_meloetta = new [ ] {
new { Text = forms [ 648 ] , Value = 0 } , // Aria
new { Text = forms [ 831 ] , Value = 1 } , // Pirouette
} ;
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 )
{
// Gender = Male
Label_Gender . Text = "♂" ;
}
else if ( genderflag = = 1 )
{
// Gender = Female
Label_Gender . Text = "♀" ;
}
else { Label_Gender . Text = "-" ; }
}
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 ) ;
PB_MarkPentagon . Image = Util . ChangeOpacity ( PB_MarkPentagon . InitialImage , ( float ) ( Convert . ToUInt16 ( Util . getIndex ( CB_GameOrigin ) = = 24 | | Util . getIndex ( CB_GameOrigin ) = = 25 ) ) * 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 ) ;
DataTable spectable = PKX . SpeciesTable ( ) ;
2014-06-28 21:22:05 +00:00
gt = ( int ) spectable . Rows [ species ] [ 8 ] ;
if ( gt > 255 ) // Single gender/genderless
return ;
if ( gt < 256 ) // If not a single gender(less) species:
{
if ( Label_Gender . Text = = "♂" )
Label_Gender . Text = "♀" ;
else
Label_Gender . Text = "♂" ;
}
}
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 )
Label_OTGender . Text = "♀" ;
else Label_OTGender . Text = "♂" ;
// 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 )
Label_CTGender . Text = "♀" ;
else Label_CTGender . Text = "♂" ;
}
}
2014-10-11 07:22:22 +00:00
private void Label_OTGender_Click ( object sender , EventArgs e )
{
if ( Label_OTGender . Text = = "♂" )
Label_OTGender . Text = "♀" ;
else Label_OTGender . Text = "♂" ;
}
private void Label_CTGender_Click ( object sender , EventArgs e )
{
if ( Label_CTGender . Text = = "" ) return ;
else if ( Label_CTGender . Text = = "♂" )
Label_CTGender . Text = "♀" ;
else Label_CTGender . Text = "♂" ;
}
2014-06-28 21:22:05 +00:00
// Prompted Updates of PKX Functions //
2014-10-11 07:22:22 +00:00
public void setCountry ( object sender )
2014-06-28 21:22:05 +00:00
{
#region country table
var country_list = new [ ] {
new { Text = "---" , Value = 0 } ,
new { Text = "Albania" , Value = 64 } ,
new { Text = "Andorra" , Value = 122 } ,
new { Text = "Anguilla" , Value = 8 } ,
new { Text = "Antigua and Barbuda" , Value = 9 } ,
new { Text = "Argentina" , Value = 10 } ,
new { Text = "Aruba" , Value = 11 } ,
new { Text = "Australia" , Value = 65 } ,
new { Text = "Austria" , Value = 66 } ,
new { Text = "Azerbaijan" , Value = 113 } ,
new { Text = "Bahamas" , Value = 12 } ,
new { Text = "Barbados" , Value = 13 } ,
new { Text = "Belgium" , Value = 67 } ,
new { Text = "Belize" , Value = 14 } ,
new { Text = "Bermuda" , Value = 186 } ,
new { Text = "Bolivia" , Value = 15 } ,
new { Text = "Bosnia and Herzegovina" , Value = 68 } ,
new { Text = "Botswana" , Value = 69 } ,
new { Text = "Brazil" , Value = 16 } ,
new { Text = "British Virgin Islands" , Value = 17 } ,
new { Text = "Bulgaria" , Value = 70 } ,
new { Text = "Canada" , Value = 18 } ,
new { Text = "Cayman Islands" , Value = 19 } ,
new { Text = "Chad" , Value = 117 } ,
new { Text = "Chile" , Value = 20 } ,
new { Text = "China" , Value = 160 } ,
new { Text = "Colombia" , Value = 21 } ,
new { Text = "Costa Rica" , Value = 22 } ,
new { Text = "Croatia" , Value = 71 } ,
new { Text = "Cyprus" , Value = 72 } ,
new { Text = "Czech Republic" , Value = 73 } ,
new { Text = "Denmark (Kingdom of)" , Value = 74 } ,
new { Text = "Djibouti" , Value = 120 } ,
new { Text = "Dominica" , Value = 23 } ,
new { Text = "Dominican Republic" , Value = 24 } ,
new { Text = "Ecuador" , Value = 25 } ,
new { Text = "El Salvador" , Value = 26 } ,
new { Text = "Eritrea" , Value = 119 } ,
new { Text = "Estonia" , Value = 75 } ,
new { Text = "Finland" , Value = 76 } ,
new { Text = "France" , Value = 77 } ,
new { Text = "French Guiana" , Value = 27 } ,
new { Text = "Germany" , Value = 78 } ,
new { Text = "Gibraltar" , Value = 123 } ,
new { Text = "Greece" , Value = 79 } ,
new { Text = "Grenada" , Value = 28 } ,
new { Text = "Guadeloupe" , Value = 29 } ,
new { Text = "Guatemala" , Value = 30 } ,
new { Text = "Guernsey" , Value = 124 } ,
new { Text = "Guyana" , Value = 31 } ,
new { Text = "Haiti" , Value = 32 } ,
new { Text = "Honduras" , Value = 33 } ,
new { Text = "Hong Kong" , Value = 144 } ,
new { Text = "Hungary" , Value = 80 } ,
new { Text = "Iceland" , Value = 81 } ,
new { Text = "India" , Value = 169 } ,
new { Text = "Ireland" , Value = 82 } ,
new { Text = "Isle of Man" , Value = 125 } ,
new { Text = "Italy" , Value = 83 } ,
new { Text = "Jamaica" , Value = 34 } ,
new { Text = "Japan" , Value = 1 } ,
new { Text = "Jersey" , Value = 126 } ,
new { Text = "Latvia" , Value = 84 } ,
new { Text = "Lesotho" , Value = 85 } ,
new { Text = "Liechtenstein" , Value = 86 } ,
new { Text = "Lithuania" , Value = 87 } ,
new { Text = "Luxembourg" , Value = 88 } ,
new { Text = "Macedonia (Republic of)" , Value = 89 } ,
new { Text = "Malaysia" , Value = 156 } ,
new { Text = "Mali" , Value = 115 } ,
new { Text = "Malta" , Value = 90 } ,
new { Text = "Martinique" , Value = 35 } ,
new { Text = "Mauritania" , Value = 114 } ,
new { Text = "Mexico" , Value = 36 } ,
new { Text = "Monaco" , Value = 127 } ,
new { Text = "Montenegro" , Value = 91 } ,
new { Text = "Montserrat" , Value = 37 } ,
new { Text = "Mozambique" , Value = 92 } ,
new { Text = "Namibia" , Value = 93 } ,
new { Text = "Netherlands" , Value = 94 } ,
new { Text = "Netherlands Antilles" , Value = 38 } ,
new { Text = "New Zealand" , Value = 95 } ,
new { Text = "Nicaragua" , Value = 39 } ,
new { Text = "Niger" , Value = 116 } ,
new { Text = "Norway" , Value = 96 } ,
new { Text = "Panama" , Value = 40 } ,
new { Text = "Paraguay" , Value = 41 } ,
new { Text = "Peru" , Value = 42 } ,
new { Text = "Poland" , Value = 97 } ,
new { Text = "Portugal" , Value = 98 } ,
new { Text = "Romania" , Value = 99 } ,
new { Text = "Russia" , Value = 100 } ,
new { Text = "San Marino" , Value = 184 } ,
new { Text = "Saudi Arabia" , Value = 174 } ,
new { Text = "Serbia and Kosovo" , Value = 101 } ,
new { Text = "Singapore" , Value = 153 } ,
new { Text = "Slovakia" , Value = 102 } ,
new { Text = "Slovenia" , Value = 103 } ,
new { Text = "Somalia" , Value = 121 } ,
new { Text = "South Africa" , Value = 104 } ,
new { Text = "South Korea" , Value = 136 } ,
new { Text = "Spain" , Value = 105 } ,
new { Text = "St. Kitts and Nevis" , Value = 43 } ,
new { Text = "St. Lucia" , Value = 44 } ,
new { Text = "St. Vincent and the Grenadines" , Value = 45 } ,
new { Text = "Sudan" , Value = 118 } ,
new { Text = "Suriname" , Value = 46 } ,
new { Text = "Swaziland" , Value = 106 } ,
new { Text = "Sweden" , Value = 107 } ,
new { Text = "Switzerland" , Value = 108 } ,
new { Text = "Taiwan" , Value = 128 } ,
new { Text = "Trinidad and Tobago" , Value = 47 } ,
new { Text = "Turkey" , Value = 109 } ,
new { Text = "Turks and Caicos Islands" , Value = 48 } ,
new { Text = "U.A.E." , Value = 168 } ,
new { Text = "United Kingdom" , Value = 110 } ,
new { Text = "United States" , Value = 49 } ,
new { Text = "Uruguay" , Value = 50 } ,
new { Text = "US Virgin Islands" , Value = 51 } ,
new { Text = "Vatican City" , Value = 185 } ,
new { Text = "Venezuela" , Value = 52 } ,
new { Text = "Zambia" , Value = 111 } ,
new { Text = "Zimbabwe" , Value = 112 } ,
} ;
#endregion
ComboBox CB = sender as ComboBox ;
CB . DataSource = country_list ;
CB . DisplayMember = "Text" ;
CB . ValueMember = "Value" ;
}
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
{
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 } ;
bool exitfunction = false ;
for ( int i = 0 ; i < 6 ; i + + )
{
if ( iva [ i ] > 31 )
{
ivt [ i ] . BackColor = Color . Red ;
exitfunction = true ;
}
else ivt [ i ] . BackColor = Color . White ;
}
if ( exitfunction ) return ;
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
if ( ivtotal < = 90 )
L_Potential . Text = "★☆☆☆" ;
else if ( ivtotal < = 120 )
L_Potential . Text = "★★☆☆" ;
else if ( ivtotal < = 150 )
L_Potential . Text = "★★★☆" ;
else
L_Potential . Text = "★★★★" ;
// 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
{
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
int [ ] iva = new int [ ] { HP_EV , ATK_EV , DEF_EV , SPA_EV , SPD_EV , SPE_EV } ;
MaskedTextBox [ ] ivt = { TB_HPEV , TB_ATKEV , TB_DEFEV , TB_SPAEV , TB_SPDEV , TB_SPEEV } ;
for ( int i = 0 ; i < 6 ; i + + ) // if illegal, mark the box as illegal
{
if ( iva [ i ] > 252 )
ivt [ i ] . BackColor = Color . Red ;
else ivt [ i ] . BackColor = Color . White ;
}
2014-11-15 05:08:00 +00:00
2014-06-28 21:22:05 +00:00
for ( int i = 0 ; i < 6 ; i + + ) // if totally illegal, don't continue.
if ( iva [ i ] > 255 )
return ;
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 ( ) ;
return ;
}
2014-10-10 02:59:57 +00:00
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 ;
}
MaskedTextBox [ ] tbEV = { TB_HPEV , TB_ATKEV , TB_DEFEV , TB_SPAEV , TB_SPDEV , TB_SPEEV } ;
2014-10-11 07:22:22 +00:00
MaskedTextBox [ ] slEV = Util . shuffle ( ( MaskedTextBox [ ] ) tbEV . Clone ( ) ) ; // Shuffle List
2014-06-28 21:22:05 +00:00
2014-10-10 02:59:57 +00:00
uint e1 = Math . Min ( Util . rnd32 ( ) % 300 , 252 ) ; // bias two to get maybe 252
uint e2 = Math . Min ( Util . rnd32 ( ) % 300 , 252 ) ;
2014-06-28 21:22:05 +00:00
2014-10-10 02:59:57 +00:00
uint e3 = Math . Min ( ( ( Util . rnd32 ( ) ) % ( 510 - e1 - e2 ) ) , 252 ) ;
uint e4 = Math . Min ( ( ( Util . rnd32 ( ) ) % ( 510 - e1 - e2 - e3 ) ) , 252 ) ;
uint e5 = Math . Min ( ( ( Util . rnd32 ( ) ) % ( 510 - e1 - e2 - e3 - e4 ) ) , 252 ) ;
2014-06-28 21:22:05 +00:00
uint e6 = Math . Min ( ( 510 - e1 - e2 - e3 - e4 - e5 ) , 252 ) ;
if ( e1 + e2 + e3 + e4 + e5 + e6 < 510 )
{
updateRandomEVs ( sender , e ) ;
return ;
}
slEV [ 0 ] . Text = e1 . ToString ( ) ;
slEV [ 1 ] . Text = e2 . ToString ( ) ;
slEV [ 2 ] . Text = e3 . ToString ( ) ;
slEV [ 3 ] . Text = e4 . ToString ( ) ;
slEV [ 4 ] . Text = e5 . ToString ( ) ;
slEV [ 5 ] . Text = e6 . ToString ( ) ;
}
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-10-10 02:59:57 +00:00
int val = Util . ToInt32 ( mtb . Text ) ;
2014-08-15 22:28:33 +00:00
if ( val > 255 ) mtb . Text = "255" ;
}
catch { mtb . Text = "0" ; }
}
private void update255_TB ( object sender , EventArgs e )
{
TextBox tb = sender as TextBox ;
try
{
2014-10-10 02:59:57 +00:00
int val = Util . ToInt32 ( tb . Text ) ;
2014-08-15 22:28:33 +00:00
if ( val > 255 ) tb . Text = "255" ;
}
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.
if ( CB_Form . Text = = "♂" )
Label_Gender . Text = "♂" ;
else if ( CB_Form . Text = = "♀" )
Label_Gender . Text = "♀" ;
}
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 ) ;
DataTable spectable = PKX . SpeciesTable ( ) ;
2014-06-28 21:22:05 +00:00
gt = ( int ) spectable . Rows [ species ] [ 8 ] ;
2014-10-11 07:22:22 +00:00
if ( gt = = 258 ) // Genderless
2014-06-28 21:22:05 +00:00
genderflag = 2 ;
else if ( gt = = 257 ) // Female Only
genderflag = 1 ;
else if ( gt = = 256 ) // Male Only
genderflag = 0 ;
else
{ // get gender from old PID correlation
2014-10-10 02:59:57 +00:00
if ( ( Util . getHEXval ( TB_PID ) & 0xFF ) < gt )
2014-06-28 21:22:05 +00:00
genderflag = 1 ;
else genderflag = 0 ;
}
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
{
cbItem CBItem_GameOrigin = ( cbItem ) CB_GameOrigin . SelectedValue ;
gameorigin = CBItem_GameOrigin . GetValue ( ) ;
}
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-08-15 22:28:33 +00:00
MaskedTextBox mtb = sender as MaskedTextBox ;
try
2014-06-28 21:22:05 +00:00
{
2014-10-10 02:59:57 +00:00
int val = Util . ToInt32 ( mtb . Text ) ;
2014-08-15 22:28:33 +00:00
if ( val > 255 ) mtb . Text = "255" ;
2014-06-28 21:22:05 +00:00
}
2014-08-15 22:28:33 +00:00
catch { mtb . Text = "0" ; }
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-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 = = "" )
Label_CTGender . Text = "♂" ;
}
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 ;
// Disable
2014-09-23 04:05:27 +00:00
// CB_MetLocation.Enabled = !CHK_IsEgg.Checked;
// CAL_MetDate.Enabled = !CHK_IsEgg.Checked;
2014-06-28 21:22:05 +00:00
}
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
}
private void updateTIDSID ( object sender , EventArgs e )
{
// 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-10-10 02:59:57 +00:00
if ( Util . ToUInt32 ( TB_TID . Text ) > 0xFFFF )
2014-07-24 17:28:24 +00:00
TB_TID . Text = TB_TID . Text . Remove ( TB_TID . Text . Length - 1 ) ;
2014-10-10 02:59:57 +00:00
if ( Util . ToUInt32 ( TB_TID . Text ) > 0xFFFF )
2014-07-24 17:28:24 +00:00
TB_SID . Text = TB_SID . Text . Remove ( TB_SID . Text . Length - 1 ) ;
2014-06-28 21:22:05 +00:00
2014-10-10 02:59:57 +00:00
setIsShiny ( ) ;
2014-08-15 22:28:33 +00:00
updateIVs ( sender , e ) ; // 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 )
updateAbilityNumber ( ) ;
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 ( )
{
// First verify that our input stats are valid.
MaskedTextBox [ ] mbIV = new MaskedTextBox [ ] {
TB_HPIV , TB_ATKIV , TB_DEFIV , TB_SPAIV , TB_SPDIV , TB_SPEIV ,
} ;
MaskedTextBox [ ] mbEV = new MaskedTextBox [ ] {
TB_HPEV , TB_ATKEV , TB_DEFEV , TB_SPAEV , TB_SPDEV , TB_SPEEV ,
} ;
for ( int i = 0 ; i < 6 ; i + + )
2014-08-17 01:42:51 +00:00
if (
2014-10-10 02:59:57 +00:00
Util . ToInt32 ( mbIV [ i ] . Text ) > 31
| | ( Util . ToInt32 ( mbEV [ i ] . Text ) > 252 & & ! CHK_HackedStats . Checked )
| | ( CHK_HackedStats . Checked & & Util . ToInt32 ( mbEV [ i ] . Text ) > 255 )
2014-08-17 01:42:51 +00:00
)
2014-06-28 21:22:05 +00:00
return ; // if anything is illegal, don't calc stats.
// EVs and IVs are valid, continue to generate the stats.
2014-10-10 02:59:57 +00:00
species = Util . getIndex ( CB_Species ) ;
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-10-10 02:59:57 +00:00
DataTable spectable = PKX . SpeciesTable ( ) ;
int HP_IV = Util . ToInt32 ( TB_HPIV . Text ) ;
int ATK_IV = Util . ToInt32 ( TB_ATKIV . Text ) ;
int DEF_IV = Util . ToInt32 ( TB_DEFIV . Text ) ;
int SPA_IV = Util . ToInt32 ( TB_SPAIV . Text ) ;
int SPD_IV = Util . ToInt32 ( TB_SPDIV . Text ) ;
int SPE_IV = Util . ToInt32 ( TB_SPEIV . Text ) ;
int HP_EV = Util . ToInt32 ( TB_HPEV . Text ) ;
int ATK_EV = Util . ToInt32 ( TB_ATKEV . Text ) ;
int DEF_EV = Util . ToInt32 ( TB_DEFEV . Text ) ;
int SPA_EV = Util . ToInt32 ( TB_SPAEV . Text ) ;
int SPD_EV = Util . ToInt32 ( TB_SPDEV . Text ) ;
int SPE_EV = Util . ToInt32 ( TB_SPEEV . Text ) ;
2014-06-28 21:22:05 +00:00
int HP_B = ( int ) spectable . Rows [ species ] [ 2 ] ;
int ATK_B = ( int ) spectable . Rows [ species ] [ 3 ] ;
int DEF_B = ( int ) spectable . Rows [ species ] [ 4 ] ;
int SPA_B = ( int ) spectable . Rows [ species ] [ 5 ] ;
int SPD_B = ( int ) spectable . Rows [ species ] [ 6 ] ;
int SPE_B = ( int ) spectable . Rows [ species ] [ 7 ] ;
int form = CB_Form . SelectedIndex ;
// Form Stat Recalculation
if ( form ! = 0 )
{
if ( ( form = = 1 ) & & ( species = = 3 ) ) { HP_B = 80 ; ATK_B = 100 ; DEF_B = 123 ; SPA_B = 122 ; SPD_B = 120 ; SPE_B = 80 ; }
else if ( ( form = = 1 ) & & ( species = = 6 ) ) { HP_B = 78 ; ATK_B = 130 ; DEF_B = 111 ; SPA_B = 130 ; SPD_B = 85 ; SPE_B = 100 ; }
else if ( ( form = = 2 ) & & ( species = = 6 ) ) { HP_B = 78 ; ATK_B = 104 ; DEF_B = 78 ; SPA_B = 159 ; SPD_B = 115 ; SPE_B = 100 ; }
else if ( ( form = = 1 ) & & ( species = = 9 ) ) { HP_B = 79 ; ATK_B = 103 ; DEF_B = 120 ; SPA_B = 135 ; SPD_B = 115 ; SPE_B = 78 ; }
else if ( ( form = = 1 ) & & ( species = = 65 ) ) { HP_B = 55 ; ATK_B = 50 ; DEF_B = 65 ; SPA_B = 175 ; SPD_B = 95 ; SPE_B = 150 ; }
else if ( ( form = = 1 ) & & ( species = = 94 ) ) { HP_B = 60 ; ATK_B = 65 ; DEF_B = 80 ; SPA_B = 170 ; SPD_B = 95 ; SPE_B = 130 ; }
else if ( ( form = = 1 ) & & ( species = = 115 ) ) { HP_B = 105 ; ATK_B = 125 ; DEF_B = 100 ; SPA_B = 60 ; SPD_B = 100 ; SPE_B = 100 ; }
else if ( ( form = = 1 ) & & ( species = = 127 ) ) { HP_B = 65 ; ATK_B = 155 ; DEF_B = 120 ; SPA_B = 65 ; SPD_B = 90 ; SPE_B = 105 ; }
else if ( ( form = = 1 ) & & ( species = = 130 ) ) { HP_B = 95 ; ATK_B = 155 ; DEF_B = 109 ; SPA_B = 70 ; SPD_B = 130 ; SPE_B = 81 ; }
else if ( ( form = = 1 ) & & ( species = = 142 ) ) { HP_B = 80 ; ATK_B = 135 ; DEF_B = 85 ; SPA_B = 70 ; SPD_B = 95 ; SPE_B = 150 ; }
else if ( ( form = = 1 ) & & ( species = = 150 ) ) { HP_B = 106 ; ATK_B = 190 ; DEF_B = 100 ; SPA_B = 154 ; SPD_B = 100 ; SPE_B = 130 ; }
else if ( ( form = = 2 ) & & ( species = = 150 ) ) { HP_B = 106 ; ATK_B = 150 ; DEF_B = 70 ; SPA_B = 194 ; SPD_B = 120 ; SPE_B = 140 ; }
else if ( ( form = = 1 ) & & ( species = = 181 ) ) { HP_B = 90 ; ATK_B = 95 ; DEF_B = 105 ; SPA_B = 165 ; SPD_B = 110 ; SPE_B = 45 ; }
else if ( ( form = = 1 ) & & ( species = = 212 ) ) { HP_B = 70 ; ATK_B = 150 ; DEF_B = 140 ; SPA_B = 65 ; SPD_B = 100 ; SPE_B = 75 ; }
else if ( ( form = = 1 ) & & ( species = = 214 ) ) { HP_B = 80 ; ATK_B = 185 ; DEF_B = 115 ; SPA_B = 40 ; SPD_B = 105 ; SPE_B = 75 ; }
else if ( ( form = = 1 ) & & ( species = = 229 ) ) { HP_B = 75 ; ATK_B = 90 ; DEF_B = 90 ; SPA_B = 140 ; SPD_B = 90 ; SPE_B = 115 ; }
else if ( ( form = = 1 ) & & ( species = = 248 ) ) { HP_B = 100 ; ATK_B = 164 ; DEF_B = 150 ; SPA_B = 95 ; SPD_B = 120 ; SPE_B = 71 ; }
else if ( ( form = = 1 ) & & ( species = = 257 ) ) { HP_B = 80 ; ATK_B = 160 ; DEF_B = 80 ; SPA_B = 130 ; SPD_B = 80 ; SPE_B = 100 ; }
else if ( ( form = = 1 ) & & ( species = = 282 ) ) { HP_B = 68 ; ATK_B = 85 ; DEF_B = 65 ; SPA_B = 165 ; SPD_B = 135 ; SPE_B = 100 ; }
else if ( ( form = = 1 ) & & ( species = = 303 ) ) { HP_B = 50 ; ATK_B = 105 ; DEF_B = 125 ; SPA_B = 55 ; SPD_B = 95 ; SPE_B = 50 ; }
else if ( ( form = = 1 ) & & ( species = = 306 ) ) { HP_B = 70 ; ATK_B = 140 ; DEF_B = 230 ; SPA_B = 60 ; SPD_B = 80 ; SPE_B = 50 ; }
else if ( ( form = = 1 ) & & ( species = = 308 ) ) { HP_B = 60 ; ATK_B = 100 ; DEF_B = 85 ; SPA_B = 80 ; SPD_B = 85 ; SPE_B = 100 ; }
else if ( ( form = = 1 ) & & ( species = = 310 ) ) { HP_B = 70 ; ATK_B = 75 ; DEF_B = 80 ; SPA_B = 135 ; SPD_B = 80 ; SPE_B = 135 ; }
else if ( ( form = = 1 ) & & ( species = = 354 ) ) { HP_B = 64 ; ATK_B = 165 ; DEF_B = 75 ; SPA_B = 93 ; SPD_B = 83 ; SPE_B = 75 ; }
else if ( ( form = = 1 ) & & ( species = = 359 ) ) { HP_B = 65 ; ATK_B = 150 ; DEF_B = 60 ; SPA_B = 115 ; SPD_B = 60 ; SPE_B = 115 ; }
else if ( ( form = = 1 ) & & ( species = = 380 ) ) { HP_B = 80 ; ATK_B = 100 ; DEF_B = 120 ; SPA_B = 140 ; SPD_B = 150 ; SPE_B = 110 ; }
else if ( ( form = = 1 ) & & ( species = = 381 ) ) { HP_B = 80 ; ATK_B = 130 ; DEF_B = 100 ; SPA_B = 160 ; SPD_B = 120 ; SPE_B = 110 ; }
else if ( ( form = = 1 ) & & ( species = = 386 ) ) { HP_B = 50 ; ATK_B = 180 ; DEF_B = 20 ; SPA_B = 180 ; SPD_B = 20 ; SPE_B = 150 ; }
else if ( ( form = = 2 ) & & ( species = = 386 ) ) { HP_B = 50 ; ATK_B = 70 ; DEF_B = 160 ; SPA_B = 70 ; SPD_B = 160 ; SPE_B = 90 ; }
else if ( ( form = = 3 ) & & ( species = = 386 ) ) { HP_B = 50 ; ATK_B = 95 ; DEF_B = 90 ; SPA_B = 95 ; SPD_B = 90 ; SPE_B = 180 ; }
else if ( ( form = = 1 ) & & ( species = = 413 ) ) { HP_B = 60 ; ATK_B = 79 ; DEF_B = 105 ; SPA_B = 59 ; SPD_B = 85 ; SPE_B = 36 ; }
else if ( ( form = = 2 ) & & ( species = = 413 ) ) { HP_B = 60 ; ATK_B = 69 ; DEF_B = 95 ; SPA_B = 69 ; SPD_B = 95 ; SPE_B = 36 ; }
else if ( ( form = = 1 ) & & ( species = = 445 ) ) { HP_B = 108 ; ATK_B = 170 ; DEF_B = 115 ; SPA_B = 120 ; SPD_B = 95 ; SPE_B = 92 ; }
else if ( ( form = = 1 ) & & ( species = = 448 ) ) { HP_B = 70 ; ATK_B = 145 ; DEF_B = 88 ; SPA_B = 140 ; SPD_B = 70 ; SPE_B = 112 ; }
else if ( ( form = = 1 ) & & ( species = = 460 ) ) { HP_B = 90 ; ATK_B = 132 ; DEF_B = 105 ; SPA_B = 132 ; SPD_B = 105 ; SPE_B = 30 ; }
else if ( ( form = = 1 ) & & ( species = = 487 ) ) { HP_B = 150 ; ATK_B = 120 ; DEF_B = 100 ; SPA_B = 120 ; SPD_B = 100 ; SPE_B = 90 ; }
else if ( ( form = = 1 ) & & ( species = = 492 ) ) { HP_B = 100 ; ATK_B = 103 ; DEF_B = 75 ; SPA_B = 120 ; SPD_B = 75 ; SPE_B = 127 ; }
else if ( ( form = = 1 ) & & ( species = = 555 ) ) { HP_B = 105 ; ATK_B = 30 ; DEF_B = 105 ; SPA_B = 140 ; SPD_B = 105 ; SPE_B = 55 ; }
else if ( ( form = = 1 ) & & ( species = = 641 ) ) { HP_B = 79 ; ATK_B = 100 ; DEF_B = 80 ; SPA_B = 110 ; SPD_B = 90 ; SPE_B = 121 ; }
else if ( ( form = = 1 ) & & ( species = = 642 ) ) { HP_B = 79 ; ATK_B = 105 ; DEF_B = 70 ; SPA_B = 145 ; SPD_B = 80 ; SPE_B = 101 ; }
else if ( ( form = = 1 ) & & ( species = = 645 ) ) { HP_B = 89 ; ATK_B = 145 ; DEF_B = 90 ; SPA_B = 105 ; SPD_B = 80 ; SPE_B = 91 ; }
else if ( ( form = = 1 ) & & ( species = = 646 ) ) { HP_B = 125 ; ATK_B = 170 ; DEF_B = 100 ; SPA_B = 120 ; SPD_B = 90 ; SPE_B = 95 ; }
else if ( ( form = = 2 ) & & ( species = = 646 ) ) { HP_B = 125 ; ATK_B = 120 ; DEF_B = 90 ; SPA_B = 170 ; SPD_B = 100 ; SPE_B = 95 ; }
else if ( ( form = = 1 ) & & ( species = = 648 ) ) { HP_B = 100 ; ATK_B = 128 ; DEF_B = 90 ; SPA_B = 77 ; SPD_B = 77 ; SPE_B = 128 ; }
else if ( ( form = = 5 ) & & ( species = = 670 ) ) { HP_B = 74 ; ATK_B = 65 ; DEF_B = 67 ; SPA_B = 125 ; SPD_B = 128 ; SPE_B = 92 ; }
else if ( ( form = = 1 ) & & ( species = = 681 ) ) { HP_B = 60 ; ATK_B = 150 ; DEF_B = 50 ; SPA_B = 150 ; SPD_B = 50 ; SPE_B = 60 ; }
else if ( ( form = = 1 ) & & ( species = = 710 ) ) { HP_B = 49 ; ATK_B = 66 ; DEF_B = 70 ; SPA_B = 44 ; SPD_B = 55 ; SPE_B = 51 ; }
else if ( ( form = = 2 ) & & ( species = = 710 ) ) { HP_B = 54 ; ATK_B = 66 ; DEF_B = 70 ; SPA_B = 44 ; SPD_B = 55 ; SPE_B = 46 ; }
else if ( ( form = = 3 ) & & ( species = = 710 ) ) { HP_B = 59 ; ATK_B = 66 ; DEF_B = 70 ; SPA_B = 44 ; SPD_B = 55 ; SPE_B = 41 ; }
else if ( ( form = = 1 ) & & ( species = = 711 ) ) { HP_B = 65 ; ATK_B = 90 ; DEF_B = 122 ; SPA_B = 58 ; SPD_B = 75 ; SPE_B = 84 ; }
else if ( ( form = = 2 ) & & ( species = = 711 ) ) { HP_B = 75 ; ATK_B = 95 ; DEF_B = 122 ; SPA_B = 58 ; SPD_B = 75 ; SPE_B = 69 ; }
else if ( ( form = = 3 ) & & ( species = = 711 ) ) { HP_B = 85 ; ATK_B = 100 ; DEF_B = 122 ; SPA_B = 58 ; SPD_B = 75 ; SPE_B = 54 ; }
2014-11-15 05:08:00 +00:00
// ORAS Stats
else if ( ( form = = 1 ) & & ( species = = 382 ) ) { HP_B = 100 ; ATK_B = 150 ; DEF_B = 90 ; SPA_B = 180 ; SPD_B = 160 ; SPE_B = 90 ; } // Primal Kyogre
else if ( ( form = = 1 ) & & ( species = = 383 ) ) { HP_B = 100 ; ATK_B = 180 ; DEF_B = 160 ; SPA_B = 150 ; SPD_B = 90 ; SPE_B = 90 ; } // Primal Groudon
else if ( ( form = = 1 ) & & ( species = = 720 ) ) { HP_B = 80 ; ATK_B = 160 ; DEF_B = 60 ; SPA_B = 170 ; SPD_B = 130 ; SPE_B = 80 ; } // Hoopa
else if ( ( form = = 1 ) & & ( species = = 015 ) ) { HP_B = 65 ; ATK_B = 150 ; DEF_B = 40 ; SPA_B = 15 ; SPD_B = 80 ; SPE_B = 145 ; } // Beedrill
else if ( ( form = = 1 ) & & ( species = = 018 ) ) { HP_B = 83 ; ATK_B = 80 ; DEF_B = 83 ; SPA_B = 135 ; SPD_B = 80 ; SPE_B = 121 ; } // Pidgeot
else if ( ( form = = 1 ) & & ( species = = 080 ) ) { HP_B = 95 ; ATK_B = 75 ; DEF_B = 180 ; SPA_B = 130 ; SPD_B = 80 ; SPE_B = 30 ; } // Slowbro
else if ( ( form = = 1 ) & & ( species = = 208 ) ) { HP_B = 75 ; ATK_B = 125 ; DEF_B = 230 ; SPA_B = 55 ; SPD_B = 95 ; SPE_B = 30 ; } // Steelix
else if ( ( form = = 1 ) & & ( species = = 254 ) ) { HP_B = 70 ; ATK_B = 110 ; DEF_B = 75 ; SPA_B = 145 ; SPD_B = 85 ; SPE_B = 145 ; } // Sceptile
else if ( ( form = = 1 ) & & ( species = = 260 ) ) { HP_B = 100 ; ATK_B = 150 ; DEF_B = 110 ; SPA_B = 95 ; SPD_B = 110 ; SPE_B = 70 ; } // Swampert
else if ( ( form = = 1 ) & & ( species = = 302 ) ) { HP_B = 50 ; ATK_B = 85 ; DEF_B = 125 ; SPA_B = 85 ; SPD_B = 115 ; SPE_B = 20 ; } // Sableye
else if ( ( form = = 1 ) & & ( species = = 319 ) ) { HP_B = 70 ; ATK_B = 140 ; DEF_B = 70 ; SPA_B = 110 ; SPD_B = 65 ; SPE_B = 105 ; } // Sharpedo
else if ( ( form = = 1 ) & & ( species = = 323 ) ) { HP_B = 70 ; ATK_B = 120 ; DEF_B = 100 ; SPA_B = 145 ; SPD_B = 105 ; SPE_B = 20 ; } // Camerupt
else if ( ( form = = 1 ) & & ( species = = 334 ) ) { HP_B = 75 ; ATK_B = 110 ; DEF_B = 110 ; SPA_B = 110 ; SPD_B = 105 ; SPE_B = 80 ; } // Altaria
else if ( ( form = = 1 ) & & ( species = = 362 ) ) { HP_B = 80 ; ATK_B = 120 ; DEF_B = 80 ; SPA_B = 120 ; SPD_B = 80 ; SPE_B = 100 ; } // Glalie
else if ( ( form = = 1 ) & & ( species = = 373 ) ) { HP_B = 95 ; ATK_B = 145 ; DEF_B = 130 ; SPA_B = 120 ; SPD_B = 90 ; SPE_B = 120 ; } // Salamence
else if ( ( form = = 1 ) & & ( species = = 376 ) ) { HP_B = 80 ; ATK_B = 145 ; DEF_B = 150 ; SPA_B = 105 ; SPD_B = 110 ; SPE_B = 110 ; } // Metagross
else if ( ( form = = 1 ) & & ( species = = 384 ) ) { HP_B = 105 ; ATK_B = 180 ; DEF_B = 100 ; SPA_B = 180 ; SPD_B = 100 ; SPE_B = 115 ; } // Rayquaza
else if ( ( form = = 1 ) & & ( species = = 428 ) ) { HP_B = 65 ; ATK_B = 136 ; DEF_B = 94 ; SPA_B = 54 ; SPD_B = 96 ; SPE_B = 135 ; } // Lopunny
else if ( ( form = = 1 ) & & ( species = = 475 ) ) { HP_B = 68 ; ATK_B = 165 ; DEF_B = 95 ; SPA_B = 65 ; SPD_B = 115 ; SPE_B = 110 ; } // Gallade
else if ( ( form = = 1 ) & & ( species = = 531 ) ) { HP_B = 103 ; ATK_B = 60 ; DEF_B = 126 ; SPA_B = 80 ; SPD_B = 126 ; SPE_B = 50 ; } // Audino
else if ( ( form = = 1 ) & & ( species = = 719 ) ) { HP_B = 50 ; ATK_B = 160 ; DEF_B = 110 ; SPA_B = 160 ; SPD_B = 110 ; SPE_B = 110 ; } // Diancie
// 015, 018, 080, 208, 254, 260, 302, 319, 323, 334, 362, 373, 376, 384, 428, 475, 531, 719,
2014-06-28 21:22:05 +00:00
}
// End Form Stat Recalc
2014-10-10 02:59:57 +00:00
DataTable naturetable = PKX . NatureTable ( ) ;
int nature = Util . getIndex ( CB_Nature ) ;
2014-06-28 21:22:05 +00:00
int n1 = ( int ) naturetable . Rows [ nature ] [ 1 ] ;
int n2 = ( int ) naturetable . Rows [ nature ] [ 2 ] ;
int n3 = ( int ) naturetable . Rows [ nature ] [ 4 ] ;
int n4 = ( int ) naturetable . Rows [ nature ] [ 5 ] ;
int n5 = ( int ) naturetable . Rows [ nature ] [ 3 ] ;
2014-10-11 07:22:22 +00:00
Label [ ] labarray = new Label [ ] { Label_HP , Label_ATK , Label_DEF , Label_SPE , Label_SPA , Label_SPD } ;
for ( int i = 1 ; i < 6 ; i + + )
{
int val = ( int ) naturetable . Rows [ nature ] [ i ] ;
if ( val = = 10 ) labarray [ i ] . ForeColor = DefaultForeColor ;
else if ( val = = 9 ) labarray [ i ] . ForeColor = Color . Blue ;
else if ( val = = 11 ) labarray [ i ] . ForeColor = Color . Red ;
}
2014-06-28 21:22:05 +00:00
Stat_HP . Text = ( ( ( ( HP_IV + ( 2 * HP_B ) + ( HP_EV / 4 ) + 100 ) * level ) / 100 ) + 10 ) . ToString ( ) ;
Stat_ATK . Text = ( ( ( ( ( ( ATK_IV + ( 2 * ATK_B ) + ( ATK_EV / 4 ) ) * level ) / 100 ) + 5 ) * n1 ) / 10 ) . ToString ( ) ;
Stat_DEF . Text = ( ( ( ( ( ( DEF_IV + ( 2 * DEF_B ) + ( DEF_EV / 4 ) ) * level ) / 100 ) + 5 ) * n2 ) / 10 ) . ToString ( ) ;
Stat_SPA . Text = ( ( ( ( ( ( SPA_IV + ( 2 * SPA_B ) + ( SPA_EV / 4 ) ) * level ) / 100 ) + 5 ) * n3 ) / 10 ) . ToString ( ) ;
Stat_SPD . Text = ( ( ( ( ( ( SPD_IV + ( 2 * SPD_B ) + ( SPD_EV / 4 ) ) * level ) / 100 ) + 5 ) * n4 ) / 10 ) . ToString ( ) ;
Stat_SPE . Text = ( ( ( ( ( ( SPE_IV + ( 2 * SPE_B ) + ( SPE_EV / 4 ) ) * level ) / 100 ) + 5 ) * n5 ) / 10 ) . ToString ( ) ;
}
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
int [ ] abils = { 0 , 0 , 0 } ;
//
// Alternate Forms have different abilities. We must account for them!
//
2014-11-23 22:23:40 +00:00
if ( cb_forme . SelectedIndex > 0 )
2014-06-28 21:22:05 +00:00
{
2014-11-23 22:23:40 +00:00
int formnum = cb_forme . SelectedIndex ;
2014-06-28 21:22:05 +00:00
if ( species = = 492 & & formnum = = 1 ) { species = 727 ; } // Shaymin
else if ( species = = 487 & & formnum = = 1 ) { species = 728 ; } // Giratina-O
else if ( species = = 550 & & formnum = = 1 ) { species = 738 ; } // Basculin Blue
else if ( species = = 646 & & formnum = = 1 ) { species = 741 ; } // Kyurem White
else if ( species = = 646 & & formnum = = 1 ) { species = 742 ; } // Kyurem Black
else if ( species = = 641 & & formnum = = 1 ) { species = 744 ; } // Tornadus-T
else if ( species = = 642 & & formnum = = 1 ) { species = 745 ; } // Thundurus-T
else if ( species = = 645 & & formnum = = 1 ) { species = 746 ; } // Landorus-T
else if ( species = = 678 & & formnum = = 1 ) { species = 748 ; } // MeowsticF
else if ( species = = 094 & & formnum = = 1 ) { species = 747 ; } // Mega Gengar
else if ( species = = 282 & & formnum = = 1 ) { species = 758 ; } // Mega Gardevoir
else if ( species = = 181 & & formnum = = 1 ) { species = 759 ; } // Mega Ampharos
else if ( species = = 003 & & formnum = = 1 ) { species = 760 ; } // Mega Venusaur
else if ( species = = 006 & & formnum = = 1 ) { species = 761 ; } // Mega CharizardX
else if ( species = = 006 & & formnum = = 2 ) { species = 762 ; } // Mega CharizardY
else if ( species = = 150 & & formnum = = 1 ) { species = 763 ; } // Mega MewtwoX
else if ( species = = 150 & & formnum = = 2 ) { species = 764 ; } // Mega MewtwoY
else if ( species = = 257 & & formnum = = 1 ) { species = 765 ; } // Mega Blaziken
else if ( species = = 308 & & formnum = = 1 ) { species = 766 ; } // Mega Medicham
else if ( species = = 229 & & formnum = = 1 ) { species = 767 ; } // Mega Houndoom
else if ( species = = 306 & & formnum = = 1 ) { species = 768 ; } // Mega Aggron
else if ( species = = 354 & & formnum = = 1 ) { species = 769 ; } // Mega Banette
else if ( species = = 248 & & formnum = = 1 ) { species = 770 ; } // Mega Tyranitar
else if ( species = = 212 & & formnum = = 1 ) { species = 771 ; } // Mega Scizor
else if ( species = = 127 & & formnum = = 1 ) { species = 772 ; } // Mega Pinsir
else if ( species = = 142 & & formnum = = 1 ) { species = 773 ; } // Mega Aerodactyl
else if ( species = = 448 & & formnum = = 1 ) { species = 774 ; } // Mega Lucario
else if ( species = = 460 & & formnum = = 1 ) { species = 775 ; } // Mega Abomasnow
else if ( species = = 009 & & formnum = = 1 ) { species = 777 ; } // Mega Blastoise
else if ( species = = 115 & & formnum = = 1 ) { species = 778 ; } // Mega Kangaskhan
else if ( species = = 130 & & formnum = = 1 ) { species = 779 ; } // Mega Gyarados
else if ( species = = 359 & & formnum = = 1 ) { species = 780 ; } // Mega Absol
else if ( species = = 065 & & formnum = = 1 ) { species = 781 ; } // Mega Alakazam
else if ( species = = 214 & & formnum = = 1 ) { species = 782 ; } // Mega Heracross
else if ( species = = 303 & & formnum = = 1 ) { species = 783 ; } // Mega Mawile
else if ( species = = 310 & & formnum = = 1 ) { species = 784 ; } // Mega Manectric
else if ( species = = 445 & & formnum = = 1 ) { species = 785 ; } // Mega Garchomp
else if ( species = = 381 & & formnum = = 1 ) { species = 786 ; } // Mega Latios
else if ( species = = 380 & & formnum = = 1 ) { species = 787 ; } // Mega Latias
2014-11-15 05:08:00 +00:00
// ORAS
else if ( ( formnum = = 1 ) & & ( species = = 382 ) ) { species = 812 ; } // Primal Kyogre
else if ( ( formnum = = 1 ) & & ( species = = 383 ) ) { species = 813 ; } // Primal Groudon
else if ( ( formnum = = 1 ) & & ( species = = 720 ) ) { species = 821 ; } // Hoopa
else if ( ( formnum = = 1 ) & & ( species = = 015 ) ) { species = 825 ; } // Beedrill
else if ( ( formnum = = 1 ) & & ( species = = 018 ) ) { species = 808 ; } // Pidgeot
else if ( ( formnum = = 1 ) & & ( species = = 080 ) ) { species = 806 ; } // Slowbro
else if ( ( formnum = = 1 ) & & ( species = = 208 ) ) { species = 807 ; } // Steelix
else if ( ( formnum = = 1 ) & & ( species = = 254 ) ) { species = 800 ; } // Sceptile
else if ( ( formnum = = 1 ) & & ( species = = 260 ) ) { species = 799 ; } // Swampert
else if ( ( formnum = = 1 ) & & ( species = = 302 ) ) { species = 801 ; } // Sableye
else if ( ( formnum = = 1 ) & & ( species = = 319 ) ) { species = 805 ; } // Sharpedo
else if ( ( formnum = = 1 ) & & ( species = = 323 ) ) { species = 822 ; } // Camerupt
else if ( ( formnum = = 1 ) & & ( species = = 334 ) ) { species = 802 ; } // Altaria
else if ( ( formnum = = 1 ) & & ( species = = 362 ) ) { species = 809 ; } // Glalie
else if ( ( formnum = = 1 ) & & ( species = = 373 ) ) { species = 824 ; } // Salamence
else if ( ( formnum = = 1 ) & & ( species = = 376 ) ) { species = 811 ; } // Metagross
else if ( ( formnum = = 1 ) & & ( species = = 384 ) ) { species = 814 ; } // Rayquaza
else if ( ( formnum = = 1 ) & & ( species = = 428 ) ) { species = 823 ; } // Lopunny
else if ( ( formnum = = 1 ) & & ( species = = 475 ) ) { species = 803 ; } // Gallade
else if ( ( formnum = = 1 ) & & ( species = = 531 ) ) { species = 804 ; } // Audino
else if ( ( formnum = = 1 ) & & ( species = = 719 ) ) { species = 810 ; } // Diancie
2014-06-28 21:22:05 +00:00
}
Array . Copy ( speciesability , species * 4 + 1 , abils , 0 , 3 ) ;
// 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
}
private void updateAbilityNumber ( )
{
TB_AbilityNumber . Text = ( 1 < < CB_Ability . SelectedIndex ) . ToString ( ) ;
}
// 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-08-12 23:37:26 +00:00
if ( Directory . Exists ( cyberpath + "\\root\\" ) )
2014-08-02 00:24:22 +00:00
{
2014-08-12 23:37:26 +00:00
OpenPKX . InitialDirectory = cyberpath + "\\root\\" ;
2014-08-02 00:24:22 +00:00
OpenPKX . 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
OpenPKX . InitialDirectory = cyberpath ;
2014-08-02 00:24:22 +00:00
OpenPKX . RestoreDirectory = true ;
}
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" ) )
{
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
{
string message = "Foreign File Extension. Exporting as encrypted." ;
string caption = "Error Detected in Input" ;
MessageBox . Show ( message , caption ) ;
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 ( ) ) ;
}
}
}
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.
PKHeX . About about = new PKHeX . About ( ) ;
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-06-28 21:22:05 +00:00
this . Width = newwidth ;
}
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 ) ;
try
{
2014-10-10 02:59:57 +00:00
populateFields ( buff ) ;
2014-08-15 22:28:33 +00:00
}
catch
{
Array . Copy ( new Byte [ 232 ] , buff , 232 ) ;
2014-10-10 02:59:57 +00:00
populateFields ( buff ) ;
2014-08-15 22:28:33 +00:00
MessageBox . Show ( "Imported code did not decrypt properly. Verify that what you imported was correct." , "Error" ) ;
}
}
}
private void mainmenuBoxReport ( object sender , EventArgs e )
{
2014-10-11 07:22:22 +00:00
frmReport ReportForm = new frmReport ( ) ;
ReportForm . PopulateData ( savefile , savindex ) ;
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-08-31 20:32:04 +00:00
{
loadBoxesFromDB ( path ) ;
return ;
}
string ext = Path . GetExtension ( path ) ;
FileInfo fi = new FileInfo ( path ) ;
if ( fi . Length > 0x10009C )
2014-10-11 07:22:22 +00:00
MessageBox . Show ( "Input file is too large.\n\n" + path , "Alert" ) ;
else
2014-08-31 20:32:04 +00:00
{
2014-11-22 07:23:48 +00:00
byte [ ] input ; try { input = File . ReadAllBytes ( path ) ; }
catch { MessageBox . Show ( "File is in use!\n\n" + path , "Error" ) ; 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-10-11 07:22:22 +00:00
byte [ ] blank = PKX . encryptArray ( new Byte [ 260 ] ) ;
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-07-28 06:46:12 +00:00
#region Trade Packets
2014-06-28 21:22:05 +00:00
if ( ( input . Length = = 363 ) & & ( input [ 0x6B ] = = 0 ) & & ( input [ 0x6C ] = = 00 ) )
{
// EAD Packet of 363 length
byte [ ] c = new Byte [ 260 ] ;
Array . Copy ( input , 0x67 , c , 0 , 260 ) ;
input = c ;
}
else if ( ( input . Length = = 407 ) & & ( input [ 0x98 ] = = 0 ) & & ( input [ 0x99 ] = = 00 ) )
{
// EAD Packet of 407 length
byte [ ] c = new Byte [ 260 ] ;
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
{
B_ExportSAV . Enabled = false ;
B_SwitchSAV . Enabled = false ;
2014-08-01 05:36:42 +00:00
B_JPEG . Enabled = false ;
2014-06-28 21:22:05 +00:00
if ( ( BitConverter . ToUInt32 ( input , 0x100 ) ! = 0x41534944 ) & & ( BitConverter . ToUInt32 ( input , 0x5234 ) ! = 0x6E69616D ) )
{
DialogResult dialogResult = MessageBox . Show ( "Save file is not decrypted.\r\n\r\nPress Yes to ignore this warning and continue loading the save file." , "Error" , MessageBoxButtons . YesNo ) ;
if ( dialogResult = = DialogResult . Yes )
{
DialogResult sdr = MessageBox . Show ( "Press Yes to load the sav at 0x3000, No for the one at 0x82000" , "Prompt" , MessageBoxButtons . YesNoCancel ) ;
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-15 05:08:00 +00:00
open1MB ( input , path , "XY" , 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
{
DialogResult dialogResult = MessageBox . Show ( "Hash verification failed.\r\n\r\nPress Yes to ignore this warning and continue loading the save file." , "Error" , MessageBoxButtons . YesNo ) ;
if ( dialogResult = = DialogResult . Yes )
{
DialogResult sdr = MessageBox . Show ( "Press Yes to load the sav at 0x3000, No for the one at 0x82000" , "Prompt" , MessageBoxButtons . YesNoCancel ) ;
if ( sdr = = DialogResult . Cancel )
{
savindex = 0 ;
return ;
}
else if ( sdr = = DialogResult . Yes )
{
savindex = 0 ;
B_SwitchSAV . Enabled = true ;
}
else savindex = 1 ;
B_SwitchSAV . Enabled = true ;
2014-11-15 05:08:00 +00:00
open1MB ( input , path , "XY" , 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-15 05:08:00 +00:00
open1MB ( input , path , "XY" , 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-06-28 21:22:05 +00:00
{
2014-07-28 06:46:12 +00:00
string message = "Foreign File.\nOnly valid .pk* .ek* .bin supported." ;
string caption = "Error Detected in Input" ;
MessageBox . Show ( message , caption ) ;
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-11-15 05:08:00 +00:00
if ( ! PKX . verifychk ( input ) ) MessageBox . Show ( "Invalid File (Checksum Error)" , "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-07-28 06:46:12 +00:00
Array . Copy ( new Byte [ 232 ] , buff , 232 ) ;
2014-10-10 02:59:57 +00:00
populateFields ( buff ) ;
2014-07-28 06:46:12 +00:00
string message = "Attempted to load previous generation PKM.\n\nConversion failed." ;
string caption = "Alert" ;
2014-06-28 21:22:05 +00:00
MessageBox . Show ( message , caption ) ;
}
}
2014-07-28 06:46:12 +00:00
#endregion
else
{
string message = "Attempted to load an unsupported file type/size." ;
string caption = "Error" ;
MessageBox . Show ( message , caption ) ;
}
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 ) ;
savegame_oras = oras ;
// Load CyberGadget
this . savindex = 0 ;
this . savefile = new Byte [ 0x100000 ] ;
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
byte [ ] zeroarray = new Byte [ 0x200 ] ;
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 ) ;
byte [ ] realHash1 = new Byte [ 0x20 ] ;
byte [ ] realHash2 = new Byte [ 0x20 ] ;
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 ) ) ;
getSAVOffsets ( ) ;
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 )
{
// Enable Secondary Tools
GB_SAVtools . Enabled =
B_JPEG . Enabled =
B_BoxIO . Enabled =
B_VerifyCHK . Enabled = true ;
B_VerifySHA . Enabled = false ;
B_SwitchSAV . Enabled = false ;
tabBoxMulti . Enabled = true ;
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-06-28 21:22:05 +00:00
// Secondary Windows for Ribbons/Amie/Memories
private void openribbons ( object sender , EventArgs e )
{
PKHeX . RibbMedal f3 = new PKHeX . RibbMedal ( this ) ;
f3 . ShowDialog ( ) ;
}
private void openhistory ( object sender , EventArgs e )
{
PKHeX . MemoryAmie f4 = new PKHeX . MemoryAmie ( this ) ;
f4 . ShowDialog ( ) ;
}
// 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-15 05:08:00 +00:00
if ( ModifierKeys = = ( Keys . Control | Keys . Shift ) )
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-27 09:22:56 +00:00
if ( cba [ i ] . BackColor ! = System . Drawing . SystemColors . Control & & cba [ i ] . BackColor ! = Color . Empty )
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
#region TextBoxes
2014-07-12 01:39:24 +00:00
// Further logic checking
2014-07-16 19:16:16 +00:00
MaskedTextBox [ ] tba = new MaskedTextBox [ ]
{
TB_HPEV , TB_ATKEV , TB_DEFEV , TB_SPAEV , TB_SPDEV , TB_SPEEV ,
2014-07-20 19:41:30 +00:00
TB_HPIV , TB_ATKIV , TB_DEFIV , TB_SPAIV , TB_SPDIV , TB_SPEIV ,
2014-07-16 19:16:16 +00:00
} ;
for ( int i = 0 ; i < 6 ; i + + )
{
2014-10-10 02:59:57 +00:00
if ( ( ( Util . ToInt32 ( tba [ i ] . Text ) > 252 ) & & ! ( CHK_HackedStats . Checked & & Util . ToInt32 ( tba [ i ] . Text ) < 256 ) ) | | ( Util . ToInt32 ( tba [ i + 6 ] . Text ) > 31 ) )
2014-07-16 19:16:16 +00:00
{
tabMain . SelectedIndex = 2 ;
goto invalid ;
}
}
2014-08-15 04:27:53 +00:00
if ( Convert . ToUInt32 ( TB_EVTotal . Text ) > 510 & & ! CHK_HackedStats . Checked )
2014-07-12 01:39:24 +00:00
{
tabMain . SelectedIndex = 2 ;
2014-07-16 19:16:16 +00:00
goto invalid ;
2014-07-12 01:39:24 +00:00
}
2014-07-16 19:16:16 +00:00
#endregion
2014-10-10 02:59:57 +00:00
if ( Util . getIndex ( CB_Species ) = = 0 ) // Not gonna write 0 species.
2014-07-28 01:53:06 +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-07-16 19:16:16 +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-06-28 21:22:05 +00:00
// Stuff the Buff
// Create a new storage so we don't muck up things with the original
byte [ ] pkx = buff ;
2014-08-05 01:47:39 +00:00
// if (getHEXval(TB_EC) == 0) BTN_RerollEC.PerformClick();
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-10-11 07:22:22 +00:00
Array . Copy ( BitConverter . GetBytes ( Util . getIndex ( CB_Species ) ) , 0 , pkx , 0x08 , 2 ) ; // Species
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
fegform + = ( Convert . ToInt32 ( Label_Gender . Text = = "♀" ) * 2 ) ; // Female Gender
fegform + = ( Convert . ToInt32 ( Label_Gender . Text = = "-" ) * 4 ) ; // Genderless
if ( MT_Form . Enabled ) fegform + = ( Math . Min ( Convert . ToInt32 ( MT_Form . Text ) , 32 ) * 8 ) ; // Form
2014-10-10 02:59:57 +00:00
else fegform + = ( ( Util . getIndex ( CB_Form ) ) * 8 ) ;
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 ) ;
Array . Resize ( ref nicknamebytes , 24 ) ;
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
pkx [ 0x92 ] = Convert . ToByte ( Label_CTGender . Text = = "♀" ) ;
//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 ) ;
pkx [ 0xDD ] = ( byte ) ( ( ( Util . ToInt32 ( TB_MetLevel . Text ) & 0x7F ) + ( Convert . ToInt32 ( Label_OTGender . Text = = "♀" ) < < 7 ) ) ) ;
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
Array . Copy ( new Byte [ 2 ] , 0 , pkx , 0x5C + 2 * i , 2 ) ; // Clear next move (error shifted down)
// 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
Array . Copy ( new Byte [ 2 ] , 0 , pkx , 0x6C + 2 * i , 2 ) ; // Clear next move (error shifted down)
}
}
// 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-08-17 01:42:51 +00:00
chk + = BitConverter . ToUInt16 ( buff , 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 ;
// Make a new file name based off the PID
string filename = TB_Nickname . Text + " - " + TB_PID . Text + ".pk6" ;
byte [ ] dragdata = preparepkx ( buff ) ;
// Strip out party stats (if they are there)
Array . Resize ( ref dragdata , 232 ) ;
// Make File
2014-08-31 20:32:04 +00:00
string newfile = 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
}
catch ( ArgumentException x )
2014-11-26 03:55:46 +00:00
{ MessageBox . Show ( "Drag&Drop Error\r\n" + x , "Error" ) ; }
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 ;
// Make a new file name based off the PID
2014-10-10 02:59:57 +00:00
string filename = TB_Nickname . Text + " - " + TB_PID . Text + ".ek6" ;
byte [ ] 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-08-31 20:32:04 +00:00
string newfile = 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
}
catch ( ArgumentException x )
{
MessageBox . Show ( "Drag&Drop Error\r\n" + x , "Error" ) ;
}
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 )
{
RTB_S . Text = "Save has been edited.\r\nCannot integrity check." ;
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-06-28 21:22:05 +00:00
byte [ ] data = new Byte [ length [ i ] ] ;
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 + + ;
RTB_S . Text + = "Invalid: " + i . ToString ( "X2" ) + " @ region " + start [ i ] . ToString ( "X5" ) + "\r\n" ;
}
}
2014-11-21 23:34:10 +00:00
RTB_S . Text + = "1st SAV: " + ( start . Length - invalid1 ) . ToString ( ) + "/" + start . Length . ToString ( ) + "\r\n" ;
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 + + )
{
byte [ ] data = new Byte [ length [ i ] ] ;
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 + + ;
RTB_S . Text + = "Invalid: " + i . ToString ( "X2" ) + " @ region " + start [ i ] . ToString ( "X5" ) + "\r\n" ;
}
}
2014-11-21 23:34:10 +00:00
RTB_S . Text + = "2nd SAV: " + ( start . Length - invalid2 ) . ToString ( ) + "/" + start . Length . ToString ( ) + "\r\n" ;
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 )
{
RTB_S . Text = "Save has been edited.\r\nCannot integrity check." ;
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 ] ;
byte [ ] zeroarray = new Byte [ blocksize ] ;
Array . Copy ( savefile , start , zeroarray , 0 , length + 1 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
byte [ ] actualhash = new Byte [ 0x20 ] ;
Array . Copy ( savefile , offset , actualhash , 0 , 0x20 ) ;
if ( ! hashValue . SequenceEqual ( actualhash ) )
{
invalid1 + + ;
RTB_S . Text + = "Invalid: " + hashtabledata [ 2 + 4 * i ] . ToString ( "X5" ) + " @ " + hashtabledata [ 0 + 4 * i ] . ToString ( "X5" ) + "-" + hashtabledata [ 1 + 4 * i ] . ToString ( "X5" ) + "\r\n" ;
}
}
RTB_S . Text + = "1st SAV: " + ( 106 - invalid1 ) . ToString ( ) + "/" + 106. ToString ( ) + "\r\n" ;
// 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 ] ;
byte [ ] zeroarray = new Byte [ blocksize ] ;
Array . Copy ( savefile , start , zeroarray , 0 , length + 1 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
byte [ ] actualhash = new Byte [ 0x20 ] ;
Array . Copy ( savefile , offset , actualhash , 0 , 0x20 ) ;
if ( ! hashValue . SequenceEqual ( actualhash ) )
{
invalid2 + + ;
RTB_S . Text + = "Invalid: " + hashtabledata [ 2 + 4 * i ] . ToString ( "X5" ) + " @ " + hashtabledata [ 0 + 4 * i ] . ToString ( "X5" ) + "-" + hashtabledata [ 1 + 4 * i ] . ToString ( "X5" ) + "\r\n" ;
}
}
RTB_S . Text + = "2nd SAV: " + ( 106 - invalid2 ) . ToString ( ) + "/" + 106. ToString ( ) + "\r\n" ;
if ( invalid1 + invalid2 = = ( 2 * 106 ) )
RTB_S . Text = "None of the IVFC hashes are valid." + "\r\n" ;
// Check the Upper Level IVFC Hashes
{
byte [ ] zeroarray = new Byte [ 0x200 ] ;
Array . Copy ( savefile , 0x2000 , zeroarray , 0 , 0x20 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
byte [ ] actualhash = new Byte [ 0x20 ] ;
Array . Copy ( savefile , 0x43C , actualhash , 0 , 0x20 ) ;
if ( ! hashValue . SequenceEqual ( actualhash ) )
{
RTB_S . Text + = "Invalid: " + 0x2000 . ToString ( "X5" ) + " @ " + 0x43C . ToString ( "X3" ) + "\r\n" ;
}
}
{
byte [ ] zeroarray = new Byte [ 0x200 ] ;
Array . Copy ( savefile , 0x81000 , zeroarray , 0 , 0x20 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
byte [ ] actualhash = new Byte [ 0x20 ] ;
Array . Copy ( savefile , 0x30C , actualhash , 0 , 0x20 ) ;
if ( ! hashValue . SequenceEqual ( actualhash ) )
{
RTB_S . Text + = "Invalid: " + 0x81000 . ToString ( "X5" ) + " @ " + 0x30C . ToString ( "X3" ) + "\r\n" ;
}
}
{
byte [ ] difihash1 = new Byte [ 0x12C ] ;
byte [ ] difihash2 = new Byte [ 0x12C ] ;
Array . Copy ( savefile , 0x330 , difihash1 , 0 , 0x12C ) ;
Array . Copy ( savefile , 0x200 , difihash2 , 0 , 0x12C ) ;
byte [ ] hashValue1 = mySHA256 . ComputeHash ( difihash1 ) ;
byte [ ] hashValue2 = mySHA256 . ComputeHash ( difihash2 ) ;
byte [ ] actualhash = new Byte [ 0x20 ] ;
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.
byte [ ] editedsav = new Byte [ 0x100000 ] ;
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 + + )
{
byte [ ] data = new Byte [ length [ i ] ] ;
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 ] ;
byte [ ] zeroarray = new Byte [ blocksize ] ;
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 ] ;
byte [ ] zeroarray = new Byte [ blocksize ] ;
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 ] ;
byte [ ] zeroarray = new Byte [ blocksize ] ;
Array . Copy ( editedsav , start , zeroarray , 0 , length + 1 ) ;
byte [ ] hashValue = mySHA256 . ComputeHash ( zeroarray ) ;
Array . Copy ( hashValue , 0 , editedsav , offset , 0x20 ) ;
}
// Fix IVFC Hash
{
byte [ ] zeroarray = new Byte [ 0x200 ] ;
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
{
byte [ ] difihash = new Byte [ 0x12C ] ;
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
{
byte [ ] cybersav = new Byte [ 0x65600 ] ;
2014-11-21 23:34:10 +00:00
if ( savegame_oras ) cybersav = new Byte [ 0x76000 ] ;
Array . Copy ( editedsav , 0x5400 , cybersav , 0 , cybersav . Length ) ;
if ( savegame_oras ) goto postcheck ;
2014-08-31 20:32:04 +00:00
// Chunk Error Checking
byte [ ] FFFF = new Byte [ 0x200 ] ;
byte [ ] section = new Byte [ 0x200 ] ;
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" ) )
+ "\nCyber will screw up (as of August 31st).\n\n" ;
// Check to see if it is in the Pokedex
if ( i * 0x200 > 0x14E00 & & i * 0x200 < 0x15700 )
{
problem + = "Problem lies in the Pokedex" ;
if ( i * 0x200 = = 0x15400 )
problem + = "\nRemove a language flag for a species.\n\n(dex#44-649)" ;
}
DialogResult dr = MessageBox . Show ( problem + "\n\nContinue saving?" , "Alert" , MessageBoxButtons . YesNo ) ;
if ( dr ! = DialogResult . Yes )
return ;
}
}
2014-11-21 23:34:10 +00:00
postcheck :
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-08-12 23:37:26 +00:00
if ( Directory . Exists ( cyberpath + "\\root\\" ) )
2014-08-02 00:24:22 +00:00
{
2014-08-12 23:37:26 +00:00
cySAV . InitialDirectory = 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 ) ;
MessageBox . Show ( "Saved Cyber SAV." , "Alert" ) ;
}
}
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 ) ;
MessageBox . Show ( "Saved SAV." , "Alert" ) ;
}
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-07-31 22:06:48 +00:00
System . Media . SystemSounds . Exclamation . Play ( ) ;
2014-06-28 21:22:05 +00:00
return ;
}
// Load the PKX file
if ( BitConverter . ToUInt64 ( savefile , offset + 8 ) ! = 0 )
{
byte [ ] ekxdata = new Byte [ 0xE8 ] ;
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-10-10 02:59:57 +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-10-10 02:59:57 +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-10-11 07:22:22 +00:00
if ( slot = = 30 & & ( CB_Species . SelectedIndex = = 0 | | CHK_IsEgg . Checked ) ) { MessageBox . Show ( "Can't have empty/egg first slot." , "Alert" ) ; return ; }
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 ) ;
DialogResult dr = new DialogResult ( ) ;
if ( move1 > 617 | | move2 > 617 | | move3 > 617 | | move4 > 617 )
dr = MessageBox . Show ( "Move does not exist in X/Y.\n\nContinue?" , "Alert" , MessageBoxButtons . YesNo ) ;
else if ( ability > 188 )
dr = MessageBox . Show ( "Ability does not exist in X/Y.\n\nContinue?" , "Alert" , MessageBoxButtons . YesNo ) ;
else if ( item > 717 )
dr = MessageBox . Show ( "Item does not exist in X/Y.\n\nContinue?" , "Alert" , MessageBoxButtons . YesNo ) ;
else goto next ;
if ( dr ! = DialogResult . Yes )
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 ) ;
if ( slot = = 30 & & partycount = = 1 & & ! DEV_Ability . Enabled ) { MessageBox . Show ( "Can't delete first slot." , "Alert" ) ; return ; }
int offset = getPKXOffset ( slot ) ;
byte [ ] pkxdata = new Byte [ 0x104 ] ;
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-08-16 04:40:58 +00:00
private void setPokedex ( byte [ ] pkxdata )
2014-08-10 03:56:26 +00:00
{
2014-11-22 07:23:48 +00:00
if ( savegame_oras ) return ;
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 ) ;
int shiny = Convert . ToInt16 ( Convert . ToBoolean ( ( ( pid > > 16 ) ^ ( pid & 0xFFFF ) ^ TID ^ SID ) < 16 ) ) ;
2014-10-10 02:59:57 +00:00
int dexoff = savindex * 0x7F000 + SaveGame . PokeDex + 8 ; // need to re-do this for ORAS
2014-08-10 03:56:26 +00:00
int shiftoff = ( shiny * 0x60 * 2 ) + ( gender * 0x60 ) + 0x60 ;
// Set the Species Owned Flag
savefile [ dexoff + shiftoff + ( species - 1 ) / 8 ] | = ( byte ) ( 1 < < ( ( species - 1 ) % 8 ) ) ;
// Set the Origin Owned Flag
if ( origin < 0x18 & & species < 650 ) // Pre X/Y
savefile [ 0x1AA4C + 0x7F000 * savindex + ( species - 1 ) / 8 ] | = ( byte ) ( 1 < < ( ( species - 1 ) % 8 ) ) ;
2014-08-12 23:37:26 +00:00
else if ( origin > = 0x18 ) // Set Native Flag
2014-08-31 20:32:04 +00:00
savefile [ dexoff + ( species - 1 ) / 8 ] | = ( 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-08-10 10:50:20 +00:00
savefile [ 0x1A7C8 + 0x7F000 * savindex + ( ( 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
{
byte partymembers = 0 ;
int offset = SaveGame . Party + 0x7F000 * savindex ;
for ( int i = 0 ; i < 6 ; i + + )
{
// Gather all the species
byte [ ] data = new Byte [ 0x104 ] ;
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
}
}
// 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-10-10 02:59:57 +00:00
Array . Copy ( PKX . encryptArray ( new Byte [ 0x104 ] ) , 0 , savefile , offset + ( i * 0x104 ) , 0x104 ) ;
2014-07-26 21:56:06 +00:00
}
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
byte [ ] data = new Byte [ 0x104 ] ;
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 + + )
2014-07-26 21:56:06 +00:00
{
2014-10-11 07:22:22 +00:00
if ( i > = battlemem )
Array . Copy ( PKX . encryptArray ( new Byte [ 0x104 ] ) , 0 , savefile , offset2 + ( i * 0xE8 ) , 0xE8 ) ;
2014-07-26 21:56:06 +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 )
{
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
{ MessageBox . Show ( "Invalid slot!" , "Error" ) ; 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 ] ) ;
}
// 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 ] ) ;
}
// Reload Daycare
Label [ ] dclabela = {
L_DC1 ,
L_DC2 ,
} ;
TextBox [ ] dctexta = {
TB_Daycare1XP ,
TB_Daycare2XP ,
} ;
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 ( ) ;
RTB_S . Text + = "\r\nLoaded Save File " + ( savindex + 1 ) . ToString ( ) ;
}
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
{
MessageBox . Show ( "Unrecognized Save File loaded." , "Error" ) ;
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 )
{
byte [ ] slotdata = new Byte [ 0xE8 ] ;
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
chk + = BitConverter . ToUInt16 ( dslotdata , i ) ;
2014-08-17 01:42:51 +00:00
if ( chk ! = BitConverter . ToUInt16 ( dslotdata , 6 ) & & ! 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-07-28 22:28:06 +00:00
if ( species = = 0 )
file = "_0" ;
// if (isegg == 1)
// { file = "egg"; }
2014-06-28 21:22:05 +00:00
else
{
file = "_" + species . ToString ( ) ;
if ( altforms > 0 ) // Alt Form Handling
file = file + "_" + altforms . ToString ( ) ;
else if ( ( species = = 521 ) & & ( gender = = 1 ) ) // Unfezant
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 ) ;
uint UID = ( PID > > 16 ) ;
uint LID = ( PID & 0xFFFF ) ;
uint PSV = UID ^ LID ;
2014-07-31 22:06:48 +00:00
uint TSV = ( uint ) ( BitConverter . ToUInt16 ( dslotdata , 0x0C ) ^ BitConverter . ToUInt16 ( dslotdata , 0x0E ) ) ;
2014-07-28 22:28:06 +00:00
uint XOR = 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 )
{
if ( species < 722 & & species ! = 0 )
{
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-07-31 22:06:48 +00:00
if ( species ! = 0 & & isegg = = 1 )
{
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-08-03 05:15:47 +00:00
if ( species ! = 0 & & XOR < 16 )
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-07-31 22:06:48 +00:00
if ( species ! = 0 & & BitConverter . ToUInt16 ( dslotdata , 0xA ) > 0 )
{
// 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-06-28 21:22:05 +00:00
uint tsv = ( TID ^ SID ) > > 4 ;
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-06-28 21:22:05 +00:00
uint psv = ( ( PID > > 16 ) ^ ( PID & 0xFFFF ) ) > > 4 ;
Tip3 . SetToolTip ( this . TB_PID , "PSV: " + psv . ToString ( "0000" ) ) ;
}
private void Menu_DumpLoadBoxes_Click ( object sender , EventArgs e )
{
2014-10-10 02:59:57 +00:00
DialogResult dr = MessageBox . Show ( "Press Yes to Import All\r\nPress No to Dump All\r\nPress Cancel to abort." , "Alert" , MessageBoxButtons . YesNoCancel ) ;
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
{
if ( Directory . Exists ( exepath + "\\db" ) )
{
DialogResult ld = MessageBox . Show ( "Load from PKHeX's database?" , "Alert" , MessageBoxButtons . YesNo ) ;
if ( ld = = DialogResult . Yes )
path = exepath + "\\db" ;
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.
{
DialogResult ld = MessageBox . Show ( "Save to PKHeX's database?" , "Alert" , MessageBoxButtons . YesNo ) ;
if ( ld = = DialogResult . Yes )
{
path = exepath + "\\db" ;
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 )
{
byte [ ] ekxdata = new Byte [ size ] ;
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 ) ;
if ( ! File . Exists ( path + "\\" + savedname ) )
2014-08-31 20:32:04 +00:00
File . WriteAllBytes ( 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-09-06 19:52:36 +00:00
if ( MessageBox . Show ( "Clear subsequent boxes when importing data?\n\nIf you only want to overwrite for new data, press no." , "Alert" , MessageBoxButtons . YesNo ) = = DialogResult . Yes )
{
2014-10-10 02:59:57 +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-06-28 21:22:05 +00:00
byte [ ] data = new Byte [ 232 ] ;
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
chk + = BitConverter . ToUInt16 ( input , z ) ;
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-08-15 04:27:53 +00:00
string result = "Loaded " + ctr + " files to boxes." ;
if ( pastctr > 0 )
2014-10-11 07:22:22 +00:00
result + = "\n\nConversion successful for " + pastctr + " past generation files." ;
2014-08-15 04:27:53 +00:00
MessageBox . Show ( result , "Alert" ) ;
2014-06-28 21:22:05 +00:00
}
}
// Subfunction Save Buttons //
private void B_OpenWondercards_Click ( object sender , EventArgs e )
{
// Open Wondercard Menu
PKHeX . SAV_Wondercard sb32 = new PKHeX . SAV_Wondercard ( this ) ;
sb32 . ShowDialog ( ) ;
}
private void B_OpenBoxLayout_Click ( object sender , EventArgs e )
{
// Open Box Layout Menu
2014-10-11 07:22:22 +00:00
PKHeX . SAV_BoxLayout sb21 = new PKHeX . SAV_BoxLayout ( this ) ;
2014-06-28 21:22:05 +00:00
sb21 . ShowDialog ( ) ;
2014-10-10 02:59:57 +00:00
setBoxNames ( ) ;
setPKXBoxes ( ) ;
2014-06-28 21:22:05 +00:00
}
private void B_OpenTrainerInfo_Click ( object sender , EventArgs e )
{
2014-11-22 07:23:48 +00:00
PKHeX . SAV_Trainer sb13 = new PKHeX . SAV_Trainer ( this ) ;
2014-06-28 21:22:05 +00:00
sb13 . ShowDialog ( ) ;
}
private void B_OpenPokepuffs_Click ( object sender , EventArgs e )
{
2014-10-11 07:22:22 +00:00
PKHeX . SAV_Pokepuff sb11 = new PKHeX . SAV_Pokepuff ( this ) ;
2014-06-28 21:22:05 +00:00
sb11 . ShowDialog ( ) ;
}
private void B_OpenItemPouch_Click ( object sender , EventArgs e )
{
PKHeX . SAV_Inventory sb12 = new PKHeX . SAV_Inventory ( this ) ;
sb12 . ShowDialog ( ) ;
}
private void B_OpenBerryField_Click ( object sender , EventArgs e )
{
2014-11-26 06:24:32 +00:00
if ( savegame_oras )
{
DialogResult dr = MessageBox . Show ( "No editing support for ORAS :(\n\nRepopulate all with random berries?" , "Alert" , MessageBoxButtons . YesNo ) ;
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 , } ;
int [ ] itemlist = new int [ ]
{
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 + + )
{
Array . Copy ( ready , 0 , savefile , offset + 0x10 * i , 0x10 ) ;
Array . Copy ( BitConverter . GetBytes ( itemlist [ Util . rnd32 ( ) % itemlist . Length ] ) , 0 , savefile , offset + 0x10 * i + 6 , 2 ) ;
}
}
}
else
( new PKHeX . 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-11-22 03:47:30 +00:00
if ( savegame_oras ) ( new PKHeX . SAV_EventFlagsORAS ( this ) ) . ShowDialog ( ) ;
else ( new PKHeX . 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-10-11 07:22:22 +00:00
SAV_SuperTrain supertrain = new PKHeX . SAV_SuperTrain ( this ) ;
2014-07-31 22:06:48 +00:00
supertrain . ShowDialog ( ) ;
}
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 )
{
DialogResult dr = MessageBox . Show ( "No editing support for ORAS :(\n\nMax O-Powers with a working code?" , "Alert" , MessageBoxButtons . YesNo ) ;
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
}
return ;
}
2014-07-27 01:00:17 +00:00
SAV_OPower opower = new PKHeX . SAV_OPower ( this ) ;
opower . ShowDialog ( ) ;
}
2014-07-28 01:30:54 +00:00
private void B_OpenPokedex_Click ( object sender , EventArgs e )
{
// Open Pokedex Menu
2014-11-26 03:55:46 +00:00
if ( savegame_oras )
{
if ( ModifierKeys = = Keys . Alt )
( new PKHeX . SAV_PokedexORAS ( this ) ) . ShowDialog ( ) ;
else
{
DialogResult dr = MessageBox . Show ( "No editing support for ORAS :(\nNot enough research has been done.\n\nSet every bitflag in the Pokedex?\nWarning: Not reversible until full editing comes out (no eta)." , "Alert" , MessageBoxButtons . YesNo ) ;
if ( dr = = DialogResult . Yes )
2014-11-26 06:24:32 +00:00
{
// Native Byte Writing
2014-11-26 03:55:46 +00:00
for ( int i = 0 ; i < 0x58 ; i + + )
savefile [ 0x7F000 * savindex + 0x1A400 + 8 + i ] = 0xFF ;
2014-11-26 06:24:32 +00:00
Array . Copy ( BitConverter . GetBytes ( 0x0001FFFF ) , 0 , savefile , 0x7F000 * savindex + 0x5400 + 0x15060 , 4 ) ;
// Midsection Writing
{
// starting at 0x15068;
#region Payload
uint [ ] payload = new uint [ ] {
0x8FFFFFFF , // 20015068
0xFFFFFFFF , // 2001506C
0xFFFFFFFF , // 20015070
0xF7FAFFFF , // 20015074
0xFFFFFFFF , // 20015078
0xFFFFFFFF , // 2001507C
0xFFFFFFFF , // 20015080
0xFFFCDFFF , // 20015084
0xFFFFFFFF , // 20015088
0xFDFFFFFF , // 2001508C
0xFFFFFFFF , // 20015090
0xF7FFFFFF , // 20015094
0x6FFFFFFF , // 20015098
0xFF7FFFFF , // 2001509C
0xDFFFFFFF , // 200150A0
0xFFFFFF7F , // 200150A4
0xFFFFFFFF , // 200150A8
0xFFFFFFE7 , // 200150AC
0xFFFFFFFF , // 200150B0
0xFFCFFFFF , // 200150B4
0x8FFFFFFF , // 200150B8
0xFFFFFFFF , // 200150BC
0x0001FFFF , // 200150C0
0x00000000 , // 200150C4
0x7FFFFFFF , // 200150C8
0xFFFFFFFC , // 200150CC
0xFFFCFFFF , // 200150D0
0x7E7FF9E7 , // 200150D4
0xFF9C7EF7 , // 200150D8
0xFFFFFFFF , // 200150DC
0xFFFFFEFF , // 200150E0
0xF8E3E6FF , // 200150E4
0xFFFFFFFF , // 200150E8
0xFEFFFFF7 , // 200150EC
0xFF3CFFFF , // 200150F0
0x081FFFFF , // 200150F4
0xDFFFFFFC , // 200150F8
0xFFE7FFFF , // 200150FC
0x39FFDFFF , // 20015100
0xFFFFC090 , // 20015104
0xF9FFFFFF , // 20015108
0xFFFFFFFF , // 2001510C
0xFE3FFFFF , // 20015110
0x1FF39FBF , // 20015114
0xFFFFFE00 , // 20015118
0xBFFFFFFF , // 2001511C
0x000007FF , // 10015120
0x00000000 , //
0x8FFFFFFF , // 20015128
0xFFFFFFFF , // 2001512C
0xFFFFFFFF , // 20015130
0xF7FAFFFF , // 20015134
0xFFFFFFFF , // 20015138
0xFFFFFFFF , // 2001513C
0xFFFFFFFF , // 20015140
0xFFFCDFFF , // 20015144
0xFFFFFFFF , // 20015148
0xFDFFFFFF , // 2001514C
0xFFFFFFFF , // 20015150
0xF7FFFFFF , // 20015154
0x6FFFFFFF , // 20015158
0xFF7FFFFF , // 2001515C
0xDFFFFFFF , // 20015160
0xFFFFFF7F , // 20015164
0xFFFFFFFF , // 20015168
0xFFFFFFE7 , // 2001516C
0xFFFFFFFF , // 20015170
0xFFCFFFFF , // 20015174
0x8FFFFFFF , // 20015178
0xFFFFFFFF , // 2001517C
0x0001FFFF , // 20015180
0x00000000 , // 20015184
0x7FFFFFFF , // 20015188
0xFFFFFFFC , // 2001518C
0xFFFCFFFF , // 20015190
0x7E7FF9E7 , // 20015194
0xFF9C7EF7 , // 20015198
0xFFFFFFFF , // 2001519C
0xFFFFFEFF , // 200151A0
0xF8E3E6FF , // 200151A4
0xFFFFFFFF , // 200151A8
0xFEFFFFF7 , // 200151AC
0xFF3CFFFF , // 200151B0
0x081FFFFF , // 200151B4
0xDFFFFFFC , // 200151B8
0xFFE7FFFF , // 200151BC
0x39FFDFFF , // 200151C0
0xFFFFC090 , // 200151C4
0xF9FFFFFF , // 200151C8
0xFFFFFFFF , // 200151CC
0xFE3FFFFF , // 200151D0
0x1FF39FBF , // 200151D4
0xFFFFFE00 , // 200151D8
0xBFFFFFFF , // 200151DC
0x000007FF , // 100151E0
0x00000000 , //
0x8FFFFFFF , // 200151E8
0xFFFFFFFF , // 200151EC
0xFFFFFFFF , // 200151F0
0xF7FAFFFF , // 200151F4
0xFFFFFFFF , // 200151F8
0xFFFFFFFF , // 200151FC
0xFFFFFFFF , // 20015200
0xFFFCDFFF , // 20015204
0xFFFFFFFF , // 20015208
0xFDFFFFFF , // 2001520C
0xFFFFFFFF , // 20015210
0xF7FFFFFF , // 20015214
0x6FFFFFFF , // 20015218
0xFF7FFFFF , // 2001521C
0xDFFFFFFF , // 20015220
0xFFFFFF7F , // 20015224
0xFFFFFFFF , // 20015228
0xFFFFFFE7 , // 2001522C
0xFFFFFFFF , // 20015230
0xFFCFFFFF , // 20015234
0x8FFFFFFF , // 20015238
0xFFFFFFFF , // 2001523C
0x0001FFFF , // 20015240
0x00000000 , // 20015244
0x7FFFFFFF , // 20015248
0xFFFFFFFC , // 2001524C
0xFFFCFFFF , // 20015250
0x7E7FF9E7 , // 20015254
0xFF9C7EF7 , // 20015258
0xFFFFFFFF , // 2001525C
0xFFFFFEFF , // 20015260
0xF8E3E6FF , // 20015264
0xFFFFFFFF , // 20015268
0xFEFFFFF7 , // 2001526C
0xFF3CFFFF , // 20015270
0x081FFFFF , // 20015274
0xDFFFFFFC , // 20015278
0xFFE7FFFF , // 2001527C
0x39FFDFFF , // 20015280
0xFFFFC090 , // 20015284
0xF9FFFFFF , // 20015288
0xFFFFFFFF , // 2001528C
0xFE3FFFFF , // 20015290
0x1FF39FBF , // 20015294
0xFFFFFE00 , // 20015298
0xBFFFFFFF , // 2001529C
0x000007FF , // 100152A0
0x00000000 , //
0x8FFFFFFF , // 200152A8
0xFFFFFFFF , // 200152AC
0xFFFFFFFF , // 200152B0
0xF7FAFFFF , // 200152B4
0xFFFFFFFF , // 200152B8
0xFFFFFFFF , // 200152BC
0xFFFFFFFF , // 200152C0
0xFFFCDFFF , // 200152C4
0xFFFFFFFF , // 200152C8
0xFDFFFFFF , // 200152CC
0xFFFFFFFF , // 200152D0
0xF7FFFFFF , // 200152D4
0x6FFFFFFF , // 200152D8
0xFF7FFFFF , // 200152DC
0xDFFFFFFF , // 200152E0
0xFFFFFF7F , // 200152E4
0xFFFFFFFF , // 200152E8
0xFFFFFFE7 , // 200152EC
0xFFFFFFFF , // 200152F0
0xFFCFFFFF , // 200152F4
0x8FFFFFFF , // 200152F8
0xFFFFFFFF , // 200152FC
0x0001FFFF , // 20015300
0x00000000 , // 20015304
0x7FFFFFFF , // 20015308
0xFFFFFFFC , // 2001530C
0xFFFCFFFF , // 20015310
0x7E7FF9E7 , // 20015314
0xFF9C7EF7 , // 20015318
0xFFFFFFFF , // 2001531C
0xFFFFFEFF , // 20015320
0xF8E3E6FF , // 20015324
0xFFFFFFFF , // 20015328
0xFEFFFFF7 , // 2001532C
0xFF3CFFFF , // 20015330
0x081FFFFF , // 20015334
0xDFFFFFFC , // 20015338
0xFFE7FFFF , // 2001533C
0x39FFDFFF , // 20015340
0xFFFFC090 , // 20015344
0xF9FFFFFF , // 20015348
0xFFFFFFFF , // 2001534C
0xFE3FFFFF , // 20015350
0x1FF39FBF , // 20015354
0xFFFFFE00 , // 20015358
0xBFFFFFFF , // 2001535C
0x000007FF , // 10015360
} ;
#endregion
for ( int i = 0 ; i < payload . Length ; i + + )
Array . Copy ( BitConverter . GetBytes ( payload [ i ] ) , 0 , savefile , 0x7F000 * savindex + 0x5400 + 0x15068 + 4 * i , 4 ) ;
}
// Language Writing
for ( int i = 0 ; i < 0x9D ; i + + )
Array . Copy ( BitConverter . GetBytes ( 0xFFFFFFFF ) , 0 , savefile , 0x7F000 * savindex + 0x5400 + 0x15400 + 4 * i , 4 ) ;
Array . Copy ( BitConverter . GetBytes ( 0x007FFFFF ) , 0 , savefile , 0x7F000 * savindex + 0x5400 + 0x15674 , 4 ) ;
// Encounter Count Writing (999*all species)
for ( int i = 0 ; i < 0x2D1 ; i + + )
Array . Copy ( BitConverter . GetBytes ( 999 ) , 0 , savefile , 0x7F000 * savindex + 0x5400 + 0x15686 + 8 + i * 2 , 2 ) ;
}
2014-11-26 03:55:46 +00:00
}
}
else ( new PKHeX . 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-11-26 03:55:46 +00:00
result + = "PSS List\n\n" ;
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-11-26 03:55:46 +00:00
result + = "----\n" + headers [ g ] + "\n" + "----\n" + "\n" ;
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-07-31 22:06:48 +00:00
result + =
2014-11-26 03:55:46 +00:00
"OT: " + otname + "\n" +
"Message: " + message + "\n" +
"Game: " + gamename + "\n" +
"Country ID: " + country + "\n" +
"Region ID: " + region + "\n" +
"Favorite: " + specieslist [ favpkm ] + "\n" ;
result + = "\n" ;
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
SAV_HallOfFame halloffame = new PKHeX . SAV_HallOfFame ( this ) ;
halloffame . ShowDialog ( ) ;
}
2014-11-23 22:23:40 +00:00
private void B_OpenSecretBase_Click ( object sender , EventArgs e )
{
// Open Secret Base Menu
SAV_SecretBase secretbase = new PKHeX . SAV_SecretBase ( this ) ;
secretbase . ShowDialog ( ) ;
}
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
MessageBox . Show ( "Can't find the cache folder." , "Alert" ) ;
}
else
{
path = Util . GetTempFolder ( ) ;
if ( Directory . Exists ( path + "\\root\\" ) )
System . Diagnostics . Process . Start ( "explorer.exe" , @Path . Combine ( path + "\\root\\" ) ) ;
else if ( Directory . Exists ( path ) )
System . Diagnostics . Process . Start ( "explorer.exe" , @path ) ;
else { MessageBox . Show ( "Can't find the temporary file.\n\nMake sure the Cyber Gadget software is paused." , "Alert" ) ; }
}
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 )
{
DialogResult switchsav = MessageBox . Show ( "Current Savefile is Save" + ( ( savindex + 1 ) ) . ToString ( ) + ". Would you like to switch to Save" + ( ( savindex + 1 ) % 2 + 1 ) . ToString ( ) + "?" , "Prompt" , MessageBoxButtons . YesNo ) ;
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 )
{
MessageBox . Show ( "No PGL picture data found!" , "Error" ) ;
return ;
}
int length = 0xE004 ;
byte [ ] jpeg = new Byte [ length ] ;
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
PKHeX . SAV_BoxIO boxio = new PKHeX . SAV_BoxIO ( this , SaveGame . Box , SaveGame . PCLayout ) ;
boxio . 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 ( ) ;
TranslateInterface ( "Form1" ) ;
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 ( )
{
string [ ] lang_val = { "en" , "ja" , "fr" , "it" , "de" , "es" , "ko" } ;
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 ) ;
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 ) ;
itempouch = Util . getStringList ( "ItemPouch" , l ) ;
wallpapernames = Util . getStringList ( "Wallpaper" , l ) ;
2014-06-28 21:22:05 +00:00
2014-11-22 03:26:16 +00:00
// Fix (None) tags
abilitylist [ 0 ] = itemlist [ 0 ] = movelist [ 0 ] = "(" + itemlist [ 0 ] + ")" ;
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
// Fix up some of the strings to make them more descriptive:
metHGSS_02000 [ 1 ] + = " (NPC)" ; // Anything from an NPC
metHGSS_02000 [ 2 ] + = " (" + eggname + ")" ; // Egg From Link Trade
metBW2_00000 [ 36 ] = metBW2_00000 [ 84 ] + "/" + metBW2_00000 [ 36 ] ; // Cold Storage in BW = PWT in BW2
2014-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)
string [ ] ptransp = { "Poké Transfer" , "ポケシフター" , "Poké Fret" , "Pokétrasporto" , "Poképorter" , "Pokétransfer" , "포케시프터" , } ;
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...
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)
metXY_00000 [ 0 ] = "" ;
metBW2_00000 [ 0 ] = "" ;
metHGSS_00000 [ 0 ] = "" ;
// Force an update to the met locations
origintrack = "" ;
2014-08-15 22:28:33 +00:00
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 )
{
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 )
{
Array . Copy ( savefile , offset , pkm_from , 0 , 0xE8 ) ;
pkm_from_offset = offset ;
( sender as PictureBox ) . DoDragDrop ( pkm_from , DragDropEffects . Move ) ;
}
}
private void pbBoxSlot_DragDrop ( object sender , DragEventArgs e )
{
2014-11-26 06:37:58 +00:00
string [ ] files = ( string [ ] ) e . Data . GetData ( DataFormats . FileDrop ) ;
if ( files ! = null )
if ( files . Length > 0 ) openQuick ( files [ 0 ] ) ;
2014-11-26 04:43:02 +00:00
PictureBox pb = ( PictureBox ) ( sender ) ;
int slot = getSlot ( sender ) ;
int offset = getPKXOffset ( slot ) ;
if ( ModifierKeys = = Keys . Alt )
Array . Copy ( PKX . encryptArray ( new Byte [ 0xE8 ] ) , 0 , savefile , pkm_from_offset , 0xE8 ) ;
2014-11-26 04:46:42 +00:00
else if ( ModifierKeys ! = Keys . Control )
2014-11-26 04:43:02 +00:00
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.
setPKXBoxes ( ) ;
}
private void pbBoxSlot_DragEnter ( object sender , DragEventArgs e )
{
if ( e . Data ! = null )
e . Effect = DragDropEffects . Move ;
}
private byte [ ] pkm_from = new Byte [ 0xE8 ] ;
private int pkm_from_offset ;
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 ;
}
2014-11-27 09:29:56 +00:00
public int GetValue ( )
{
return Util . ToInt32 ( Value . ToString ( ) ) ;
}
2014-06-28 21:22:05 +00:00
}
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
}