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.Drawing ;
2014-07-31 22:06:48 +00:00
using System.IO ;
2015-03-11 01:44:51 +00:00
using System.Windows.Forms ;
2014-06-28 21:22:05 +00:00
namespace PKHeX
{
2014-11-22 03:47:30 +00:00
public partial class SAV_EventFlagsORAS : Form
2014-06-28 21:22:05 +00:00
{
2015-09-21 03:34:09 +00:00
public SAV_EventFlagsORAS ( )
2014-06-28 21:22:05 +00:00
{
InitializeComponent ( ) ;
2015-09-21 03:34:09 +00:00
Util . TranslateInterface ( this , Main . curlanguage ) ;
2014-07-31 22:06:48 +00:00
2015-03-11 01:44:51 +00:00
AllowDrop = true ;
DragEnter + = tabMain_DragEnter ;
DragDrop + = tabMain_DragDrop ;
2014-07-31 22:06:48 +00:00
Setup ( ) ;
nud . Text = "0" ; // Prompts an update for flag 0.
2015-09-21 03:34:09 +00:00
MT_Ash . Text = BitConverter . ToUInt16 ( Main . savefile , Main . SaveGame . EventAsh ) . ToString ( ) ;
2014-06-28 21:22:05 +00:00
}
2014-07-31 22:06:48 +00:00
bool setup = true ;
public CheckBox [ ] chka ;
public bool [ ] flags = new bool [ 3072 ] ;
2015-09-21 03:34:09 +00:00
public ushort [ ] Constants = new ushort [ ( Main . SaveGame . EventFlag - Main . SaveGame . EventConst ) / 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
2015-03-11 01:44:51 +00:00
foreach ( CheckBox flag in chka )
flags [ getFlagNum ( flag ) ] = flag . Checked ;
2014-07-31 22:06:48 +00:00
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-11-22 03:47:30 +00:00
2015-09-21 03:34:09 +00:00
Array . Copy ( data , 0 , Main . savefile , Main . SaveGame . EventFlag , 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 + + )
2015-09-21 03:34:09 +00:00
Array . Copy ( BitConverter . GetBytes ( Constants [ i ] ) , 0 , Main . savefile , Main . SaveGame . EventConst + 2 * i , 2 ) ;
2015-02-01 04:40:35 +00:00
2015-09-27 13:42:02 +00:00
// Copy back Volcanic Ash counter
Array . Copy ( BitConverter . GetBytes ( Util . ToUInt32 ( MT_Ash ) ) , 0 , Main . savefile , Main . SaveGame . EventAsh , 2 ) ;
2015-03-11 01:44:51 +00:00
Close ( ) ;
2014-07-31 22:06:48 +00:00
}
private void Setup ( )
{
// Fill Bit arrays
2015-02-01 04:40:35 +00:00
2015-03-11 01:44:51 +00:00
chka = new [ ] {
2014-11-25 03:53:10 +00:00
flag_0173 , flag_2811 , // Raikou
flag_0174 , flag_2812 , // Entei
flag_0175 , flag_2813 , // Suicune
2014-11-25 07:19:58 +00:00
flag_0209 , flag_2814 , // Lugia
flag_0208 , flag_2815 , // Ho-Oh
2014-11-25 03:53:10 +00:00
flag_0179 , flag_2816 , // Uxie
flag_0180 , flag_2817 , // Mesprit
flag_0181 , flag_2818 , // Azelf
2014-11-25 07:19:58 +00:00
flag_2819 , // Dialga
flag_2820 , // Palkia
flag_0260 , flag_2821 , // Heatran
2014-11-26 00:17:46 +00:00
flag_0252 , flag_2822 , // Regigigas
2014-11-25 07:19:58 +00:00
flag_2823 , // Giratina
2014-11-26 04:46:42 +00:00
flag_0172 , flag_2824 , // Cresselia
2014-11-22 07:27:30 +00:00
flag_0176 , flag_2825 , // Cobalion
2014-11-26 03:55:46 +00:00
flag_0177 , flag_2826 , // Terrakion
2014-11-30 05:28:48 +00:00
flag_0178 , flag_2827 , // Virizion
2014-11-25 07:19:58 +00:00
flag_2828 , // Tornadus
flag_2829 , // Thundurus
flag_0182 , flag_2830 , // Reshiram
flag_0183 , flag_2831 , // Zekrom
flag_2832 , // Landorus
2014-11-25 03:53:10 +00:00
flag_0184 , flag_2833 , // Kyurem
2014-11-30 05:28:48 +00:00
flag_0419 , flag_2834 , // Latios
flag_0420 , flag_2835 , // Latias
2014-11-25 07:19:58 +00:00
flag_0956 , flag_2836 , // Regirock
flag_0957 , flag_2837 , // Regice
flag_0958 , flag_2838 , // Registeel
flag_0648 , flag_2839 , // Groudon
flag_0647 , flag_2840 , // Kyogre
2014-11-30 05:28:48 +00:00
// ??????
2014-11-25 07:19:58 +00:00
flag_0945 , flag_2842 , // Deoxys
// Cresselia, Regigigas
// Terrakion, Virizion
2014-11-25 03:53:10 +00:00
2014-11-26 03:55:46 +00:00
// Maison
flag_0284 , flag_0285 , flag_0286 , flag_0287 , flag_0288 , // Statuettes
flag_0289 , flag_0290 , flag_0291 , flag_0292 , flag_0293 , // Super Unlocks
//flag_0675, // Chatelaine 50
//flag_2546, // Pokedex
2014-07-31 22:06:48 +00:00
} ;
2014-12-12 05:45:01 +00:00
byte [ ] data = new byte [ 0x180 ] ;
2015-09-21 03:34:09 +00:00
Array . Copy ( Main . savefile , Main . SaveGame . EventFlag , data , 0 , 0x180 ) ;
2014-07-31 22:06:48 +00:00
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 ( ) ;
2015-09-21 03:34:09 +00:00
for ( int i = 0 ; i < Constants . Length ; i + = 2 )
2015-02-01 04:40:35 +00:00
{
CB_Stats . Items . Add ( String . Format ( "0x{0}" , i . ToString ( "X3" ) ) ) ;
2015-09-21 03:34:09 +00:00
Constants [ i / 2 ] = BitConverter . ToUInt16 ( Main . savefile , Main . SaveGame . EventConst + i ) ;
2015-02-01 04:40:35 +00:00
}
CB_Stats . SelectedIndex = 0 ;
2014-07-31 22:06:48 +00:00
// Populate Flags
setup = true ;
popFlags ( ) ;
}
private void popFlags ( )
{
2015-03-11 01:44:51 +00:00
if ( ! setup ) return ;
foreach ( CheckBox flag in chka )
flag . Checked = flags [ getFlagNum ( flag ) ] ;
2014-07-31 22:06:48 +00:00
2015-03-11 01:44:51 +00:00
changeCustomFlag ( null , null ) ;
2014-07-31 22:06:48 +00:00
}
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 ;
2015-09-21 03:34:09 +00:00
nud . BackColor = Main . 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 )
diffSaves ( ) ;
}
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 + + )
2015-02-06 03:17:47 +00:00
{
2015-03-11 01:44:51 +00:00
if ( oldBits [ i ] = = newBits [ i ] ) continue ;
if ( newBits [ i ] )
tbIsSet + = ( i . ToString ( "0000" ) + "," ) ;
else
tbUnSet + = ( i . ToString ( "0000" ) + "," ) ;
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 ] ;
2015-03-11 01:44:51 +00:00
switch ( fi . Length )
{
case 0x100000 : // ramsav
2015-09-21 03:34:09 +00:00
Array . Copy ( File . ReadAllBytes ( path ) , Main . SaveGame . EventFlag , eventflags , 0 , 0x180 ) ;
2015-03-11 01:44:51 +00:00
break ;
case 0x76000 : // oras main
2015-09-21 03:34:09 +00:00
Array . Copy ( File . ReadAllBytes ( path ) , Main . SaveGame . EventFlag , eventflags , 0 , 0x180 ) ;
2015-03-11 01:44:51 +00:00
break ;
default : // figure it out
if ( fi . Name . ToLower ( ) . Contains ( "ram" ) & & fi . Length = = 0x80000 )
2015-09-21 03:34:09 +00:00
Array . Copy ( ram2sav . getMAIN ( File . ReadAllBytes ( path ) ) , Main . SaveGame . EventFlag , eventflags , 0 , 0x180 ) ;
2015-03-11 01:44:51 +00:00
else
2015-03-12 04:44:12 +00:00
{ Util . Error ( "Invalid SAV Size" , String . Format ( "File Size: 0x{1} ({0} bytes)" , fi . Length , fi . Length . ToString ( "X5" ) ) , "File Loaded: " + path ) ; return ; }
2015-03-11 01:44:51 +00:00
break ;
}
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
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
}