2014-06-28 21:22:05 +00:00
using System ;
2014-07-31 22:06:48 +00:00
using System.Collections ;
2014-06-28 21:22:05 +00:00
using System.Collections.Generic ;
using System.ComponentModel ;
using System.Data ;
using System.Drawing ;
using System.Linq ;
using System.Text ;
using System.Windows.Forms ;
2014-07-31 22:06:48 +00:00
using System.IO ;
2014-06-28 21:22:05 +00:00
namespace PKHeX
{
2014-11-22 03:47:30 +00:00
public partial class SAV_EventFlagsXY : Form
2014-06-28 21:22:05 +00:00
{
2014-11-22 03:47:30 +00:00
public SAV_EventFlagsXY ( Form1 frm1 )
2014-06-28 21:22:05 +00:00
{
InitializeComponent ( ) ;
2014-12-20 04:19:41 +00:00
Util . TranslateInterface ( this , Form1 . curlanguage ) ;
2014-06-28 21:22:05 +00:00
m_parent = frm1 ;
2014-07-31 22:06:48 +00:00
savshift = 0x7F000 * m_parent . savindex ;
2015-02-06 03:17:47 +00:00
this . AllowDrop = true ;
this . DragEnter + = tabMain_DragEnter ;
this . DragDrop + = tabMain_DragDrop ;
2014-07-31 22:06:48 +00:00
Setup ( ) ;
nud . Text = "0" ; // Prompts an update for flag 0.
2014-06-28 21:22:05 +00:00
}
Form1 m_parent ;
2014-07-31 22:06:48 +00:00
public int savshift ;
bool setup = true ;
public CheckBox [ ] chka ;
public bool [ ] flags = new bool [ 3072 ] ;
2015-02-01 04:40:35 +00:00
public ushort [ ] Constants = new ushort [ 0x2FC / 2 ] ;
2014-07-31 22:06:48 +00:00
private void B_Cancel_Click ( object sender , EventArgs e )
{
Close ( ) ;
}
private void B_Save_Click ( object sender , EventArgs e )
{
// Gather Updated Flags
for ( int i = 0 ; i < chka . Length ; i + + )
flags [ getFlagNum ( chka [ i ] ) ] = chka [ i ] . Checked ;
2015-02-01 04:40:35 +00:00
byte [ ] data = new byte [ flags . Length / 8 ] ;
2014-07-31 22:06:48 +00:00
for ( int i = 0 ; i < flags . Length ; i + + )
{
if ( flags [ i ] )
2015-02-01 04:40:35 +00:00
data [ i / 8 ] | = ( byte ) ( 1 < < i % 8 ) ;
2014-07-31 22:06:48 +00:00
}
Array . Copy ( data , 0 , m_parent . savefile , 0x1A0FC + savshift , 0x180 ) ;
2015-02-01 04:40:35 +00:00
// Copy back Constants
changeConstantIndex ( null , null ) ; // Trigger Saving
for ( int i = 0 ; i < Constants . Length ; i + + )
Array . Copy ( BitConverter . GetBytes ( ( ushort ) Constants [ i ] ) , 0 , m_parent . savefile , 0x19E00 + savshift + 2 * i , 2 ) ;
2014-07-31 22:06:48 +00:00
this . Close ( ) ;
}
private void Setup ( )
{
// Fill Bit arrays
2015-02-01 04:40:35 +00:00
2014-07-31 22:06:48 +00:00
chka = new CheckBox [ ] {
flag_0001 , flag_0002 , flag_0003 , flag_0004 , flag_0005 ,
flag_2237 , flag_2238 , flag_2239 ,
flag_0115 , flag_0963 , // Mewtwo
2014-08-01 05:36:42 +00:00
flag_0114 , flag_0790 , // Zygarde
2014-08-04 23:22:47 +00:00
flag_0285 , flag_0286 , flag_0287 , flag_0288 , flag_0289 , // Statuettes
flag_0290 , flag_0291 , flag_0292 , flag_0293 , flag_0294 , // Super Unlocks
2014-08-05 01:48:22 +00:00
flag_0675 , // Chatelaine 50
2014-08-10 03:55:52 +00:00
flag_2546 , // Pokedex
2014-07-31 22:06:48 +00:00
} ;
int offset = 0x1A0FC + savshift ;
2014-12-12 05:45:01 +00:00
byte [ ] data = new byte [ 0x180 ] ;
2014-07-31 22:06:48 +00:00
Array . Copy ( m_parent . savefile , offset , data , 0 , 0x180 ) ;
BitArray BitRegion = new BitArray ( data ) ;
BitRegion . CopyTo ( flags , 0 ) ;
2014-06-28 21:22:05 +00:00
2015-02-01 04:40:35 +00:00
// Setup Event Constant Editor
CB_Stats . Items . Clear ( ) ;
for ( int i = 0 ; i < 0x2FC ; i + = 2 )
{
CB_Stats . Items . Add ( String . Format ( "0x{0}" , i . ToString ( "X3" ) ) ) ;
Constants [ i / 2 ] = BitConverter . ToUInt16 ( m_parent . savefile , 0x19E00 + i ) ;
}
CB_Stats . SelectedIndex = 0 ;
2014-07-31 22:06:48 +00:00
// Populate Flags
setup = true ;
popFlags ( ) ;
}
private void popFlags ( )
{
if ( setup )
{
for ( int i = 0 ; i < chka . Length ; i + + )
chka [ i ] . Checked = flags [ getFlagNum ( chka [ i ] ) ] ;
changeCustomFlag ( null , null ) ;
}
}
2014-08-05 01:48:22 +00:00
2014-07-31 22:06:48 +00:00
private int getFlagNum ( CheckBox chk )
{
try
{
string source = chk . Name ;
return Convert . ToInt32 ( source . Substring ( Math . Max ( 0 , source . Length - 4 ) ) ) ;
}
catch { return 0 ; }
}
private void changeCustomBool ( object sender , EventArgs e )
{
flags [ ( int ) nud . Value ] = CHK_CustomFlag . Checked ;
popFlags ( ) ;
}
private void changeCustomFlag ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
int flag = ( int ) nud . Value ;
2014-07-31 22:06:48 +00:00
if ( flag > = 3072 )
2014-06-28 21:22:05 +00:00
{
CHK_CustomFlag . Checked = false ;
2014-07-31 22:06:48 +00:00
CHK_CustomFlag . Enabled = false ;
2014-06-28 21:22:05 +00:00
nud . BackColor = Color . Red ;
}
else
{
2014-07-31 22:06:48 +00:00
CHK_CustomFlag . Enabled = true ;
2014-12-20 04:19:41 +00:00
nud . BackColor = Form1 . defaultControlWhite ;
2014-07-31 22:06:48 +00:00
CHK_CustomFlag . Checked = flags [ flag ] ;
2014-06-28 21:22:05 +00:00
}
}
2014-08-05 01:48:22 +00:00
private void changeCustomFlag ( object sender , KeyEventArgs e )
{
changeCustomFlag ( null , ( EventArgs ) e ) ;
}
2014-07-31 22:06:48 +00:00
private void toggleFlag ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2014-07-31 22:06:48 +00:00
flags [ getFlagNum ( ( CheckBox ) ( sender ) ) ] = ( ( CheckBox ) ( sender ) ) . Checked ;
changeCustomFlag ( sender , e ) ;
2014-06-28 21:22:05 +00:00
}
2014-07-31 22:06:48 +00:00
private void changeSAV ( object sender , EventArgs e )
{
if ( TB_NewSAV . Text . Length > 0 & & TB_OldSAV . Text . Length > 0 )
2014-06-28 21:22:05 +00:00
{
2014-07-31 22:06:48 +00:00
diffSaves ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-07-31 22:06:48 +00:00
}
private void diffSaves ( )
{
BitArray oldBits = new BitArray ( olddata ) ;
BitArray newBits = new BitArray ( newdata ) ;
2014-06-28 21:22:05 +00:00
2015-02-06 03:17:47 +00:00
string tbIsSet = "" ;
string tbUnSet = "" ;
2014-07-31 22:06:48 +00:00
for ( int i = 0 ; i < oldBits . Length ; i + + )
{
if ( oldBits [ i ] ! = newBits [ i ] )
{
if ( newBits [ i ] )
2015-02-06 03:17:47 +00:00
tbIsSet + = ( i . ToString ( "0000" ) + "," ) ;
2014-07-31 22:06:48 +00:00
else
2015-02-06 03:17:47 +00:00
tbUnSet + = ( i . ToString ( "0000" ) + "," ) ;
2014-07-31 22:06:48 +00:00
}
}
2015-02-06 03:17:47 +00:00
TB_IsSet . Text = tbIsSet ;
TB_UnSet . Text = tbUnSet ;
2014-06-28 21:22:05 +00:00
}
2014-12-12 05:45:01 +00:00
private byte [ ] olddata = new byte [ 0x180 ] ;
private byte [ ] newdata = new byte [ 0x180 ] ;
2014-07-31 22:06:48 +00:00
private void openSAV ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2014-07-31 22:06:48 +00:00
OpenFileDialog ofd = new OpenFileDialog ( ) ;
if ( ofd . ShowDialog ( ) = = DialogResult . OK )
2015-02-06 03:17:47 +00:00
loadSAV ( sender , ofd . FileName ) ;
}
private void loadSAV ( object sender , string path )
{
FileInfo fi = new FileInfo ( path ) ;
byte [ ] eventflags = new byte [ 0x180 ] ;
if ( fi . Length = = 0x100000 )
Array . Copy ( File . ReadAllBytes ( path ) , 0x1A0FC , eventflags , 0 , 0x180 ) ;
else if ( fi . Length = = 0x65600 )
Array . Copy ( File . ReadAllBytes ( path ) , 0x1A0FC - 0x5400 , eventflags , 0 , 0x180 ) ;
else if ( fi . Name . ToLower ( ) . Contains ( "ram" ) & & fi . Length = = 0x70000 )
Array . Copy ( ram2sav . getMAIN ( File . ReadAllBytes ( path ) ) , 0x1A0FC - 0x5400 , eventflags , 0 , 0x180 ) ;
else
{ Util . Error ( "Invalid SAV Size" , String . Format ( "File Size: 0x{1} ({0} bytes)" , fi . Length . ToString ( ) , fi . Length . ToString ( "X5" ) ) , "File Loaded: " + path ) ; return ; }
2015-02-01 04:40:35 +00:00
2014-07-31 22:06:48 +00:00
Button bs = ( Button ) sender ;
if ( bs . Name = = "B_LoadOld" )
2015-02-06 03:17:47 +00:00
{ Array . Copy ( eventflags , olddata , 0x180 ) ; TB_OldSAV . Text = path ; }
2015-02-01 04:40:35 +00:00
else
2015-02-06 03:17:47 +00:00
{ Array . Copy ( eventflags , newdata , 0x180 ) ; TB_NewSAV . Text = path ; }
2014-06-28 21:22:05 +00:00
}
2015-02-01 04:40:35 +00:00
int entry = - 1 ;
private void changeConstantIndex ( object sender , EventArgs e )
{
if ( entry > - 1 ) // Set Entry
Constants [ entry ] = ( ushort ) ( Math . Min ( Util . ToUInt32 ( MT_Stat ) , 0xFFFF ) ) ;
entry = CB_Stats . SelectedIndex ; // Get Entry
MT_Stat . Text = Constants [ entry ] . ToString ( ) ;
}
2015-02-06 03:17:47 +00:00
// Drag & Drop Events
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 ) ;
loadSAV ( ( Util . Prompt ( MessageBoxButtons . YesNo , "FlagDiff Researcher:" , "Yes: Old Save" + Environment . NewLine + "No: New Save" ) = = DialogResult . Yes ) ? B_LoadOld : B_LoadNew , files [ 0 ] ) ;
}
2014-06-28 21:22:05 +00:00
}
2015-02-01 04:40:35 +00:00
}