2017-05-23 04:55:05 +00:00
using System ;
using System.Collections.Generic ;
using System.Drawing ;
using System.Linq ;
using System.Windows.Forms ;
using PKHeX.Core ;
using PKHeX.WinForms.Properties ;
using System.ComponentModel ;
namespace PKHeX.WinForms.Controls
{
public partial class PKMEditor : UserControl
{
public PKMEditor ( )
{
InitializeComponent ( ) ;
Legality = new LegalityAnalysis ( pkm = new PK7 ( ) ) ;
2017-06-18 01:37:19 +00:00
SetPKMFormatMode ( pkm . Format ) ;
2017-05-23 04:55:05 +00:00
2017-06-18 01:37:19 +00:00
GB_OT . Click + = ClickGT ;
GB_nOT . Click + = ClickGT ;
GB_CurrentMoves . Click + = ClickMoves ;
GB_RelearnMoves . Click + = ClickMoves ;
2017-05-23 04:55:05 +00:00
2017-06-18 01:37:19 +00:00
TB_Nickname . Font = FontUtil . GetPKXFont ( 11 ) ;
2017-05-23 04:55:05 +00:00
TB_OT . Font = ( Font ) TB_Nickname . Font . Clone ( ) ;
TB_OTt2 . Font = ( Font ) TB_Nickname . Font . Clone ( ) ;
relearnPB = new [ ] { PB_WarnRelearn1 , PB_WarnRelearn2 , PB_WarnRelearn3 , PB_WarnRelearn4 } ;
movePB = new [ ] { PB_WarnMove1 , PB_WarnMove2 , PB_WarnMove3 , PB_WarnMove4 } ;
2017-06-18 04:49:14 +00:00
foreach ( var c in WinFormsUtil . GetAllControlsOfType ( this , typeof ( ComboBox ) ) )
c . KeyDown + = WinFormsUtil . RemoveDropCB ;
2017-05-23 04:55:05 +00:00
}
2017-06-19 05:27:40 +00:00
public PKM CurrentPKM { get = > fieldsInitialized ? PreparePKM ( ) : pkm ; set = > pkm = value ; }
public bool ModifyPKM { private get ; set ; } = true ;
public bool Unicode { private get ; set ; } = true ;
public bool HaX { private get ; set ; }
public byte [ ] LastData { private get ; set ; }
private PKM pkm ;
private bool fieldsInitialized ;
private bool fieldsLoaded ;
2017-05-23 04:55:05 +00:00
private bool changingFields ;
2017-06-19 05:27:40 +00:00
private GameVersion origintrack ;
2017-06-18 01:37:19 +00:00
private Action GetFieldsfromPKM ;
private Func < PKM > GetPKMfromFields ;
2017-05-23 04:55:05 +00:00
private LegalityAnalysis Legality ;
private string [ ] gendersymbols = { "♂" , "♀" , "-" } ;
2017-06-19 05:27:40 +00:00
private readonly Image mixedHighlight = ImageUtil . ChangeOpacity ( Resources . slotSet , 0.5 ) ;
2017-05-23 04:55:05 +00:00
public event EventHandler LegalityChanged ;
public event EventHandler UpdatePreviewSprite ;
public event EventHandler RequestShowdownImport ;
public event EventHandler RequestShowdownExport ;
public event ReturnSAVEventHandler SaveFileRequested ;
public delegate SaveFile ReturnSAVEventHandler ( object sender , EventArgs args ) ;
private readonly PictureBox [ ] movePB , relearnPB ;
private readonly ToolTip Tip1 = new ToolTip ( ) , Tip2 = new ToolTip ( ) , Tip3 = new ToolTip ( ) , NatureTip = new ToolTip ( ) , EVTip = new ToolTip ( ) ;
private SaveFile RequestSaveFile = > SaveFileRequested ? . Invoke ( this , EventArgs . Empty ) ;
2017-06-19 05:27:40 +00:00
public bool PKMIsUnsaved = > fieldsInitialized & & fieldsLoaded & & LastData ! = null & & LastData . Any ( b = > b ! = 0 ) & & ! LastData . SequenceEqual ( PreparePKM ( ) . Data ) ;
2017-05-23 04:55:05 +00:00
public bool IsEmptyOrEgg = > CHK_IsEgg . Checked | | CB_Species . SelectedIndex = = 0 ;
2017-06-18 01:37:19 +00:00
public PKM PreparePKM ( bool click = true )
2017-05-23 04:55:05 +00:00
{
if ( click )
ValidateChildren ( ) ;
2017-06-18 01:37:19 +00:00
PKM pk = GetPKMfromFields ( ) ;
2017-05-23 04:55:05 +00:00
return pk ? . Clone ( ) ;
}
2017-06-18 01:37:19 +00:00
public bool VerifiedPKM ( )
2017-05-23 04:55:05 +00:00
{
if ( ModifierKeys = = ( Keys . Control | Keys . Shift | Keys . Alt ) )
return true ; // Override
// Make sure the PKX Fields are filled out properly (color check)
ComboBox [ ] cba = {
CB_Species , CB_Nature , CB_HeldItem , CB_Ability , // Main Tab
CB_MetLocation , CB_EggLocation , CB_Ball , // Met Tab
CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 , // Moves
CB_RelearnMove1 , CB_RelearnMove2 , CB_RelearnMove3 , CB_RelearnMove4 // Moves
} ;
ComboBox cb = cba . FirstOrDefault ( c = > c . BackColor = = Color . DarkSalmon & & c . Items . Count ! = 0 ) ;
if ( cb ! = null )
{
Control c = cb . Parent ; while ( ! ( c is TabPage ) ) c = c . Parent ;
tabMain . SelectedTab = c as TabPage ;
}
else if ( pkm . Format > = 3 & & Convert . ToUInt32 ( TB_EVTotal . Text ) > 510 & & ! CHK_HackedStats . Checked )
tabMain . SelectedTab = Tab_Stats ;
2017-06-18 01:37:19 +00:00
else if ( WinFormsUtil . GetIndex ( CB_Species ) = = 0 )
2017-05-23 04:55:05 +00:00
tabMain . SelectedTab = Tab_Main ;
else
return true ;
System . Media . SystemSounds . Exclamation . Play ( ) ;
return false ;
}
public void InitializeFields ( )
{
// Now that the ComboBoxes are ready, load the data.
fieldsInitialized = true ;
pkm . RefreshChecksum ( ) ;
// Load Data
2017-06-18 01:37:19 +00:00
PopulateFields ( pkm ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
public void SetPKMFormatMode ( int Format )
2017-05-23 04:55:05 +00:00
{
byte [ ] extraBytes = new byte [ 0 ] ;
switch ( Format )
{
case 1 :
2017-06-18 01:37:19 +00:00
GetFieldsfromPKM = PopulateFieldsPK1 ;
GetPKMfromFields = PreparePK1 ;
2017-05-23 04:55:05 +00:00
break ;
case 2 :
2017-06-18 01:37:19 +00:00
GetFieldsfromPKM = PopulateFieldsPK2 ;
GetPKMfromFields = PreparePK2 ;
2017-05-23 04:55:05 +00:00
break ;
case 3 :
if ( pkm is CK3 )
{
2017-06-18 01:37:19 +00:00
GetFieldsfromPKM = PopulateFieldsCK3 ;
GetPKMfromFields = PrepareCK3 ;
2017-05-23 04:55:05 +00:00
extraBytes = CK3 . ExtraBytes ;
break ;
}
if ( pkm is XK3 )
{
2017-06-18 01:37:19 +00:00
GetFieldsfromPKM = PopulateFieldsXK3 ;
GetPKMfromFields = PrepareXK3 ;
2017-05-23 04:55:05 +00:00
extraBytes = XK3 . ExtraBytes ;
break ;
}
2017-06-18 01:37:19 +00:00
GetFieldsfromPKM = PopulateFieldsPK3 ;
GetPKMfromFields = PreparePK3 ;
2017-05-23 04:55:05 +00:00
extraBytes = PK3 . ExtraBytes ;
break ;
case 4 :
2017-06-18 01:37:19 +00:00
GetFieldsfromPKM = PopulateFieldsPK4 ;
GetPKMfromFields = PreparePK4 ;
2017-05-23 04:55:05 +00:00
extraBytes = PK4 . ExtraBytes ;
break ;
case 5 :
2017-06-18 01:37:19 +00:00
GetFieldsfromPKM = PopulateFieldsPK5 ;
GetPKMfromFields = PreparePK5 ;
2017-05-23 04:55:05 +00:00
extraBytes = PK5 . ExtraBytes ;
break ;
case 6 :
2017-06-18 01:37:19 +00:00
GetFieldsfromPKM = PopulateFieldsPK6 ;
GetPKMfromFields = PreparePK6 ;
2017-05-23 04:55:05 +00:00
extraBytes = PK6 . ExtraBytes ;
break ;
case 7 :
2017-06-18 01:37:19 +00:00
GetFieldsfromPKM = PopulateFieldsPK7 ;
GetPKMfromFields = PreparePK7 ;
2017-05-23 04:55:05 +00:00
extraBytes = PK7 . ExtraBytes ;
break ;
}
// Load Extra Byte List
GB_ExtraBytes . Visible = GB_ExtraBytes . Enabled = extraBytes . Length ! = 0 ;
2017-05-23 15:28:53 +00:00
CB_ExtraBytes . Items . Clear ( ) ;
foreach ( byte b in extraBytes )
CB_ExtraBytes . Items . Add ( $"0x{b:X2}" ) ;
2017-05-23 04:55:05 +00:00
if ( GB_ExtraBytes . Enabled )
CB_ExtraBytes . SelectedIndex = 0 ;
}
2017-06-18 01:37:19 +00:00
public void PopulateFields ( PKM pk , bool focus = true )
2017-05-23 04:55:05 +00:00
{
if ( pk = = null ) { WinFormsUtil . Error ( "Attempted to load a null file." ) ; return ; }
2017-06-18 01:37:19 +00:00
if ( ! PKMConverter . IsConvertibleToFormat ( pk , pkm . Format ) )
2017-05-23 04:55:05 +00:00
{ WinFormsUtil . Alert ( $"Can't load Gen{pk.Format} to Gen{pkm.Format} games." ) ; return ; }
bool oldInit = fieldsInitialized ;
fieldsInitialized = fieldsLoaded = false ;
if ( focus )
Tab_Main . Focus ( ) ;
if ( fieldsInitialized & ! pkm . ChecksumValid )
WinFormsUtil . Alert ( "PKM File has an invalid checksum." ) ;
if ( pk . Format ! = pkm . Format ) // past gen format
{
2017-06-18 01:37:19 +00:00
pkm = PKMConverter . ConvertToType ( pk . Clone ( ) , pkm . GetType ( ) , out string _ ) ;
2017-05-23 04:55:05 +00:00
if ( pkm = = null )
pkm = pk . Clone ( ) ;
else if ( pk . Format ! = pkm . Format & & focus ) // converted
WinFormsUtil . Alert ( "Converted File." ) ;
}
else
pkm = pk . Clone ( ) ;
2017-06-18 01:37:19 +00:00
try { GetFieldsfromPKM ( ) ; }
2017-05-23 04:55:05 +00:00
catch { fieldsInitialized = oldInit ; throw ; }
CB_EncounterType . Visible = Label_EncounterType . Visible = pkm . Gen4 & & pkm . Format < 7 ;
fieldsInitialized = oldInit ;
2017-06-18 01:37:19 +00:00
UpdateIVs ( null , null ) ;
UpdatePKRSInfected ( null , null ) ;
UpdatePKRSCured ( null , null ) ;
2017-05-23 04:55:05 +00:00
if ( HaX ) // Load original values from pk not pkm
{
2017-06-18 01:37:19 +00:00
MT_Level . Text = ( pk . Stat_HPMax ! = 0 ? pk . Stat_Level : PKX . GetLevel ( pk . Species , pk . EXP ) ) . ToString ( ) ;
2017-05-23 04:55:05 +00:00
TB_EXP . Text = pk . EXP . ToString ( ) ;
MT_Form . Text = pk . AltForm . ToString ( ) ;
if ( pk . Stat_HPMax ! = 0 ) // stats present
{
Stat_HP . Text = pk . Stat_HPCurrent . ToString ( ) ;
Stat_ATK . Text = pk . Stat_ATK . ToString ( ) ;
Stat_DEF . Text = pk . Stat_DEF . ToString ( ) ;
Stat_SPA . Text = pk . Stat_SPA . ToString ( ) ;
Stat_SPD . Text = pk . Stat_SPD . ToString ( ) ;
Stat_SPE . Text = pk . Stat_SPE . ToString ( ) ;
}
}
fieldsLoaded = true ;
Label_HatchCounter . Visible = CHK_IsEgg . Checked & & pkm . Format > 1 ;
Label_Friendship . Visible = ! CHK_IsEgg . Checked & & pkm . Format > 1 ;
2017-06-18 01:37:19 +00:00
SetMarkings ( ) ;
UpdateLegality ( ) ;
2017-06-19 05:27:40 +00:00
UpdateSprite ( ) ;
LastData = PreparePKM ( ) ? . Data ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
public void UpdateLegality ( LegalityAnalysis la = null , bool skipMoveRepop = false )
2017-05-23 04:55:05 +00:00
{
if ( ! fieldsLoaded )
return ;
Legality = la ? ? new LegalityAnalysis ( pkm ) ;
if ( ! Legality . Parsed | | HaX | | pkm . Species = = 0 )
{
PB_WarnMove1 . Visible = PB_WarnMove2 . Visible = PB_WarnMove3 . Visible = PB_WarnMove4 . Visible =
PB_WarnRelearn1 . Visible = PB_WarnRelearn2 . Visible = PB_WarnRelearn3 . Visible = PB_WarnRelearn4 . Visible = false ;
return ;
}
// Refresh Move Legality
for ( int i = 0 ; i < 4 ; i + + )
2017-06-21 00:57:23 +00:00
movePB [ i ] . Visible = ! Legality . Info ? . Moves [ i ] . Valid ? ? false ;
2017-05-23 04:55:05 +00:00
if ( pkm . Format > = 6 )
for ( int i = 0 ; i < 4 ; i + + )
2017-06-21 00:57:23 +00:00
relearnPB [ i ] . Visible = ! Legality . Info ? . Relearn [ i ] . Valid ? ? false ;
2017-05-23 04:55:05 +00:00
if ( skipMoveRepop )
return ;
// Resort moves
bool tmp = fieldsLoaded ;
fieldsLoaded = false ;
var cb = new [ ] { CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 } ;
var moves = Legality . AllSuggestedMovesAndRelearn ;
var moveList = GameInfo . MoveDataSource . OrderByDescending ( m = > moves . Contains ( m . Value ) ) . ToArray ( ) ;
foreach ( ComboBox c in cb )
{
2017-06-18 01:37:19 +00:00
var index = WinFormsUtil . GetIndex ( c ) ;
2017-05-23 04:55:05 +00:00
c . DataSource = new BindingSource ( moveList , null ) ;
c . SelectedValue = index ;
if ( c . Visible )
c . SelectionLength = 0 ; // flicker hack
}
fieldsLoaded | = tmp ;
2017-06-19 05:27:40 +00:00
LegalityChanged ? . Invoke ( Legality . Valid , null ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
public void UpdateUnicode ( string [ ] symbols )
2017-05-23 04:55:05 +00:00
{
gendersymbols = symbols ;
if ( ! Unicode )
{
BTN_Shinytize . Text = "*" ;
TB_Nickname . Font = TB_OT . Font = TB_OTt2 . Font = Label_TID . Font ;
}
else
{
BTN_Shinytize . Text = "☆" ;
2017-06-18 01:37:19 +00:00
TB_Nickname . Font = TB_OT . Font = TB_OTt2 . Font = FontUtil . GetPKXFont ( 11 ) ;
2017-05-23 04:55:05 +00:00
}
// Switch active gender labels to new if they are active.
2017-06-18 01:37:19 +00:00
if ( PKX . GetGender ( Label_Gender . Text ) < 2 )
Label_Gender . Text = gendersymbols [ PKX . GetGender ( Label_Gender . Text ) ] ;
if ( PKX . GetGender ( Label_OTGender . Text ) < 2 )
Label_OTGender . Text = gendersymbols [ PKX . GetGender ( Label_OTGender . Text ) ] ;
if ( PKX . GetGender ( Label_CTGender . Text ) < 2 )
Label_CTGender . Text = gendersymbols [ PKX . GetGender ( Label_CTGender . Text ) ] ;
2017-05-23 04:55:05 +00:00
}
2017-06-19 05:27:40 +00:00
private void UpdateSprite ( )
{
if ( fieldsLoaded & & fieldsInitialized )
UpdatePreviewSprite ? . Invoke ( this , null ) ;
}
2017-05-23 04:55:05 +00:00
// General Use Functions //
2017-06-18 01:37:19 +00:00
private Color GetGenderColor ( int gender )
2017-05-23 04:55:05 +00:00
{
if ( gender = = 0 ) // male
return Color . Blue ;
if ( gender = = 1 ) // female
return Color . Red ;
return CB_Species . ForeColor ;
}
2017-06-18 01:37:19 +00:00
private void SetDetailsOT ( SaveFile SAV )
2017-05-23 04:55:05 +00:00
{
if ( SAV ? . Exportable ! = true )
return ;
// Get Save Information
TB_OT . Text = SAV . OT ;
Label_OTGender . Text = gendersymbols [ SAV . Gender & 1 ] ;
2017-06-18 01:37:19 +00:00
Label_OTGender . ForeColor = GetGenderColor ( SAV . Gender & 1 ) ;
2017-05-23 04:55:05 +00:00
TB_TID . Text = SAV . TID . ToString ( "00000" ) ;
TB_SID . Text = SAV . SID . ToString ( "00000" ) ;
if ( SAV . Game > = 0 )
CB_GameOrigin . SelectedValue = SAV . Game ;
if ( SAV . Language > = 0 )
CB_Language . SelectedValue = SAV . Language ;
if ( SAV . HasGeolocation )
{
CB_3DSReg . SelectedValue = SAV . ConsoleRegion ;
CB_Country . SelectedValue = SAV . Country ;
CB_SubRegion . SelectedValue = SAV . SubRegion ;
}
2017-06-18 01:37:19 +00:00
UpdateNickname ( null , null ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void SetDetailsHT ( SaveFile SAV )
2017-05-23 04:55:05 +00:00
{
if ( SAV ? . Exportable ! = true )
return ;
if ( TB_OTt2 . Text . Length > 0 )
Label_CTGender . Text = gendersymbols [ SAV . Gender & 1 ] ;
}
2017-06-18 01:37:19 +00:00
private void SetForms ( )
2017-05-23 04:55:05 +00:00
{
2017-06-18 01:37:19 +00:00
int species = WinFormsUtil . GetIndex ( CB_Species ) ;
2017-05-23 04:55:05 +00:00
if ( pkm . Format < 4 & & species ! = 201 )
{
Label_Form . Visible = CB_Form . Visible = CB_Form . Enabled = false ;
return ;
}
2017-06-12 01:23:14 +00:00
int count = ( RequestSaveFile ? . Personal [ species ] ? ? pkm . PersonalInfo ) . FormeCount ;
bool hasForms = count > 1 | | new [ ] { 201 , 664 , 665 , 414 } . Contains ( species ) ;
2017-05-23 04:55:05 +00:00
CB_Form . Enabled = CB_Form . Visible = Label_Form . Visible = hasForms ;
if ( HaX & & pkm . Format > = 4 )
Label_Form . Visible = true ;
if ( ! hasForms )
return ;
2017-06-18 01:37:19 +00:00
var ds = PKX . GetFormList ( species , GameInfo . Strings . types , GameInfo . Strings . forms , gendersymbols , pkm . Format ) . ToList ( ) ;
2017-05-23 04:55:05 +00:00
if ( ds . Count = = 1 & & string . IsNullOrEmpty ( ds [ 0 ] ) ) // empty (Alolan Totems)
CB_Form . Enabled = CB_Form . Visible = Label_Form . Visible = false ;
else CB_Form . DataSource = ds ;
}
2017-06-18 01:37:19 +00:00
private void SetAbilityList ( )
2017-05-23 04:55:05 +00:00
{
if ( pkm . Format < 3 ) // no abilities
return ;
2017-05-27 21:25:07 +00:00
if ( pkm . Format > 3 & & fieldsLoaded ) // has forms
2017-05-23 04:55:05 +00:00
pkm . AltForm = CB_Form . SelectedIndex ;
int [ ] abils = pkm . PersonalInfo . Abilities ;
if ( abils [ 1 ] = = 0 & & pkm . Format ! = 3 )
abils [ 1 ] = abils [ 0 ] ;
string [ ] abilIdentifier = { " (1)" , " (2)" , " (H)" } ;
List < string > ability_list = abils . Where ( a = > a ! = 0 ) . Select ( ( t , i ) = > GameInfo . Strings . abilitylist [ t ] + abilIdentifier [ i ] ) . ToList ( ) ;
if ( ! ability_list . Any ( ) )
ability_list . Add ( GameInfo . Strings . abilitylist [ 0 ] + abilIdentifier [ 0 ] ) ;
bool tmp = fieldsLoaded ;
fieldsLoaded = false ;
int abil = CB_Ability . SelectedIndex ;
CB_Ability . DataSource = ability_list ;
CB_Ability . SelectedIndex = abil < 0 | | abil > = CB_Ability . Items . Count ? 0 : abil ;
fieldsLoaded = tmp ;
}
2017-06-18 01:37:19 +00:00
private void SetIsShiny ( object sender )
2017-05-23 04:55:05 +00:00
{
if ( sender = = TB_PID )
2017-06-18 01:37:19 +00:00
pkm . PID = Util . GetHexValue ( TB_PID . Text ) ;
2017-05-23 04:55:05 +00:00
else if ( sender = = TB_TID )
pkm . TID = ( int ) Util . ToUInt32 ( TB_TID . Text ) ;
else if ( sender = = TB_SID )
pkm . SID = ( int ) Util . ToUInt32 ( TB_SID . Text ) ;
bool isShiny = pkm . IsShiny ;
// Set the Controls
BTN_Shinytize . Visible = BTN_Shinytize . Enabled = ! isShiny ;
Label_IsShiny . Visible = isShiny ;
// Refresh Markings (for Shiny Star if applicable)
2017-06-18 01:37:19 +00:00
SetMarkings ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void SetMarkings ( )
2017-05-23 04:55:05 +00:00
{
double getOpacity ( bool b ) = > b ? 1 : 0.175 ;
PictureBox [ ] pba = { PB_Mark1 , PB_Mark2 , PB_Mark3 , PB_Mark4 , PB_Mark5 , PB_Mark6 } ;
for ( int i = 0 ; i < pba . Length ; i + + )
pba [ i ] . Image = ImageUtil . ChangeOpacity ( pba [ i ] . InitialImage , getOpacity ( pkm . Markings [ i ] ! = 0 ) ) ;
PB_MarkShiny . Image = ImageUtil . ChangeOpacity ( PB_MarkShiny . InitialImage , getOpacity ( ! BTN_Shinytize . Enabled ) ) ;
PB_MarkCured . Image = ImageUtil . ChangeOpacity ( PB_MarkCured . InitialImage , getOpacity ( CHK_Cured . Checked ) ) ;
PB_MarkPentagon . Image = ImageUtil . ChangeOpacity ( PB_MarkPentagon . InitialImage , getOpacity ( pkm . Gen6 ) ) ;
// Gen7 Markings
if ( pkm . Format ! = 7 )
return ;
PB_MarkAlola . Image = ImageUtil . ChangeOpacity ( PB_MarkAlola . InitialImage , getOpacity ( pkm . Gen7 ) ) ;
PB_MarkVC . Image = ImageUtil . ChangeOpacity ( PB_MarkVC . InitialImage , getOpacity ( pkm . VC ) ) ;
PB_MarkHorohoro . Image = ImageUtil . ChangeOpacity ( PB_MarkHorohoro . InitialImage , getOpacity ( pkm . Horohoro ) ) ;
2017-08-13 07:21:42 +00:00
var markings = pkm . Markings ;
2017-05-23 04:55:05 +00:00
for ( int i = 0 ; i < pba . Length ; i + + )
2017-08-13 07:21:42 +00:00
if ( GetMarkingColor ( markings [ i ] , out Color c ) )
pba [ i ] . Image = ImageUtil . ChangeAllColorTo ( pba [ i ] . Image , c ) ;
}
private static bool GetMarkingColor ( int markval , out Color c )
{
switch ( markval )
2017-05-23 04:55:05 +00:00
{
2017-08-13 07:21:42 +00:00
case 1 :
c = Color . FromArgb ( 000 , 191 , 255 ) ;
return true ;
case 2 :
c = Color . FromArgb ( 255 , 117 , 179 ) ;
return true ;
default :
c = Color . Black ;
return false ;
2017-05-23 04:55:05 +00:00
}
}
2017-08-13 07:21:42 +00:00
2017-06-18 01:37:19 +00:00
private void UpdateGender ( )
2017-05-23 04:55:05 +00:00
{
2017-06-18 01:37:19 +00:00
int cg = PKX . GetGender ( Label_Gender . Text ) ;
2017-05-23 04:55:05 +00:00
int gt = pkm . PersonalInfo . Gender ;
int Gender ;
if ( gt = = 255 ) // Genderless
Gender = 2 ;
else if ( gt = = 254 ) // Female Only
Gender = 1 ;
else if ( gt = = 0 ) // Male Only
Gender = 0 ;
2017-06-18 01:37:19 +00:00
else if ( cg = = 2 | | WinFormsUtil . GetIndex ( CB_GameOrigin ) < 24 )
Gender = ( Util . GetHexValue ( TB_PID . Text ) & 0xFF ) < = gt ? 1 : 0 ;
2017-05-23 04:55:05 +00:00
else
Gender = cg ;
Label_Gender . Text = gendersymbols [ Gender ] ;
2017-06-18 01:37:19 +00:00
Label_Gender . ForeColor = GetGenderColor ( Gender ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateStats ( )
2017-05-23 04:55:05 +00:00
{
// Generate the stats.
2017-06-18 01:37:19 +00:00
pkm . SetStats ( pkm . GetStats ( pkm . PersonalInfo ) ) ;
2017-05-23 04:55:05 +00:00
Stat_HP . Text = pkm . Stat_HPCurrent . ToString ( ) ;
Stat_ATK . Text = pkm . Stat_ATK . ToString ( ) ;
Stat_DEF . Text = pkm . Stat_DEF . ToString ( ) ;
Stat_SPA . Text = pkm . Stat_SPA . ToString ( ) ;
Stat_SPD . Text = pkm . Stat_SPD . ToString ( ) ;
Stat_SPE . Text = pkm . Stat_SPE . ToString ( ) ;
// Recolor the Stat Labels based on boosted stats.
{
int incr = pkm . Nature / 5 ;
int decr = pkm . Nature % 5 ;
Label [ ] labarray = { Label_ATK , Label_DEF , Label_SPE , Label_SPA , Label_SPD } ;
// Reset Label Colors
foreach ( Label label in labarray )
label . ResetForeColor ( ) ;
// Set Colored StatLabels only if Nature isn't Neutral
if ( incr = = decr ) return ;
labarray [ incr ] . ForeColor = Color . Red ;
labarray [ decr ] . ForeColor = Color . Blue ;
}
}
2017-06-18 01:37:19 +00:00
private void SetCountrySubRegion ( ComboBox CB , string type )
2017-05-23 04:55:05 +00:00
{
int index = CB . SelectedIndex ;
// fix for Korean / Chinese being swapped
string cl = GameInfo . CurrentLanguage + "" ;
cl = cl = = "zh" ? "ko" : cl = = "ko" ? "zh" : cl ;
2017-06-18 01:37:19 +00:00
CB . DataSource = Util . GetCBList ( type , cl ) ;
2017-05-23 04:55:05 +00:00
if ( index > 0 & & index < CB . Items . Count & & fieldsInitialized )
CB . SelectedIndex = index ;
}
// Prompted Updates of PKM //
2017-06-18 01:37:19 +00:00
private void ClickFriendship ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ModifierKeys = = Keys . Control ) // prompt to reset
TB_Friendship . Text = pkm . CurrentFriendship . ToString ( ) ;
else
TB_Friendship . Text = TB_Friendship . Text = = "255" ? pkm . PersonalInfo . BaseFriendship . ToString ( ) : "255" ;
}
2017-06-18 01:37:19 +00:00
private void ClickLevel ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ModifierKeys = = Keys . Control )
( ( MaskedTextBox ) sender ) . Text = "100" ;
}
2017-06-18 01:37:19 +00:00
private void ClickGender ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
// Get Gender Threshold
int gt = pkm . PersonalInfo . Gender ;
if ( gt = = 255 | | gt = = 0 | | gt = = 254 ) // Single gender/genderless
return ;
if ( gt > = 255 ) return ;
// If not a single gender(less) species: (should be <254 but whatever, 255 never happens)
2017-06-18 01:37:19 +00:00
int newGender = PKX . GetGender ( Label_Gender . Text ) ^ 1 ;
2017-05-23 04:55:05 +00:00
if ( pkm . Format = = 2 )
2017-06-18 01:37:19 +00:00
do { TB_ATKIV . Text = ( Util . Rand32 ( ) & pkm . MaxIV ) . ToString ( ) ; } while ( PKX . GetGender ( Label_Gender . Text ) ! = newGender ) ;
2017-05-23 04:55:05 +00:00
else if ( pkm . Format < = 4 )
{
2017-05-28 20:19:48 +00:00
if ( fieldsLoaded )
2017-06-18 01:37:19 +00:00
pkm . Species = WinFormsUtil . GetIndex ( CB_Species ) ;
pkm . Version = WinFormsUtil . GetIndex ( CB_GameOrigin ) ;
pkm . Nature = WinFormsUtil . GetIndex ( CB_Nature ) ;
2017-05-23 04:55:05 +00:00
pkm . AltForm = CB_Form . SelectedIndex ;
2017-06-18 01:37:19 +00:00
pkm . SetPIDGender ( newGender ) ;
2017-05-23 04:55:05 +00:00
TB_PID . Text = pkm . PID . ToString ( "X8" ) ;
}
pkm . Gender = newGender ;
Label_Gender . Text = gendersymbols [ pkm . Gender ] ;
2017-06-18 01:37:19 +00:00
Label_Gender . ForeColor = GetGenderColor ( pkm . Gender ) ;
2017-05-23 04:55:05 +00:00
2017-06-18 01:37:19 +00:00
if ( PKX . GetGender ( CB_Form . Text ) < 2 ) // Gendered Forms
CB_Form . SelectedIndex = PKX . GetGender ( Label_Gender . Text ) ;
2017-05-23 04:55:05 +00:00
UpdatePreviewSprite ( Label_Gender , null ) ;
}
2017-06-18 01:37:19 +00:00
private void ClickPPUps ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
2017-06-18 01:37:19 +00:00
CB_PPu1 . SelectedIndex = ModifierKeys ! = Keys . Control & & WinFormsUtil . GetIndex ( CB_Move1 ) > 0 ? 3 : 0 ;
CB_PPu2 . SelectedIndex = ModifierKeys ! = Keys . Control & & WinFormsUtil . GetIndex ( CB_Move2 ) > 0 ? 3 : 0 ;
CB_PPu3 . SelectedIndex = ModifierKeys ! = Keys . Control & & WinFormsUtil . GetIndex ( CB_Move3 ) > 0 ? 3 : 0 ;
CB_PPu4 . SelectedIndex = ModifierKeys ! = Keys . Control & & WinFormsUtil . GetIndex ( CB_Move4 ) > 0 ? 3 : 0 ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void ClickMarking ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
PictureBox [ ] pba = { PB_Mark1 , PB_Mark2 , PB_Mark3 , PB_Mark4 , PB_Mark5 , PB_Mark6 } ;
int index = Array . IndexOf ( pba , sender ) ;
// Handling Gens 3-6
int [ ] markings = pkm . Markings ;
switch ( pkm . Format )
{
case 3 :
case 4 :
case 5 :
case 6 : // on/off
markings [ index ] ^ = 1 ; // toggle
pkm . Markings = markings ;
break ;
case 7 : // 0 (none) | 1 (blue) | 2 (pink)
markings [ index ] = ( markings [ index ] + 1 ) % 3 ; // cycle
pkm . Markings = markings ;
break ;
default :
return ;
}
2017-06-18 01:37:19 +00:00
SetMarkings ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void ClickStatLabel ( object sender , MouseEventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! ( ModifierKeys = = Keys . Control | | ModifierKeys = = Keys . Alt ) )
return ;
if ( sender = = Label_SPC )
sender = Label_SPA ;
int index = Array . IndexOf ( new [ ] { Label_HP , Label_ATK , Label_DEF , Label_SPA , Label_SPD , Label_SPE } , sender ) ;
if ( ModifierKeys = = Keys . Alt ) // EV
{
var mt = new [ ] { TB_HPEV , TB_ATKEV , TB_DEFEV , TB_SPAEV , TB_SPDEV , TB_SPEEV } [ index ] ;
if ( e . Button = = MouseButtons . Left ) // max
mt . Text = pkm . Format > = 3
? Math . Min ( Math . Max ( 510 - Util . ToInt32 ( TB_EVTotal . Text ) + Util . ToInt32 ( mt . Text ) , 0 ) , 252 ) . ToString ( )
: ushort . MaxValue . ToString ( ) ;
else // min
mt . Text = 0. ToString ( ) ;
}
else
new [ ] { TB_HPIV , TB_ATKIV , TB_DEFIV , TB_SPAIV , TB_SPDIV , TB_SPEIV } [ index ] . Text =
( e . Button = = MouseButtons . Left ? pkm . MaxIV : 0 ) . ToString ( ) ;
}
2017-06-18 01:37:19 +00:00
private void ClickIV ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ModifierKeys = = Keys . Control )
if ( pkm . Format < 7 )
( ( MaskedTextBox ) sender ) . Text = pkm . MaxIV . ToString ( ) ;
else
{
var index = Array . IndexOf ( new [ ] { TB_HPIV , TB_ATKIV , TB_DEFIV , TB_SPAIV , TB_SPDIV , TB_SPEIV } , sender ) ;
pkm . HyperTrainInvert ( index ) ;
2017-06-18 01:37:19 +00:00
UpdateIVs ( sender , e ) ;
2017-05-23 04:55:05 +00:00
}
else if ( ModifierKeys = = Keys . Alt )
( ( MaskedTextBox ) sender ) . Text = 0. ToString ( ) ;
}
2017-06-18 01:37:19 +00:00
private void ClickEV ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
MaskedTextBox mt = ( MaskedTextBox ) sender ;
if ( ModifierKeys = = Keys . Control ) // EV
mt . Text = pkm . Format > = 3
? Math . Min ( Math . Max ( 510 - Util . ToInt32 ( TB_EVTotal . Text ) + Util . ToInt32 ( mt . Text ) , 0 ) , 252 ) . ToString ( )
: ushort . MaxValue . ToString ( ) ;
else if ( ModifierKeys = = Keys . Alt )
mt . Text = 0. ToString ( ) ;
}
2017-06-18 01:37:19 +00:00
private void ClickOT ( object sender , EventArgs e ) = > SetDetailsOT ( SaveFileRequested ? . Invoke ( this , e ) ) ;
private void ClickCT ( object sender , EventArgs e ) = > SetDetailsHT ( SaveFileRequested ? . Invoke ( this , e ) ) ;
private void ClickTRGender ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
Label lbl = sender as Label ;
if ( ! string . IsNullOrWhiteSpace ( lbl ? . Text ) ) // set gender label (toggle M/F)
{
2017-06-18 01:37:19 +00:00
int gender = PKX . GetGender ( lbl . Text ) ^ 1 ;
2017-05-23 04:55:05 +00:00
lbl . Text = gendersymbols [ gender ] ;
2017-06-18 01:37:19 +00:00
lbl . ForeColor = GetGenderColor ( gender ) ;
2017-05-23 04:55:05 +00:00
}
}
2017-06-18 04:49:14 +00:00
private void ClickBall ( object sender , EventArgs e ) = > CB_Ball . SelectedIndex = 0 ;
private void ClickShinyLeaf ( object sender , EventArgs e ) = > ShinyLeaf . CheckAll ( ModifierKeys ! = Keys . Control ) ;
2017-06-18 01:37:19 +00:00
private void ClickMetLocation ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( HaX )
return ;
2017-06-18 01:37:19 +00:00
pkm = PreparePKM ( ) ;
UpdateLegality ( skipMoveRepop : true ) ;
2017-05-23 04:55:05 +00:00
if ( Legality . Valid )
return ;
2017-06-30 02:32:29 +00:00
if ( ! SetSuggestedMetLocation ( ) )
2017-05-23 04:55:05 +00:00
return ;
2017-06-18 01:37:19 +00:00
pkm = PreparePKM ( ) ;
UpdateLegality ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void ClickGT ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! GB_nOT . Visible )
return ;
if ( sender = = GB_OT )
{
pkm . CurrentHandler = 0 ;
GB_OT . BackgroundImage = mixedHighlight ;
GB_nOT . BackgroundImage = null ;
}
else if ( TB_OTt2 . Text . Length > 0 )
{
pkm . CurrentHandler = 1 ;
GB_OT . BackgroundImage = null ;
GB_nOT . BackgroundImage = mixedHighlight ;
}
TB_Friendship . Text = pkm . CurrentFriendship . ToString ( ) ;
}
2017-06-18 01:37:19 +00:00
private void ClickMoves ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
2017-06-18 01:37:19 +00:00
UpdateLegality ( skipMoveRepop : true ) ;
2017-05-23 04:55:05 +00:00
if ( sender = = GB_CurrentMoves )
{
2017-06-18 01:37:19 +00:00
if ( ! SetSuggestedMoves ( random : ModifierKeys = = Keys . Control ) )
2017-05-23 04:55:05 +00:00
return ;
}
else if ( sender = = GB_RelearnMoves )
{
2017-06-18 01:37:19 +00:00
if ( ! SetSuggestedRelearnMoves ( ) )
return ;
}
else
{
return ;
}
UpdateLegality ( ) ;
}
2017-06-30 02:32:29 +00:00
private bool SetSuggestedMoves ( bool random = false , bool silent = false )
2017-06-18 01:37:19 +00:00
{
int [ ] m = Legality . GetSuggestedMoves ( tm : random , tutor : random , reminder : random ) ;
if ( m = = null )
{
2017-06-30 02:32:29 +00:00
if ( ! silent )
WinFormsUtil . Alert ( "Suggestions are not enabled for this PKM format." ) ;
2017-06-18 01:37:19 +00:00
return false ;
}
if ( random )
Util . Shuffle ( m ) ;
if ( m . Length > 4 )
m = m . Skip ( m . Length - 4 ) . ToArray ( ) ;
Array . Resize ( ref m , 4 ) ;
if ( pkm . Moves . SequenceEqual ( m ) )
return false ;
2017-06-30 02:32:29 +00:00
if ( ! silent )
{
var movestrings = m . Select ( v = > v > = GameInfo . Strings . movelist . Length ? "ERROR" : GameInfo . Strings . movelist [ v ] ) ;
string r = string . Join ( Environment . NewLine , movestrings ) ;
if ( DialogResult . Yes ! = WinFormsUtil . Prompt ( MessageBoxButtons . YesNo , "Apply suggested current moves?" , r ) )
return false ;
}
2017-06-18 01:37:19 +00:00
CB_Move1 . SelectedValue = m [ 0 ] ;
CB_Move2 . SelectedValue = m [ 1 ] ;
CB_Move3 . SelectedValue = m [ 2 ] ;
CB_Move4 . SelectedValue = m [ 3 ] ;
return true ;
}
2017-06-18 20:02:02 +00:00
private bool SetSuggestedRelearnMoves ( bool silent = false )
2017-06-18 01:37:19 +00:00
{
2017-06-30 02:32:29 +00:00
if ( pkm . Format < 6 )
return false ;
2017-06-18 01:37:19 +00:00
int [ ] m = Legality . GetSuggestedRelearn ( ) ;
if ( m . All ( z = > z = = 0 ) )
2017-05-23 04:55:05 +00:00
if ( ! pkm . WasEgg & & ! pkm . WasEvent & & ! pkm . WasEventEgg & & ! pkm . WasLink )
{
2017-06-18 01:37:19 +00:00
var encounter = Legality . GetSuggestedMetInfo ( ) ;
2017-05-23 04:55:05 +00:00
if ( encounter ! = null )
m = encounter . Relearn ;
}
2017-06-18 01:37:19 +00:00
if ( pkm . RelearnMoves . SequenceEqual ( m ) )
return false ;
2017-05-23 04:55:05 +00:00
2017-06-30 02:32:29 +00:00
if ( ! silent )
{
var movestrings = m . Select ( v = > v > = GameInfo . Strings . movelist . Length ? "ERROR" : GameInfo . Strings . movelist [ v ] ) ;
string r = string . Join ( Environment . NewLine , movestrings ) ;
if ( DialogResult . Yes ! = WinFormsUtil . Prompt ( MessageBoxButtons . YesNo , "Apply suggested relearn moves?" , r ) )
return false ;
}
2017-05-23 04:55:05 +00:00
2017-06-18 01:37:19 +00:00
CB_RelearnMove1 . SelectedValue = m [ 0 ] ;
CB_RelearnMove2 . SelectedValue = m [ 1 ] ;
CB_RelearnMove3 . SelectedValue = m [ 2 ] ;
CB_RelearnMove4 . SelectedValue = m [ 3 ] ;
return true ;
2017-05-23 04:55:05 +00:00
}
2017-06-30 02:32:29 +00:00
private bool SetSuggestedMetLocation ( bool silent = false )
{
var encounter = Legality . GetSuggestedMetInfo ( ) ;
if ( encounter = = null | | pkm . Format > = 3 & & encounter . Location < 0 )
{
if ( ! silent )
WinFormsUtil . Alert ( "Unable to provide a suggestion." ) ;
return false ;
}
int level = encounter . Level ;
int location = encounter . Location ;
2017-08-29 01:12:57 +00:00
int minlvl = Legal . GetLowestLevel ( pkm , encounter . LevelMin ) ;
2017-06-30 02:32:29 +00:00
if ( minlvl = = 0 )
minlvl = level ;
if ( pkm . CurrentLevel > = minlvl & & pkm . Met_Level = = level & & pkm . Met_Location = = location )
return false ;
if ( minlvl < level )
minlvl = level ;
if ( ! silent )
{
var suggestion = new List < string > { "Suggested:" } ;
if ( pkm . Format > = 3 )
{
var met_list = GameInfo . GetLocationList ( ( GameVersion ) pkm . Version , pkm . Format , egg : false ) ;
var locstr = met_list . FirstOrDefault ( loc = > loc . Value = = location ) . Text ;
suggestion . Add ( $"Met Location: {locstr}" ) ;
suggestion . Add ( $"Met Level: {level}" ) ;
}
if ( pkm . CurrentLevel < minlvl )
suggestion . Add ( $"Current Level: {minlvl}" ) ;
if ( suggestion . Count = = 1 ) // no suggestion
return false ;
string suggest = string . Join ( Environment . NewLine , suggestion ) ;
if ( WinFormsUtil . Prompt ( MessageBoxButtons . YesNo , suggest ) ! = DialogResult . Yes )
return false ;
}
if ( pkm . Format > = 3 )
{
TB_MetLevel . Text = level . ToString ( ) ;
CB_MetLocation . SelectedValue = location ;
2017-08-06 03:30:33 +00:00
if ( pkm . GenNumber = = 6 & & pkm . WasEgg & & ModifyPKM )
{
pkm . OT_Memory = 2 ;
pkm . OT_Affection = 0 ;
pkm . OT_Feeling = Util . Rand . Next ( 0 , 9 ) ;
pkm . OT_Intensity = 1 ;
pkm . OT_TextVar = pkm . XY ? 43 : 27 ; // riverside road : battling spot
}
2017-06-30 02:32:29 +00:00
}
if ( pkm . CurrentLevel < minlvl )
TB_Level . Text = minlvl . ToString ( ) ;
return true ;
}
2017-07-15 16:48:08 +00:00
private void CheckTransferPIDValid ( )
{
if ( pkm . Version > = 24 )
return ;
uint EC = Util . GetHexValue ( TB_EC . Text ) ;
uint PID = Util . GetHexValue ( TB_PID . Text ) ;
uint SID = Util . ToUInt32 ( TB_SID . Text ) ;
uint TID = Util . ToUInt32 ( TB_TID . Text ) ;
uint LID = PID & 0xFFFF ;
uint HID = PID > > 16 ;
uint XOR = TID ^ LID ^ SID ^ HID ;
// Ensure we don't have a shiny.
if ( XOR > > 3 = = 1 ) // Illegal, fix. (not 16<XOR>=8)
{
// Keep as shiny, so we have to mod the PID
PID ^ = XOR ;
TB_PID . Text = PID . ToString ( "X8" ) ;
TB_EC . Text = PID . ToString ( "X8" ) ;
}
else if ( ( XOR ^ 0x8000 ) > > 3 = = 1 & & PID ! = EC )
TB_EC . Text = ( PID ^ 0x80000000 ) . ToString ( "X8" ) ;
else // Not Illegal, no fix.
TB_EC . Text = PID . ToString ( "X8" ) ;
}
2017-05-23 04:55:05 +00:00
2017-06-18 01:37:19 +00:00
private void UpdateIVs ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( changingFields | | ! fieldsInitialized ) return ;
if ( sender ! = null & & Util . ToInt32 ( ( ( MaskedTextBox ) sender ) . Text ) > pkm . MaxIV )
( ( MaskedTextBox ) sender ) . Text = pkm . MaxIV . ToString ( "00" ) ;
changingFields = true ;
// Update IVs
pkm . IV_HP = Util . ToInt32 ( TB_HPIV . Text ) ;
pkm . IV_ATK = Util . ToInt32 ( TB_ATKIV . Text ) ;
pkm . IV_DEF = Util . ToInt32 ( TB_DEFIV . Text ) ;
pkm . IV_SPE = Util . ToInt32 ( TB_SPEIV . Text ) ;
pkm . IV_SPA = Util . ToInt32 ( TB_SPAIV . Text ) ;
pkm . IV_SPD = Util . ToInt32 ( TB_SPDIV . Text ) ;
var IV_Boxes = new [ ] { TB_HPIV , TB_ATKIV , TB_DEFIV , TB_SPAIV , TB_SPDIV , TB_SPEIV } ;
var HT_Vals = new [ ] { pkm . HT_HP , pkm . HT_ATK , pkm . HT_DEF , pkm . HT_SPA , pkm . HT_SPD , pkm . HT_SPE } ;
for ( int i = 0 ; i < IV_Boxes . Length ; i + + )
if ( HT_Vals [ i ] )
IV_Boxes [ i ] . BackColor = Color . LightGreen ;
else
IV_Boxes [ i ] . ResetBackColor ( ) ;
if ( pkm . Format < 3 )
{
TB_HPIV . Text = pkm . IV_HP . ToString ( ) ;
TB_SPDIV . Text = TB_SPAIV . Text ;
if ( pkm . Format = = 2 )
{
Label_Gender . Text = gendersymbols [ pkm . Gender ] ;
2017-06-18 01:37:19 +00:00
Label_Gender . ForeColor = GetGenderColor ( pkm . Gender ) ;
2017-05-23 04:55:05 +00:00
if ( pkm . Species = = 201 & & e ! = null ) // Unown
CB_Form . SelectedIndex = pkm . AltForm ;
}
2017-06-18 01:37:19 +00:00
SetIsShiny ( null ) ;
2017-06-19 05:27:40 +00:00
UpdateSprite ( ) ;
2017-05-23 04:55:05 +00:00
}
CB_HPType . SelectedValue = pkm . HPType ;
changingFields = false ;
// Potential Reading
L_Potential . Text = ( Unicode
? new [ ] { "★☆☆☆" , "★★☆☆" , "★★★☆" , "★★★★" }
: new [ ] { "+" , "++" , "+++" , "++++" }
) [ pkm . PotentialRating ] ;
TB_IVTotal . Text = pkm . IVs . Sum ( ) . ToString ( ) ;
int characteristic = pkm . Characteristic ;
L_Characteristic . Visible = Label_CharacteristicPrefix . Visible = characteristic > - 1 ;
if ( characteristic > - 1 )
L_Characteristic . Text = GameInfo . Strings . characteristics [ pkm . Characteristic ] ;
2017-06-18 01:37:19 +00:00
UpdateStats ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateEVs ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( sender is MaskedTextBox m )
{
if ( Util . ToInt32 ( m . Text ) > pkm . MaxEV )
{ m . Text = pkm . MaxEV . ToString ( ) ; return ; } // recursive on text set
}
changingFields = true ;
if ( sender = = TB_HPEV ) pkm . EV_HP = Util . ToInt32 ( TB_HPEV . Text ) ;
else if ( sender = = TB_ATKEV ) pkm . EV_ATK = Util . ToInt32 ( TB_ATKEV . Text ) ;
else if ( sender = = TB_DEFEV ) pkm . EV_DEF = Util . ToInt32 ( TB_DEFEV . Text ) ;
else if ( sender = = TB_SPEEV ) pkm . EV_SPE = Util . ToInt32 ( TB_SPEEV . Text ) ;
else if ( sender = = TB_SPAEV ) pkm . EV_SPA = Util . ToInt32 ( TB_SPAEV . Text ) ;
else if ( sender = = TB_SPDEV ) pkm . EV_SPD = Util . ToInt32 ( TB_SPDEV . Text ) ;
if ( pkm . Format < 3 )
TB_SPDEV . Text = TB_SPAEV . Text ;
int evtotal = pkm . EVs . Sum ( ) ;
if ( evtotal > 510 ) // Background turns Red
TB_EVTotal . BackColor = Color . Red ;
else if ( evtotal = = 510 ) // Maximum EVs
TB_EVTotal . BackColor = Color . Honeydew ;
else if ( evtotal = = 508 ) // Fishy EVs
TB_EVTotal . BackColor = Color . LightYellow ;
else TB_EVTotal . BackColor = TB_IVTotal . BackColor ;
TB_EVTotal . Text = evtotal . ToString ( ) ;
EVTip . SetToolTip ( TB_EVTotal , $"Remaining: {510 - evtotal}" ) ;
changingFields = false ;
2017-06-18 01:37:19 +00:00
UpdateStats ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateBall ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
2017-06-18 01:37:19 +00:00
PB_Ball . Image = PKMUtil . GetBallSprite ( WinFormsUtil . GetIndex ( CB_Ball ) ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateEXPLevel ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( changingFields | | ! fieldsInitialized ) return ;
changingFields = true ;
if ( sender = = TB_EXP )
{
// Change the Level
uint EXP = Util . ToUInt32 ( TB_EXP . Text ) ;
2017-06-18 01:37:19 +00:00
int Species = WinFormsUtil . GetIndex ( CB_Species ) ;
int Level = PKX . GetLevel ( Species , EXP ) ;
2017-05-23 04:55:05 +00:00
if ( Level = = 100 )
2017-06-18 01:37:19 +00:00
EXP = PKX . GetEXP ( 100 , Species ) ;
2017-05-23 04:55:05 +00:00
TB_Level . Text = Level . ToString ( ) ;
if ( ! HaX )
TB_EXP . Text = EXP . ToString ( ) ;
else if ( Level < = 100 & & Util . ToInt32 ( MT_Level . Text ) < = 100 )
MT_Level . Text = Level . ToString ( ) ;
}
else
{
// Change the XP
int Level = Util . ToInt32 ( ( HaX ? MT_Level : TB_Level ) . Text ) ;
2017-06-21 05:57:22 +00:00
if ( Level < = 0 )
TB_Level . Text = "1" ;
else if ( Level > 100 )
2017-05-24 00:46:32 +00:00
{
TB_Level . Text = "100" ;
if ( ! HaX )
Level = 100 ;
}
2017-05-23 04:55:05 +00:00
if ( Level > byte . MaxValue ) MT_Level . Text = "255" ;
if ( Level < = 100 )
2017-06-18 01:37:19 +00:00
TB_EXP . Text = PKX . GetEXP ( Level , WinFormsUtil . GetIndex ( CB_Species ) ) . ToString ( ) ;
2017-05-23 04:55:05 +00:00
}
changingFields = false ;
if ( fieldsLoaded ) // store values back
{
pkm . EXP = Util . ToUInt32 ( TB_EXP . Text ) ;
pkm . Stat_Level = Util . ToInt32 ( ( HaX ? MT_Level : TB_Level ) . Text ) ;
}
2017-06-18 01:37:19 +00:00
UpdateStats ( ) ;
UpdateLegality ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateHPType ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( changingFields | | ! fieldsInitialized ) return ;
changingFields = true ;
int [ ] ivs =
{
Util . ToInt32 ( TB_HPIV . Text ) , Util . ToInt32 ( TB_ATKIV . Text ) , Util . ToInt32 ( TB_DEFIV . Text ) ,
Util . ToInt32 ( TB_SPAIV . Text ) , Util . ToInt32 ( TB_SPDIV . Text ) , Util . ToInt32 ( TB_SPEIV . Text )
} ;
// Change IVs to match the new Hidden Power
2017-06-18 01:37:19 +00:00
int [ ] newIVs = PKX . SetHPIVs ( WinFormsUtil . GetIndex ( CB_HPType ) , ivs ) ;
2017-05-23 04:55:05 +00:00
TB_HPIV . Text = newIVs [ 0 ] . ToString ( ) ;
TB_ATKIV . Text = newIVs [ 1 ] . ToString ( ) ;
TB_DEFIV . Text = newIVs [ 2 ] . ToString ( ) ;
TB_SPAIV . Text = newIVs [ 3 ] . ToString ( ) ;
TB_SPDIV . Text = newIVs [ 4 ] . ToString ( ) ;
TB_SPEIV . Text = newIVs [ 5 ] . ToString ( ) ;
// Refresh View
changingFields = false ;
2017-06-18 01:37:19 +00:00
UpdateIVs ( null , null ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateRandomIVs ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
changingFields = true ;
if ( ModifierKeys = = Keys . Control | | ModifierKeys = = Keys . Shift ) // Max IVs
{
TB_HPIV . Text = TB_ATKIV . Text = TB_DEFIV . Text = TB_SPAIV . Text = TB_SPDIV . Text = TB_SPEIV . Text = pkm . MaxIV . ToString ( ) ;
}
else
{
2017-06-18 01:37:19 +00:00
var IVs = pkm . SetRandomIVs ( ) ;
2017-05-23 04:55:05 +00:00
var IVBoxes = new [ ] { TB_HPIV , TB_ATKIV , TB_DEFIV , TB_SPAIV , TB_SPDIV , TB_SPEIV } ;
for ( int i = 0 ; i < 6 ; i + + )
IVBoxes [ i ] . Text = IVs [ i ] . ToString ( ) ;
}
changingFields = false ;
2017-06-18 01:37:19 +00:00
UpdateIVs ( null , e ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateRandomEVs ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
changingFields = true ;
var tb = new [ ] { TB_HPEV , TB_ATKEV , TB_DEFEV , TB_SPAEV , TB_SPDEV , TB_SPEEV } ;
bool zero = ModifierKeys = = Keys . Control | | ModifierKeys = = Keys . Shift ;
2017-06-18 01:37:19 +00:00
var evs = zero ? new uint [ 6 ] : PKX . GetRandomEVs ( pkm . Format ) ;
2017-05-23 04:55:05 +00:00
for ( int i = 0 ; i < 6 ; i + + )
tb [ i ] . Text = evs [ i ] . ToString ( ) ;
changingFields = false ;
2017-06-18 01:37:19 +00:00
UpdateEVs ( null , null ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateRandomPID ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( pkm . Format < 3 )
return ;
if ( fieldsLoaded )
2017-06-18 01:37:19 +00:00
pkm . PID = Util . GetHexValue ( TB_PID . Text ) ;
2017-05-23 04:55:05 +00:00
if ( sender = = Label_Gender )
2017-06-18 01:37:19 +00:00
pkm . SetPIDGender ( pkm . Gender ) ;
else if ( sender = = CB_Nature & & pkm . Nature ! = WinFormsUtil . GetIndex ( CB_Nature ) )
pkm . SetPIDNature ( WinFormsUtil . GetIndex ( CB_Nature ) ) ;
2017-05-23 04:55:05 +00:00
else if ( sender = = BTN_RerollPID )
2017-06-18 01:37:19 +00:00
pkm . SetPIDGender ( pkm . Gender ) ;
2017-05-23 04:55:05 +00:00
else if ( sender = = CB_Ability & & CB_Ability . SelectedIndex ! = pkm . PIDAbility & & pkm . PIDAbility > - 1 )
2017-06-18 01:37:19 +00:00
pkm . PID = PKX . GetRandomPID ( pkm . Species , pkm . Gender , pkm . Version , pkm . Nature , pkm . Format , ( uint ) ( CB_Ability . SelectedIndex * 0x10001 ) ) ;
2017-05-23 04:55:05 +00:00
TB_PID . Text = pkm . PID . ToString ( "X8" ) ;
2017-06-18 01:37:19 +00:00
SetIsShiny ( null ) ;
2017-06-19 05:27:40 +00:00
UpdateSprite ( ) ;
2017-05-23 04:55:05 +00:00
if ( pkm . GenNumber < 6 & & pkm . Format > = 6 )
TB_EC . Text = TB_PID . Text ;
}
2017-06-18 01:37:19 +00:00
private void UpdateRandomEC ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( pkm . Format < 6 )
return ;
2017-06-18 01:37:19 +00:00
int wIndex = Array . IndexOf ( Legal . WurmpleEvolutions , WinFormsUtil . GetIndex ( CB_Species ) ) ;
2017-07-17 22:58:09 +00:00
uint EC = wIndex < 0 ? Util . Rand32 ( ) : PKX . GetWurmpleEC ( wIndex / 2 ) ;
TB_EC . Text = EC . ToString ( "X8" ) ;
2017-06-18 01:37:19 +00:00
UpdateLegality ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateHackedStats ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
Stat_HP . Enabled =
Stat_ATK . Enabled =
Stat_DEF . Enabled =
Stat_SPA . Enabled =
Stat_SPD . Enabled =
Stat_SPE . Enabled = CHK_HackedStats . Checked ;
}
2017-06-18 01:37:19 +00:00
private void UpdateHackedStatText ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! CHK_HackedStats . Checked | | ! ( sender is TextBox tb ) )
return ;
string text = tb . Text ;
if ( string . IsNullOrWhiteSpace ( text ) )
tb . Text = "0" ;
if ( Convert . ToUInt32 ( text ) > ushort . MaxValue )
tb . Text = "65535" ;
}
2017-06-18 01:37:19 +00:00
private void Update255_MTB ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! ( sender is MaskedTextBox tb ) ) return ;
if ( Util . ToInt32 ( tb . Text ) > byte . MaxValue )
tb . Text = "255" ;
}
2017-06-18 01:37:19 +00:00
private void UpdateForm ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( CB_Form = = sender & & fieldsLoaded )
pkm . AltForm = CB_Form . SelectedIndex ;
2017-06-18 01:37:19 +00:00
UpdateGender ( ) ;
UpdateStats ( ) ;
2017-05-23 04:55:05 +00:00
// Repopulate Abilities if Species Form has different abilities
2017-06-18 01:37:19 +00:00
SetAbilityList ( ) ;
2017-05-23 04:55:05 +00:00
// Gender Forms
2017-06-18 01:37:19 +00:00
if ( WinFormsUtil . GetIndex ( CB_Species ) = = 201 & & fieldsLoaded )
2017-05-23 04:55:05 +00:00
{
if ( pkm . Format = = 3 )
{
2017-06-18 01:37:19 +00:00
pkm . SetPIDUnown3 ( CB_Form . SelectedIndex ) ;
2017-05-23 04:55:05 +00:00
TB_PID . Text = pkm . PID . ToString ( "X8" ) ;
}
else if ( pkm . Format = = 2 )
{
int desiredForm = CB_Form . SelectedIndex ;
while ( pkm . AltForm ! = desiredForm )
2017-06-18 01:37:19 +00:00
UpdateRandomIVs ( null , null ) ;
2017-05-23 04:55:05 +00:00
}
}
2017-06-18 01:37:19 +00:00
else if ( PKX . GetGender ( CB_Form . Text ) < 2 )
2017-05-23 04:55:05 +00:00
{
if ( CB_Form . Items . Count = = 2 ) // actually M/F; Pumpkaboo formes in German are S,M,L,XL
2017-06-18 01:37:19 +00:00
Label_Gender . Text = gendersymbols [ PKX . GetGender ( CB_Form . Text ) ] ;
2017-05-23 04:55:05 +00:00
}
if ( changingFields )
return ;
changingFields = true ;
MT_Form . Text = CB_Form . SelectedIndex . ToString ( ) ;
changingFields = false ;
2017-06-19 05:27:40 +00:00
UpdateSprite ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateHaXForm ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( changingFields )
return ;
changingFields = true ;
int form = pkm . AltForm = Util . ToInt32 ( MT_Form . Text ) ;
CB_Form . SelectedIndex = CB_Form . Items . Count > form ? form : - 1 ;
changingFields = false ;
2017-06-19 05:27:40 +00:00
UpdateSprite ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdatePP ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
ComboBox [ ] cbs = { CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 } ;
ComboBox [ ] pps = { CB_PPu1 , CB_PPu2 , CB_PPu3 , CB_PPu4 } ;
MaskedTextBox [ ] tbs = { TB_PP1 , TB_PP2 , TB_PP3 , TB_PP4 } ;
int index = Array . IndexOf ( cbs , sender ) ;
if ( index < 0 )
index = Array . IndexOf ( pps , sender ) ;
if ( index < 0 )
return ;
2017-06-18 01:37:19 +00:00
int move = WinFormsUtil . GetIndex ( cbs [ index ] ) ;
2017-05-23 04:55:05 +00:00
int pp = pps [ index ] . SelectedIndex ;
if ( move = = 0 & & pp ! = 0 )
{
pps [ index ] . SelectedIndex = 0 ;
return ; // recursively triggers
}
2017-06-18 01:37:19 +00:00
tbs [ index ] . Text = pkm . GetMovePP ( move , pp ) . ToString ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdatePKRSstrain ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
// Change the PKRS Days to the legal bounds.
int currentDuration = CB_PKRSDays . SelectedIndex ;
CB_PKRSDays . Items . Clear ( ) ;
foreach ( int day in Enumerable . Range ( 0 , CB_PKRSStrain . SelectedIndex % 4 + 2 ) ) CB_PKRSDays . Items . Add ( day ) ;
// Set the days back if they're legal, else set it to 1. (0 always passes).
CB_PKRSDays . SelectedIndex = currentDuration < CB_PKRSDays . Items . Count ? currentDuration : 1 ;
if ( CB_PKRSStrain . SelectedIndex ! = 0 ) return ;
// Never Infected
CB_PKRSDays . SelectedIndex = 0 ;
CHK_Cured . Checked = false ;
CHK_Infected . Checked = false ;
}
2017-06-18 01:37:19 +00:00
private void UpdatePKRSdays ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( CB_PKRSDays . SelectedIndex ! = 0 ) return ;
// If no days are selected
if ( CB_PKRSStrain . SelectedIndex = = 0 )
CHK_Cured . Checked = CHK_Infected . Checked = false ; // No Strain = Never Cured / Infected, triggers Strain update
else CHK_Cured . Checked = true ; // Any Strain = Cured
}
2017-06-18 01:37:19 +00:00
private void UpdatePKRSCured ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! fieldsInitialized ) return ;
// Cured PokeRus is toggled
if ( CHK_Cured . Checked )
{
// Has Had PokeRus
Label_PKRSdays . Visible = CB_PKRSDays . Visible = false ;
CB_PKRSDays . SelectedIndex = 0 ;
Label_PKRS . Visible = CB_PKRSStrain . Visible = true ;
CHK_Infected . Checked = true ;
// If we're cured we have to have a strain infection.
if ( CB_PKRSStrain . SelectedIndex = = 0 )
CB_PKRSStrain . SelectedIndex = 1 ;
}
else if ( ! CHK_Infected . Checked )
{
// Not Infected, Disable the other
Label_PKRS . Visible = CB_PKRSStrain . Visible = false ;
CB_PKRSStrain . SelectedIndex = 0 ;
}
else
{
// Still Infected for a duration
Label_PKRSdays . Visible = CB_PKRSDays . Visible = true ;
CB_PKRSDays . SelectedValue = 1 ;
}
// if not cured yet, days > 0
if ( ! CHK_Cured . Checked & & CHK_Infected . Checked & & CB_PKRSDays . SelectedIndex = = 0 )
CB_PKRSDays . SelectedIndex + + ;
2017-06-18 01:37:19 +00:00
SetMarkings ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdatePKRSInfected ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! fieldsInitialized ) return ;
if ( CHK_Cured . Checked & & ! CHK_Infected . Checked ) { CHK_Cured . Checked = false ; return ; }
if ( CHK_Cured . Checked ) return ;
Label_PKRS . Visible = CB_PKRSStrain . Visible = CHK_Infected . Checked ;
if ( ! CHK_Infected . Checked ) { CB_PKRSStrain . SelectedIndex = 0 ; CB_PKRSDays . SelectedIndex = 0 ; Label_PKRSdays . Visible = CB_PKRSDays . Visible = false ; }
2017-06-18 01:37:19 +00:00
else if ( CB_PKRSStrain . SelectedIndex = = 0 ) { CB_PKRSStrain . SelectedIndex = 1 ; Label_PKRSdays . Visible = CB_PKRSDays . Visible = true ; UpdatePKRSCured ( sender , e ) ; }
2017-05-23 04:55:05 +00:00
// if not cured yet, days > 0
if ( CHK_Infected . Checked & & CB_PKRSDays . SelectedIndex = = 0 ) CB_PKRSDays . SelectedIndex + + ;
}
2017-06-18 01:37:19 +00:00
private void UpdateCountry ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
2017-06-18 01:37:19 +00:00
if ( WinFormsUtil . GetIndex ( sender as ComboBox ) > 0 )
SetCountrySubRegion ( CB_SubRegion , "sr_" + WinFormsUtil . GetIndex ( sender as ComboBox ) . ToString ( "000" ) ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateSpecies ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
// Get Species dependent information
2017-05-28 20:19:48 +00:00
if ( fieldsLoaded )
2017-06-18 01:37:19 +00:00
pkm . Species = WinFormsUtil . GetIndex ( CB_Species ) ;
SetAbilityList ( ) ;
SetForms ( ) ;
UpdateForm ( null , null ) ;
2017-05-23 04:55:05 +00:00
if ( ! fieldsLoaded )
return ;
// Recalculate EXP for Given Level
2017-06-18 01:37:19 +00:00
uint EXP = PKX . GetEXP ( pkm . CurrentLevel , pkm . Species ) ;
2017-05-23 04:55:05 +00:00
TB_EXP . Text = EXP . ToString ( ) ;
// Check for Gender Changes
2017-06-18 01:37:19 +00:00
UpdateGender ( ) ;
2017-05-23 04:55:05 +00:00
// If species changes and no nickname, set the new name == speciesName.
if ( ! CHK_Nicknamed . Checked )
2017-06-18 01:37:19 +00:00
UpdateNickname ( sender , e ) ;
2017-05-23 04:55:05 +00:00
2017-06-18 01:37:19 +00:00
UpdateLegality ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateOriginGame ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
2017-06-18 01:37:19 +00:00
GameVersion Version = ( GameVersion ) WinFormsUtil . GetIndex ( CB_GameOrigin ) ;
2017-05-23 04:55:05 +00:00
// check if differs
2017-06-18 01:37:19 +00:00
GameVersion newTrack = GameUtil . GetMetLocationVersionGroup ( Version ) ;
2017-05-23 04:55:05 +00:00
if ( newTrack ! = origintrack )
{
2017-06-18 01:37:19 +00:00
var met_list = GameInfo . GetLocationList ( Version , pkm . Format , egg : false ) ;
2017-05-23 04:55:05 +00:00
CB_MetLocation . DisplayMember = "Text" ;
CB_MetLocation . ValueMember = "Value" ;
CB_MetLocation . DataSource = new BindingSource ( met_list , null ) ;
2017-08-13 07:21:42 +00:00
if ( fieldsLoaded )
2017-05-23 04:55:05 +00:00
{
2017-08-13 07:21:42 +00:00
int metLoc = 0 ; // transporter or pal park for past gen pkm
switch ( newTrack )
{
case GameVersion . GO : metLoc = 30012 ; break ;
case GameVersion . RBY : metLoc = 30013 ; break ;
}
if ( metLoc ! = 0 )
CB_MetLocation . SelectedValue = metLoc ;
else
CB_MetLocation . SelectedIndex = metLoc ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
var egg_list = GameInfo . GetLocationList ( Version , pkm . Format , egg : true ) ;
2017-05-23 04:55:05 +00:00
CB_EggLocation . DisplayMember = "Text" ;
CB_EggLocation . ValueMember = "Value" ;
CB_EggLocation . DataSource = new BindingSource ( egg_list , null ) ;
2017-08-13 07:21:42 +00:00
if ( fieldsLoaded )
CB_EggLocation . SelectedIndex = CHK_AsEgg . Checked ? 1 : 0 ; // daycare : none
2017-05-23 04:55:05 +00:00
origintrack = newTrack ;
// Stretch C/XD met location dropdowns
int width = CB_EggLocation . DropDownWidth ;
if ( Version = = GameVersion . CXD & & pkm . Format = = 3 )
width = 2 * width ;
CB_MetLocation . DropDownWidth = width ;
2017-08-13 07:21:42 +00:00
2017-08-17 23:43:54 +00:00
if ( ! fieldsLoaded )
CB_GameOrigin . Focus ( ) ; // hacky validation forcing
2017-05-23 04:55:05 +00:00
}
// Visibility logic for Gen 4 encounter type; only show for Gen 4 Pokemon.
if ( pkm . Format > = 4 )
{
bool g4 = Version > = GameVersion . HG & & Version < = GameVersion . Pt ;
if ( ( int ) Version = = 9 ) // invalid
g4 = false ;
CB_EncounterType . Visible = Label_EncounterType . Visible = g4 & & pkm . Format < 7 ;
if ( ! g4 )
CB_EncounterType . SelectedValue = 0 ;
}
if ( ! fieldsLoaded )
return ;
pkm . Version = ( int ) Version ;
2017-06-18 01:37:19 +00:00
SetMarkings ( ) ; // Set/Remove KB marking
UpdateLegality ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateExtraByteValue ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( CB_ExtraBytes . Items . Count = = 0 )
return ;
// Changed Extra Byte's Value
if ( Util . ToInt32 ( ( ( MaskedTextBox ) sender ) . Text ) > byte . MaxValue )
( ( MaskedTextBox ) sender ) . Text = "255" ;
int value = Util . ToInt32 ( TB_ExtraByte . Text ) ;
int offset = Convert . ToInt32 ( CB_ExtraBytes . Text , 16 ) ;
pkm . Data [ offset ] = ( byte ) value ;
}
2017-06-18 01:37:19 +00:00
private void UpdateExtraByteIndex ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( CB_ExtraBytes . Items . Count = = 0 )
return ;
// Byte changed, need to refresh the Text box for the byte's value.
TB_ExtraByte . Text = pkm . Data [ Convert . ToInt32 ( CB_ExtraBytes . Text , 16 ) ] . ToString ( ) ;
}
2017-06-18 01:37:19 +00:00
private void UpdateNatureModification ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( sender ! = CB_Nature ) return ;
2017-06-18 01:37:19 +00:00
int nature = WinFormsUtil . GetIndex ( CB_Nature ) ;
2017-05-23 04:55:05 +00:00
int incr = nature / 5 ;
int decr = nature % 5 ;
Label [ ] labarray = { Label_ATK , Label_DEF , Label_SPE , Label_SPA , Label_SPD } ;
// Reset Label Colors
foreach ( Label label in labarray )
label . ResetForeColor ( ) ;
// Set Colored StatLabels only if Nature isn't Neutral
NatureTip . SetToolTip ( CB_Nature ,
incr ! = decr
? $"+{labarray[incr].Text} / -{labarray[decr].Text}" . Replace ( ":" , "" )
: "-/-" ) ;
}
2017-06-18 01:37:19 +00:00
private void UpdateIsNicknamed ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! fieldsLoaded )
return ;
pkm . Nickname = TB_Nickname . Text ;
if ( CHK_Nicknamed . Checked )
return ;
2017-06-18 01:37:19 +00:00
int species = WinFormsUtil . GetIndex ( CB_Species ) ;
2017-05-23 04:55:05 +00:00
if ( species < 1 | | species > pkm . MaxSpeciesID )
return ;
if ( CHK_IsEgg . Checked )
species = 0 ; // get the egg name.
2017-06-18 01:37:19 +00:00
if ( PKX . IsNicknamedAnyLanguage ( species , TB_Nickname . Text , pkm . Format ) )
2017-05-23 04:55:05 +00:00
CHK_Nicknamed . Checked = true ;
}
2017-06-18 01:37:19 +00:00
private void UpdateNickname ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
2017-06-17 01:56:17 +00:00
if ( sender = = Label_Species )
{
switch ( ModifierKeys )
{
case Keys . Control : RequestShowdownImport ? . Invoke ( sender , e ) ; return ;
case Keys . Alt : RequestShowdownExport ? . Invoke ( sender , e ) ; return ;
default :
if ( pkm is PK1 pk1 )
pk1 . Catch_Rate = pk1 . PersonalInfo . CatchRate ;
return ;
}
}
2017-05-23 04:55:05 +00:00
2017-06-18 01:37:19 +00:00
int lang = WinFormsUtil . GetIndex ( CB_Language ) ;
2017-05-23 04:55:05 +00:00
if ( ! fieldsInitialized | | CHK_Nicknamed . Checked )
return ;
// Fetch Current Species and set it as Nickname Text
2017-06-18 01:37:19 +00:00
int species = WinFormsUtil . GetIndex ( CB_Species ) ;
2017-05-23 04:55:05 +00:00
if ( species < 1 | | species > pkm . MaxSpeciesID )
{ TB_Nickname . Text = "" ; return ; }
if ( CHK_IsEgg . Checked )
species = 0 ; // get the egg name.
// If name is that of another language, don't replace the nickname
2017-06-18 01:37:19 +00:00
if ( sender ! = CB_Language & & species ! = 0 & & ! PKX . IsNicknamedAnyLanguage ( species , TB_Nickname . Text , pkm . Format ) )
2017-05-23 04:55:05 +00:00
return ;
2017-06-18 01:37:19 +00:00
TB_Nickname . Text = PKX . GetSpeciesNameGeneration ( species , lang , pkm . Format ) ;
2017-05-23 04:55:05 +00:00
if ( pkm . Format = = 1 )
2017-06-18 01:37:19 +00:00
( ( PK1 ) pkm ) . SetNotNicknamed ( ) ;
2017-05-23 04:55:05 +00:00
if ( pkm . Format = = 2 )
2017-06-18 01:37:19 +00:00
( ( PK2 ) pkm ) . SetNotNicknamed ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateNicknameClick ( object sender , MouseEventArgs e )
2017-05-23 04:55:05 +00:00
{
TextBox tb = sender as TextBox ? ? TB_Nickname ;
// Special Character Form
if ( ModifierKeys ! = Keys . Control )
return ;
var SAV = RequestSaveFile ;
if ( SAV = = null ) // form did not provide the needed info
return ;
if ( tb = = TB_Nickname )
{
pkm . Nickname = tb . Text ;
2017-06-18 01:37:19 +00:00
var d = new TrashEditor ( tb , pkm . Nickname_Trash , SAV ) ;
2017-05-23 04:55:05 +00:00
d . ShowDialog ( ) ;
tb . Text = d . FinalString ;
pkm . Nickname_Trash = d . FinalBytes ;
}
else if ( tb = = TB_OT )
{
pkm . OT_Name = tb . Text ;
2017-06-18 01:37:19 +00:00
var d = new TrashEditor ( tb , pkm . OT_Trash , SAV ) ;
2017-05-23 04:55:05 +00:00
d . ShowDialog ( ) ;
tb . Text = d . FinalString ;
pkm . OT_Trash = d . FinalBytes ;
}
else if ( tb = = TB_OTt2 )
{
pkm . HT_Name = tb . Text ;
2017-06-18 01:37:19 +00:00
var d = new TrashEditor ( tb , pkm . HT_Trash , SAV ) ;
2017-05-23 04:55:05 +00:00
d . ShowDialog ( ) ;
tb . Text = d . FinalString ;
pkm . HT_Trash = d . FinalBytes ;
}
}
2017-06-18 01:37:19 +00:00
private void UpdateNotOT ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( string . IsNullOrWhiteSpace ( TB_OTt2 . Text ) )
{
2017-06-18 01:37:19 +00:00
ClickGT ( GB_OT , null ) ; // Switch CT over to OT.
2017-05-23 04:55:05 +00:00
Label_CTGender . Text = "" ;
TB_Friendship . Text = pkm . CurrentFriendship . ToString ( ) ;
}
else if ( string . IsNullOrWhiteSpace ( Label_CTGender . Text ) )
Label_CTGender . Text = gendersymbols [ 0 ] ;
}
2017-06-18 01:37:19 +00:00
private void UpdateIsEgg ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
// Display hatch counter if it is an egg, Display Friendship if it is not.
Label_HatchCounter . Visible = CHK_IsEgg . Checked & & pkm . Format > 1 ;
Label_Friendship . Visible = ! CHK_IsEgg . Checked & & pkm . Format > 1 ;
if ( ! fieldsLoaded )
return ;
pkm . IsEgg = CHK_IsEgg . Checked ;
if ( CHK_IsEgg . Checked )
{
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 ) ;
// if egg wasn't originally obtained by OT => Link Trade, else => None
bool isTraded = false ;
var SAV = SaveFileRequested ? . Invoke ( this , e ) ;
if ( SAV ! = null )
isTraded = SAV . OT ! = TB_OT . Text | | SAV . TID ! = Util . ToInt32 ( TB_TID . Text ) | | SAV . SID ! = Util . ToInt32 ( TB_SID . Text ) ;
CB_MetLocation . SelectedIndex = isTraded ? 2 : 0 ;
if ( ! CHK_Nicknamed . Checked )
{
2017-06-18 01:37:19 +00:00
TB_Nickname . Text = PKX . GetSpeciesNameGeneration ( 0 , WinFormsUtil . GetIndex ( CB_Language ) , pkm . Format ) ;
2017-06-21 05:57:22 +00:00
if ( pkm . Format ! = 4 ) // eggs in gen4 do not have nickname flag
CHK_Nicknamed . Checked = true ;
2017-05-23 04:55:05 +00:00
}
2017-08-06 03:30:33 +00:00
// Wipe egg memories
if ( pkm . Format > = 6 & & ModifyPKM )
pkm . OT_Memory = pkm . OT_Affection = pkm . OT_Feeling = pkm . OT_Intensity = pkm . OT_TextVar =
pkm . HT_Memory = pkm . HT_Affection = pkm . HT_Feeling = pkm . HT_Intensity = pkm . HT_TextVar = 0 ;
2017-05-23 04:55:05 +00:00
}
else // Not Egg
{
if ( ! CHK_Nicknamed . Checked )
2017-06-18 01:37:19 +00:00
UpdateNickname ( null , null ) ;
2017-05-23 04:55:05 +00:00
TB_Friendship . Text = pkm . PersonalInfo . BaseFriendship . ToString ( ) ;
if ( CB_EggLocation . SelectedIndex = = 0 )
{
CAL_EggDate . Value = new DateTime ( 2000 , 01 , 01 ) ;
CHK_AsEgg . Checked = false ;
GB_EggConditions . Enabled = false ;
}
2017-06-18 01:37:19 +00:00
if ( TB_Nickname . Text = = PKX . GetSpeciesNameGeneration ( 0 , WinFormsUtil . GetIndex ( CB_Language ) , pkm . Format ) )
2017-05-23 04:55:05 +00:00
CHK_Nicknamed . Checked = false ;
}
2017-06-18 01:37:19 +00:00
UpdateNickname ( null , null ) ;
2017-06-19 05:27:40 +00:00
UpdateSprite ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateMetAsEgg ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
GB_EggConditions . Enabled = CHK_AsEgg . Checked ;
if ( CHK_AsEgg . Checked )
{
if ( ! fieldsLoaded )
return ;
CAL_EggDate . Value = DateTime . Now ;
CB_EggLocation . SelectedIndex = 1 ;
return ;
}
// Remove egg met data
CHK_IsEgg . Checked = false ;
CAL_EggDate . Value = new DateTime ( 2000 , 01 , 01 ) ;
CB_EggLocation . SelectedValue = 0 ;
2017-06-18 01:37:19 +00:00
UpdateLegality ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateShinyPID ( object sender , EventArgs e )
2017-06-03 10:02:22 +00:00
{
var ShinyPID = pkm . Format < = 2 | | ModifierKeys ! = Keys . Control ;
2017-06-18 01:37:19 +00:00
UpdateShiny ( ShinyPID ) ;
2017-06-03 10:02:22 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateShiny ( bool PID )
2017-05-23 04:55:05 +00:00
{
pkm . TID = Util . ToInt32 ( TB_TID . Text ) ;
pkm . SID = Util . ToInt32 ( TB_SID . Text ) ;
2017-06-18 01:37:19 +00:00
pkm . PID = Util . GetHexValue ( TB_PID . Text ) ;
pkm . Nature = WinFormsUtil . GetIndex ( CB_Nature ) ;
pkm . Gender = PKX . GetGender ( Label_Gender . Text ) ;
2017-05-23 04:55:05 +00:00
pkm . AltForm = CB_Form . SelectedIndex ;
2017-06-18 01:37:19 +00:00
pkm . Version = WinFormsUtil . GetIndex ( CB_GameOrigin ) ;
2017-05-23 04:55:05 +00:00
if ( pkm . Format > 2 )
2017-06-03 10:02:22 +00:00
{
2017-06-03 15:58:30 +00:00
if ( PID )
2017-06-03 10:02:22 +00:00
{
2017-06-18 01:37:19 +00:00
pkm . SetShinyPID ( ) ;
2017-06-03 10:02:22 +00:00
TB_PID . Text = pkm . PID . ToString ( "X8" ) ;
if ( pkm . GenNumber < 6 & & TB_EC . Visible )
TB_EC . Text = TB_PID . Text ;
}
else
{
2017-06-18 01:37:19 +00:00
pkm . SetShinySID ( ) ;
2017-06-03 10:02:22 +00:00
TB_SID . Text = pkm . SID . ToString ( ) ;
}
}
2017-05-23 04:55:05 +00:00
else
{
2017-08-26 00:44:15 +00:00
pkm . SetShinyIVs ( ) ;
TB_ATKIV . Text = pkm . IV_ATK . ToString ( ) ;
TB_DEFIV . Text = pkm . IV_DEF . ToString ( ) ;
TB_SPEIV . Text = pkm . IV_SPE . ToString ( ) ;
TB_SPAIV . Text = pkm . IV_SPA . ToString ( ) ;
2017-06-18 01:37:19 +00:00
UpdateIVs ( null , null ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
SetIsShiny ( null ) ;
2017-05-23 04:55:05 +00:00
UpdatePreviewSprite ? . Invoke ( this , null ) ;
2017-06-18 01:37:19 +00:00
UpdateLegality ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void UpdateTSV ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( pkm . Format < 6 )
return ;
string IDstr = $"TSV: {pkm.TSV:d4}" ;
if ( pkm . Format > 6 )
2017-07-02 18:02:16 +00:00
IDstr + = Environment . NewLine + $"G7TID: {pkm.TrainerID7:d6}" ;
2017-05-23 04:55:05 +00:00
Tip1 . SetToolTip ( TB_TID , IDstr ) ;
Tip2 . SetToolTip ( TB_SID , IDstr ) ;
2017-06-18 01:37:19 +00:00
pkm . PID = Util . GetHexValue ( TB_PID . Text ) ;
2017-05-23 04:55:05 +00:00
Tip3 . SetToolTip ( TB_PID , $"PSV: {pkm.PSV:d4}" ) ;
}
2017-06-18 01:37:19 +00:00
private void Update_ID ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
// Trim out nonhex characters
2017-06-18 01:37:19 +00:00
TB_PID . Text = Util . GetHexValue ( TB_PID . Text ) . ToString ( "X8" ) ;
TB_EC . Text = Util . GetHexValue ( TB_EC . Text ) . ToString ( "X8" ) ;
2017-05-23 04:55:05 +00:00
// Max TID/SID is 65535
if ( Util . ToUInt32 ( TB_TID . Text ) > ushort . MaxValue ) TB_TID . Text = "65535" ;
if ( Util . ToUInt32 ( TB_SID . Text ) > ushort . MaxValue ) TB_SID . Text = "65535" ;
2017-06-18 01:37:19 +00:00
SetIsShiny ( sender ) ;
2017-06-19 05:27:40 +00:00
UpdateSprite ( ) ;
2017-06-18 01:37:19 +00:00
UpdateIVs ( null , null ) ; // If the EC is changed, EC%6 (Characteristic) might be changed.
2017-05-23 04:55:05 +00:00
TB_PID . Select ( 60 , 0 ) ; // position cursor at end of field
if ( pkm . Format < = 4 & & fieldsLoaded )
{
fieldsLoaded = false ;
2017-06-18 01:37:19 +00:00
pkm . PID = Util . GetHexValue ( TB_PID . Text ) ;
2017-05-23 04:55:05 +00:00
CB_Nature . SelectedValue = pkm . Nature ;
Label_Gender . Text = gendersymbols [ pkm . Gender ] ;
2017-06-18 01:37:19 +00:00
Label_Gender . ForeColor = GetGenderColor ( pkm . Gender ) ;
2017-05-23 04:55:05 +00:00
fieldsLoaded = true ;
}
}
2017-06-18 01:37:19 +00:00
private void UpdateShadowID ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! fieldsLoaded )
return ;
FLP_Purification . Visible = NUD_ShadowID . Value > 0 ;
}
2017-06-18 01:37:19 +00:00
private void UpdatePurification ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! fieldsLoaded )
return ;
fieldsLoaded = false ;
CHK_Shadow . Checked = NUD_Purification . Value > 0 ;
fieldsLoaded = true ;
}
2017-06-18 01:37:19 +00:00
private void UpdateShadowCHK ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! fieldsLoaded )
return ;
fieldsLoaded = false ;
NUD_Purification . Value = CHK_Shadow . Checked ? NUD_Purification . Maximum : 0 ;
fieldsLoaded = true ;
}
2017-06-18 01:37:19 +00:00
private void ValidateComboBox ( object sender )
2017-05-23 04:55:05 +00:00
{
if ( ! fieldsInitialized )
return ;
ComboBox cb = sender as ComboBox ;
if ( cb = = null )
return ;
if ( cb . Text = = "" & & cb . Items . Count > 0 )
{ cb . SelectedIndex = 0 ; return ; }
if ( cb . SelectedValue = = null )
cb . BackColor = Color . DarkSalmon ;
else
cb . ResetBackColor ( ) ;
}
2017-06-18 01:37:19 +00:00
private void ValidateComboBox ( object sender , CancelEventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! ( sender is ComboBox ) )
return ;
2017-06-18 01:37:19 +00:00
ValidateComboBox ( sender ) ;
2017-06-19 05:27:40 +00:00
UpdateSprite ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void ValidateComboBox2 ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! fieldsInitialized )
return ;
2017-06-18 01:37:19 +00:00
ValidateComboBox ( sender , null ) ;
2017-05-23 04:55:05 +00:00
if ( fieldsLoaded )
{
if ( sender = = CB_Ability & & pkm . Format > = 6 )
TB_AbilityNumber . Text = ( 1 < < CB_Ability . SelectedIndex ) . ToString ( ) ;
if ( sender = = CB_Ability & & pkm . Format < = 5 & & CB_Ability . SelectedIndex < 2 ) // not hidden
2017-06-18 01:37:19 +00:00
UpdateRandomPID ( sender , e ) ;
2017-05-23 04:55:05 +00:00
if ( sender = = CB_Nature & & pkm . Format < = 4 )
{
pkm . Nature = CB_Nature . SelectedIndex ;
2017-06-18 01:37:19 +00:00
UpdateRandomPID ( sender , e ) ;
2017-05-23 04:55:05 +00:00
}
if ( sender = = CB_HeldItem | | sender = = CB_Ability )
2017-06-18 01:37:19 +00:00
UpdateLegality ( ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
UpdateNatureModification ( sender , null ) ;
UpdateIVs ( null , null ) ; // updating Nature will trigger stats to update as well
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void ValidateMove ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( ! fieldsInitialized )
return ;
2017-06-18 01:37:19 +00:00
ValidateComboBox ( sender ) ;
2017-05-23 04:55:05 +00:00
if ( ! fieldsLoaded )
return ;
if ( new [ ] { CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 } . Contains ( sender ) ) // Move
2017-06-18 01:37:19 +00:00
UpdatePP ( sender , e ) ;
2017-05-23 04:55:05 +00:00
// Legality
2017-06-18 01:37:19 +00:00
pkm . Moves = new [ ] { CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 } . Select ( WinFormsUtil . GetIndex ) . ToArray ( ) ;
pkm . RelearnMoves = new [ ] { CB_RelearnMove1 , CB_RelearnMove2 , CB_RelearnMove3 , CB_RelearnMove4 } . Select ( WinFormsUtil . GetIndex ) . ToArray ( ) ;
UpdateLegality ( skipMoveRepop : true ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void ValidateMovePaint ( object sender , DrawItemEventArgs e )
2017-05-23 04:55:05 +00:00
{
if ( e . Index < 0 ) return ;
2017-08-13 07:21:42 +00:00
var i = ( ComboItem ) ( ( ComboBox ) sender ) . Items [ e . Index ] ;
2017-05-23 04:55:05 +00:00
var moves = Legality . AllSuggestedMovesAndRelearn ;
bool vm = moves ! = null & & moves . Contains ( i . Value ) & & ! HaX ;
bool current = ( e . State & DrawItemState . Selected ) = = DrawItemState . Selected ;
Brush tBrush = current ? SystemBrushes . HighlightText : new SolidBrush ( e . ForeColor ) ;
Brush brush = current ? SystemBrushes . Highlight : vm ? Brushes . PaleGreen : new SolidBrush ( e . BackColor ) ;
e . Graphics . FillRectangle ( brush , e . Bounds ) ;
e . Graphics . DrawString ( i . Text , e . Font , tBrush , e . Bounds , StringFormat . GenericDefault ) ;
if ( current ) return ;
tBrush . Dispose ( ) ;
if ( ! vm )
brush . Dispose ( ) ;
}
2017-06-18 01:37:19 +00:00
private void ValidateLocation ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
2017-06-18 01:37:19 +00:00
ValidateComboBox ( sender ) ;
2017-05-23 04:55:05 +00:00
if ( ! fieldsLoaded )
return ;
2017-06-18 01:37:19 +00:00
pkm . Met_Location = WinFormsUtil . GetIndex ( CB_MetLocation ) ;
pkm . Egg_Location = WinFormsUtil . GetIndex ( CB_EggLocation ) ;
UpdateLegality ( ) ;
2017-05-23 04:55:05 +00:00
}
// Secondary Windows for Ribbons/Amie/Memories
2017-06-18 01:37:19 +00:00
private void OpenRibbons ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
new RibbonEditor ( pkm ) . ShowDialog ( ) ;
}
2017-06-18 01:37:19 +00:00
private void OpenMedals ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
new SuperTrainingEditor ( pkm ) . ShowDialog ( ) ;
}
2017-06-18 01:37:19 +00:00
private void OpenHistory ( object sender , EventArgs e )
2017-05-23 04:55:05 +00:00
{
// Write back current values
pkm . HT_Name = TB_OTt2 . Text ;
pkm . OT_Name = TB_OT . Text ;
pkm . IsEgg = CHK_IsEgg . Checked ;
pkm . CurrentFriendship = Util . ToInt32 ( TB_Friendship . Text ) ;
new MemoryAmie ( pkm ) . ShowDialog ( ) ;
TB_Friendship . Text = pkm . CurrentFriendship . ToString ( ) ;
}
/// <summary>
/// Refreshes the interface for the current PKM format.
/// </summary>
2017-06-19 05:27:40 +00:00
public bool ToggleInterface ( SaveFile sav , PKM pk )
2017-05-23 04:55:05 +00:00
{
2017-06-21 00:57:23 +00:00
if ( pk . GetType ( ) ! = sav . PKMType | | pkm . Format < 3 )
pk = sav . BlankPKM ;
pkm = pk ;
ToggleInterface ( pkm . Format ) ;
ToggleInterface ( pkm . GetType ( ) ) ;
2017-05-23 04:55:05 +00:00
2017-06-21 00:57:23 +00:00
return FinalizeInterface ( sav ) ;
}
private void ToggleInterface ( Type t )
{
FLP_Purification . Visible = FLP_ShadowID . Visible = t = = typeof ( XK3 ) | | t = = typeof ( CK3 ) ;
}
private void ToggleInterface ( int gen )
{
Tip1 . RemoveAll ( ) ; Tip2 . RemoveAll ( ) ; Tip3 . RemoveAll ( ) ; // TSV/PSV
2017-05-23 04:55:05 +00:00
2017-06-21 00:57:23 +00:00
FLP_Country . Visible = FLP_SubRegion . Visible = FLP_3DSRegion . Visible = gen > = 6 ;
Label_EncryptionConstant . Visible = BTN_RerollEC . Visible = TB_EC . Visible = gen > = 6 ;
GB_nOT . Visible = GB_RelearnMoves . Visible = BTN_Medals . Visible = BTN_History . Visible = gen > = 6 ;
2017-05-23 04:55:05 +00:00
2017-06-21 00:57:23 +00:00
PB_MarkPentagon . Visible = gen > = 6 ;
PB_MarkAlola . Visible = PB_MarkVC . Visible = PB_MarkHorohoro . Visible = gen > = 7 ;
2017-05-23 04:55:05 +00:00
2017-06-21 00:57:23 +00:00
FLP_NSparkle . Visible = L_NSparkle . Visible = CHK_NSparkle . Visible = gen = = 5 ;
2017-05-23 04:55:05 +00:00
2017-06-21 00:57:23 +00:00
CB_Form . Visible = Label_Form . Visible = CHK_AsEgg . Visible = GB_EggConditions . Visible = PB_Mark5 . Visible = PB_Mark6 . Visible = gen > = 4 ;
FLP_ShinyLeaf . Visible = L_ShinyLeaf . Visible = ShinyLeaf . Visible = gen = = 4 ;
2017-05-23 04:55:05 +00:00
2017-06-21 00:57:23 +00:00
DEV_Ability . Enabled = DEV_Ability . Visible = gen > 3 & & HaX ;
CB_Ability . Visible = ! DEV_Ability . Enabled & & gen > = 3 ;
FLP_Nature . Visible = gen > = 3 ;
FLP_Ability . Visible = gen > = 3 ;
2017-08-06 03:30:33 +00:00
// FLP_Language.Visible = gen >= 3; // not directly used by gen1/2, useful for providing species names for another language
2017-06-21 00:57:23 +00:00
GB_ExtraBytes . Visible = GB_ExtraBytes . Enabled = gen > = 3 ;
GB_Markings . Visible = gen > = 3 ;
BTN_Ribbons . Visible = gen > = 3 ;
CB_HPType . Enabled = CB_Form . Enabled = gen > = 3 ;
BTN_RerollPID . Visible = Label_PID . Visible = TB_PID . Visible = Label_SID . Visible = TB_SID . Visible = gen > = 3 ;
2017-05-23 04:55:05 +00:00
2017-06-21 00:57:23 +00:00
FLP_FriendshipForm . Visible = gen > = 2 ;
FLP_HeldItem . Visible = gen > = 2 ;
CHK_IsEgg . Visible = Label_Gender . Visible = gen > = 2 ;
FLP_PKRS . Visible = FLP_EggPKRSRight . Visible = gen > = 2 ;
Label_OTGender . Visible = gen > = 2 ;
2017-05-23 04:55:05 +00:00
// HaX override, needs to be after DEV_Ability enabled assignment.
2017-06-21 00:57:23 +00:00
TB_AbilityNumber . Visible = gen > = 6 & & DEV_Ability . Enabled ;
2017-05-23 04:55:05 +00:00
// Met Tab
2017-06-21 00:57:23 +00:00
FLP_MetDate . Visible = gen > = 4 ;
FLP_Fateful . Visible = FLP_Ball . Visible = FLP_OriginGame . Visible = gen > = 3 ;
FLP_MetLocation . Visible = FLP_MetLevel . Visible = gen > = 2 ;
FLP_TimeOfDay . Visible = gen = = 2 ;
2017-05-23 04:55:05 +00:00
// Stats
2017-06-21 00:57:23 +00:00
FLP_StatsTotal . Visible = gen > = 3 ;
FLP_Characteristic . Visible = gen > = 3 ;
FLP_HPType . Visible = gen > = 2 ;
2017-05-23 04:55:05 +00:00
2017-06-25 17:57:35 +00:00
Contest . ToggleInterface ( gen ) ;
2017-05-23 04:55:05 +00:00
2017-06-21 00:57:23 +00:00
ToggleStats ( gen ) ;
2017-06-19 05:27:40 +00:00
CenterSubEditors ( ) ;
}
2017-06-21 00:57:23 +00:00
private void ToggleStats ( int gen )
2017-06-19 05:27:40 +00:00
{
2017-06-21 00:57:23 +00:00
if ( pkm . Format = = 1 )
2017-05-23 04:55:05 +00:00
{
FLP_SpD . Visible = false ;
Label_SPA . Visible = false ;
Label_SPC . Visible = true ;
TB_HPIV . Enabled = false ;
2017-06-19 05:27:40 +00:00
MaskedTextBox [ ] evControls = { TB_SPAEV , TB_HPEV , TB_ATKEV , TB_DEFEV , TB_SPEEV , TB_SPDEV } ;
2017-05-23 04:55:05 +00:00
foreach ( var ctrl in evControls )
{
ctrl . Mask = "00000" ;
ctrl . Size = Stat_HP . Size ;
}
}
2017-06-21 00:57:23 +00:00
else if ( gen = = 2 )
2017-05-23 04:55:05 +00:00
{
FLP_SpD . Visible = true ;
Label_SPA . Visible = true ;
Label_SPC . Visible = false ;
TB_SPDEV . Enabled = TB_SPDIV . Enabled = false ;
TB_HPIV . Enabled = false ;
2017-06-19 05:27:40 +00:00
MaskedTextBox [ ] evControls = { TB_SPAEV , TB_HPEV , TB_ATKEV , TB_DEFEV , TB_SPEEV , TB_SPDEV } ;
2017-05-23 04:55:05 +00:00
foreach ( var ctrl in evControls )
{
ctrl . Mask = "00000" ;
ctrl . Size = Stat_HP . Size ;
}
}
else
{
FLP_SpD . Visible = true ;
Label_SPA . Visible = true ;
Label_SPC . Visible = false ;
TB_SPDEV . Enabled = TB_SPDIV . Enabled = true ;
TB_HPIV . Enabled = true ;
2017-06-19 05:27:40 +00:00
MaskedTextBox [ ] evControls = { TB_SPAEV , TB_HPEV , TB_ATKEV , TB_DEFEV , TB_SPEEV , TB_SPDEV } ;
2017-05-23 04:55:05 +00:00
foreach ( var ctrl in evControls )
{
ctrl . Mask = "000" ;
ctrl . Size = TB_ExtraByte . Size ;
}
}
}
2017-06-21 00:57:23 +00:00
private bool FinalizeInterface ( SaveFile sav )
2017-05-23 04:55:05 +00:00
{
2017-06-19 05:27:40 +00:00
bool init = fieldsInitialized ;
fieldsInitialized = fieldsLoaded = false ;
2017-05-23 04:55:05 +00:00
bool TranslationRequired = false ;
2017-06-21 00:57:23 +00:00
PopulateFilteredDataSources ( sav ) ;
2017-06-18 01:37:19 +00:00
PopulateFields ( pkm ) ;
2017-05-23 04:55:05 +00:00
fieldsInitialized | = init ;
// SAV Specific Limits
TB_OT . MaxLength = pkm . OTLength ;
TB_OTt2 . MaxLength = pkm . OTLength ;
TB_Nickname . MaxLength = pkm . NickLength ;
// Hide Unused Tabs
if ( pkm . Format = = 1 & & tabMain . TabPages . Contains ( Tab_Met ) )
tabMain . TabPages . Remove ( Tab_Met ) ;
else if ( pkm . Format ! = 1 & & ! tabMain . TabPages . Contains ( Tab_Met ) )
{
tabMain . TabPages . Insert ( 1 , Tab_Met ) ;
TranslationRequired = true ;
}
// Common HaX Interface
CHK_HackedStats . Enabled = CHK_HackedStats . Visible = MT_Level . Enabled = MT_Level . Visible = MT_Form . Enabled = MT_Form . Visible = HaX ;
TB_Level . Visible = ! HaX ;
// Setup PKM Preparation/Extra Bytes
2017-06-18 01:37:19 +00:00
SetPKMFormatMode ( pkm . Format ) ;
2017-05-23 04:55:05 +00:00
// pk2 save files do not have an Origin Game stored. Prompt the met location list to update.
if ( pkm . Format = = 2 )
2017-06-18 01:37:19 +00:00
UpdateOriginGame ( null , null ) ;
2017-05-23 04:55:05 +00:00
return TranslationRequired ;
}
2017-06-19 05:27:40 +00:00
private void CenterSubEditors ( )
2017-05-23 04:55:05 +00:00
{
// Recenter PKM SubEditors
FLP_PKMEditors . Location = new Point ( ( Tab_OTMisc . Width - FLP_PKMEditors . Width ) / 2 , FLP_PKMEditors . Location . Y ) ;
}
// Loading Setup
public void TemplateFields ( PKM template )
{
if ( template ! = null )
2017-06-09 03:57:30 +00:00
{
2017-06-18 01:37:19 +00:00
PopulateFields ( template ) ;
2017-06-19 05:27:40 +00:00
LastData = null ;
2017-06-09 03:57:30 +00:00
return ;
}
2017-05-23 15:28:53 +00:00
if ( CB_GameOrigin . Items . Count > 0 )
CB_GameOrigin . SelectedIndex = 0 ;
2017-05-23 04:55:05 +00:00
CB_Move1 . SelectedValue = 1 ;
TB_OT . Text = "PKHeX" ;
TB_TID . Text = 12345. ToString ( ) ;
TB_SID . Text = 54321. ToString ( ) ;
int curlang = GameInfo . Language ( ) ;
CB_Language . SelectedIndex = curlang > CB_Language . Items . Count - 1 ? 1 : curlang ;
CB_Ball . SelectedIndex = Math . Min ( 0 , CB_Ball . Items . Count - 1 ) ;
CB_Country . SelectedIndex = Math . Min ( 0 , CB_Country . Items . Count - 1 ) ;
CAL_MetDate . Value = CAL_EggDate . Value = DateTime . Today ;
CB_Species . SelectedValue = pkm . MaxSpeciesID ;
CHK_Nicknamed . Checked = false ;
2017-06-19 05:27:40 +00:00
LastData = null ;
2017-05-23 04:55:05 +00:00
}
public void EnableDragDrop ( DragEventHandler enter , DragEventHandler drop )
{
AllowDrop = true ;
DragDrop + = drop ;
foreach ( TabPage tab in tabMain . TabPages )
{
tab . AllowDrop = true ;
tab . DragEnter + = enter ;
tab . DragDrop + = drop ;
}
}
2017-06-19 05:27:40 +00:00
public void LoadShowdownSet ( ShowdownSet Set )
2017-05-23 04:55:05 +00:00
{
CB_Species . SelectedValue = Set . Species ;
CHK_Nicknamed . Checked = Set . Nickname ! = null ;
if ( Set . Nickname ! = null )
TB_Nickname . Text = Set . Nickname ;
if ( Set . Gender ! = null )
{
2017-06-18 01:37:19 +00:00
int Gender = PKX . GetGender ( Set . Gender ) ;
2017-05-23 04:55:05 +00:00
Label_Gender . Text = gendersymbols [ Gender ] ;
2017-06-18 01:37:19 +00:00
Label_Gender . ForeColor = GetGenderColor ( Gender ) ;
2017-05-23 04:55:05 +00:00
}
// Set Form
2017-06-18 01:37:19 +00:00
string [ ] formStrings = PKX . GetFormList ( Set . Species ,
Util . GetTypesList ( "en" ) ,
Util . GetFormsList ( "en" ) , gendersymbols , pkm . Format ) ;
2017-09-02 15:26:51 +00:00
int form = Array . FindIndex ( formStrings , z = > z . Contains ( Set . Form ? ? "" ) ) ;
CB_Form . SelectedIndex = Math . Min ( CB_Form . Items . Count - 1 , Math . Max ( 0 , form ) ) ;
2017-05-23 04:55:05 +00:00
2017-06-19 05:27:40 +00:00
// Set Ability and Moves
CB_Ability . SelectedIndex = Math . Max ( 0 , Array . IndexOf ( pkm . PersonalInfo . Abilities , Set . Ability ) ) ;
2017-05-23 04:55:05 +00:00
ComboBox [ ] m = { CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 } ;
2017-08-28 03:39:07 +00:00
ComboBox [ ] p = { CB_PPu1 , CB_PPu2 , CB_PPu3 , CB_PPu4 } ;
for ( int i = 0 ; i < 4 ; i + + )
{
m [ i ] . SelectedValue = Set . Moves [ i ] ;
p [ i ] . SelectedIndex = Set . Moves [ i ] ! = 0 ? 3 : 0 ; // max PP
}
2017-05-23 04:55:05 +00:00
// Set Item and Nature
2017-06-18 01:37:19 +00:00
CB_HeldItem . SelectedValue = Set . HeldItem < 0 ? 0 : Set . HeldItem ;
2017-05-23 04:55:05 +00:00
CB_Nature . SelectedValue = Set . Nature < 0 ? 0 : Set . Nature ;
2017-08-28 03:39:07 +00:00
// Set Level and Friendship
TB_Level . Text = Set . Level . ToString ( ) ;
TB_Friendship . Text = Set . Friendship . ToString ( ) ;
if ( pkm . Format > = 7 ) // hyper train IVs as appropriate
{
pkm . HT_HP = Set . IVs [ 0 ] ! = 31 ;
pkm . HT_ATK = Set . IVs [ 1 ] ! = 31 & & Set . IVs [ 1 ] > 2 ;
pkm . HT_DEF = Set . IVs [ 2 ] ! = 31 ;
pkm . HT_SPA = Set . IVs [ 4 ] ! = 31 ;
pkm . HT_SPD = Set . IVs [ 5 ] ! = 31 ;
pkm . HT_SPE = Set . IVs [ 3 ] ! = 31 & Set . IVs [ 3 ] > 2 ;
}
2017-05-23 04:55:05 +00:00
// Set IVs
TB_HPIV . Text = Set . IVs [ 0 ] . ToString ( ) ;
TB_ATKIV . Text = Set . IVs [ 1 ] . ToString ( ) ;
TB_DEFIV . Text = Set . IVs [ 2 ] . ToString ( ) ;
TB_SPAIV . Text = Set . IVs [ 4 ] . ToString ( ) ;
TB_SPDIV . Text = Set . IVs [ 5 ] . ToString ( ) ;
TB_SPEIV . Text = Set . IVs [ 3 ] . ToString ( ) ;
// Set EVs
TB_HPEV . Text = Set . EVs [ 0 ] . ToString ( ) ;
TB_ATKEV . Text = Set . EVs [ 1 ] . ToString ( ) ;
TB_DEFEV . Text = Set . EVs [ 2 ] . ToString ( ) ;
TB_SPAEV . Text = Set . EVs [ 4 ] . ToString ( ) ;
TB_SPDEV . Text = Set . EVs [ 5 ] . ToString ( ) ;
TB_SPEEV . Text = Set . EVs [ 3 ] . ToString ( ) ;
// Reset IV/EVs
2017-06-18 01:37:19 +00:00
UpdateRandomPID ( null , null ) ;
UpdateRandomEC ( null , null ) ;
2017-05-23 04:55:05 +00:00
2017-06-18 01:37:19 +00:00
if ( Set . Shiny ) UpdateShiny ( true ) ;
pkm = PreparePKM ( ) ;
UpdateLegality ( ) ;
2017-06-18 20:02:02 +00:00
2017-06-21 00:57:23 +00:00
if ( Legality . Info . Relearn . Any ( z = > ! z . Valid ) )
2017-06-18 20:02:02 +00:00
SetSuggestedRelearnMoves ( silent : true ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-19 05:27:40 +00:00
public void ChangeLanguage ( SaveFile sav , PKM pk )
{
// Force an update to the met locations
origintrack = GameVersion . Unknown ;
bool alreadyInit = fieldsInitialized ;
fieldsInitialized = false ;
InitializeLanguage ( sav ) ;
CenterSubEditors ( ) ;
PopulateFields ( pk ) ; // put data back in form
fieldsInitialized | = alreadyInit ;
}
public void FlickerInterface ( )
{
tabMain . SelectedTab = Tab_Met ; // parent tab of CB_GameOrigin
tabMain . SelectedTab = Tab_Main ; // first tab
}
private void InitializeLanguage ( SaveFile SAV )
2017-05-23 04:55:05 +00:00
{
ComboBox [ ] cbs =
{
CB_Country , CB_SubRegion , CB_3DSReg , CB_Language , CB_Ball , CB_HeldItem , CB_Species , DEV_Ability ,
CB_Nature , CB_EncounterType , CB_GameOrigin , CB_HPType
} ;
foreach ( var cb in cbs ) { cb . DisplayMember = "Text" ; cb . ValueMember = "Value" ; }
// Set the various ComboBox DataSources up with their allowed entries
2017-06-18 01:37:19 +00:00
SetCountrySubRegion ( CB_Country , "countries" ) ;
CB_3DSReg . DataSource = Util . GetUnsortedCBList ( "regions3ds" ) ;
2017-05-23 04:55:05 +00:00
GameInfo . InitializeDataSources ( GameInfo . Strings ) ;
2017-06-18 01:37:19 +00:00
CB_EncounterType . DataSource = Util . GetCBList ( GameInfo . Strings . encountertypelist , new [ ] { 0 } , Legal . Gen4EncounterTypes ) ;
CB_HPType . DataSource = Util . GetCBList ( GameInfo . Strings . types . Skip ( 1 ) . Take ( 16 ) . ToArray ( ) , null ) ;
2017-05-23 04:55:05 +00:00
CB_Nature . DataSource = new BindingSource ( GameInfo . NatureDataSource , null ) ;
2017-06-18 01:37:19 +00:00
PopulateFilteredDataSources ( SAV ) ;
2017-05-23 04:55:05 +00:00
}
2017-06-18 01:37:19 +00:00
private void PopulateFilteredDataSources ( SaveFile SAV )
2017-05-23 04:55:05 +00:00
{
2017-06-18 01:37:19 +00:00
GameInfo . SetItemDataSource ( HaX , pkm . MaxItemID , SAV . HeldItems , pkm . Format , SAV . Version , GameInfo . Strings ) ;
2017-05-23 04:55:05 +00:00
if ( pkm . Format > 1 )
2017-06-21 00:57:23 +00:00
CB_HeldItem . DataSource = new BindingSource ( GameInfo . ItemDataSource . Where ( i = > i . Value < = pkm . MaxItemID ) . ToList ( ) , null ) ;
2017-05-23 04:55:05 +00:00
2017-06-18 01:37:19 +00:00
var languages = Util . GetUnsortedCBList ( "languages" ) ;
2017-05-23 04:55:05 +00:00
if ( pkm . Format < 7 )
languages = languages . Where ( l = > l . Value < = 8 ) . ToList ( ) ; // Korean
CB_Language . DataSource = languages ;
CB_Ball . DataSource = new BindingSource ( GameInfo . BallDataSource . Where ( b = > b . Value < = pkm . MaxBallID ) . ToList ( ) , null ) ;
CB_Species . DataSource = new BindingSource ( GameInfo . SpeciesDataSource . Where ( s = > s . Value < = pkm . MaxSpeciesID ) . ToList ( ) , null ) ;
DEV_Ability . DataSource = new BindingSource ( GameInfo . AbilityDataSource . Where ( a = > a . Value < = pkm . MaxAbilityID ) . ToList ( ) , null ) ;
CB_GameOrigin . DataSource = new BindingSource ( GameInfo . VersionDataSource . Where ( g = > g . Value < = pkm . MaxGameID | | pkm . Format > = 3 & & g . Value = = 15 ) . ToList ( ) , null ) ;
// Set the Move ComboBoxes too..
2017-06-21 00:57:23 +00:00
GameInfo . MoveDataSource = ( HaX ? GameInfo . HaXMoveDataSource : GameInfo . LegalMoveDataSource ) . Where ( m = > m . Value < = pkm . MaxMoveID ) . ToList ( ) ; // Filter Z-Moves if appropriate
2017-05-23 04:55:05 +00:00
foreach ( ComboBox cb in new [ ] { CB_Move1 , CB_Move2 , CB_Move3 , CB_Move4 , CB_RelearnMove1 , CB_RelearnMove2 , CB_RelearnMove3 , CB_RelearnMove4 } )
{
cb . DisplayMember = "Text" ; cb . ValueMember = "Value" ;
cb . DataSource = new BindingSource ( GameInfo . MoveDataSource , null ) ;
}
}
}
}