2014-06-28 21:22:05 +00:00
using System ;
2016-10-27 01:49:40 +00:00
using System.Collections.Generic ;
2015-03-11 04:18:35 +00:00
using System.Drawing ;
2015-03-11 01:44:51 +00:00
using System.IO ;
2015-03-11 04:18:35 +00:00
using System.Linq ;
2014-06-28 21:22:05 +00:00
using System.Windows.Forms ;
2017-01-08 07:54:09 +00:00
using PKHeX.Core ;
2014-06-28 21:22:05 +00:00
2017-01-08 07:54:09 +00:00
namespace PKHeX.WinForms
2014-06-28 21:22:05 +00:00
{
public partial class SAV_Wondercard : Form
{
2016-06-20 04:22:43 +00:00
public SAV_Wondercard ( MysteryGift g = null )
2014-06-28 21:22:05 +00:00
{
InitializeComponent ( ) ;
2017-01-08 07:54:09 +00:00
WinFormsUtil . TranslateInterface ( this , Main . curlanguage ) ;
2016-06-20 04:22:43 +00:00
mga = Main . SAV . GiftAlbum ;
2016-10-27 01:49:40 +00:00
switch ( SAV . Generation )
2015-12-18 05:15:40 +00:00
{
2016-10-27 01:49:40 +00:00
case 4 :
pba = popG4Gifts ( ) . ToArray ( ) ;
break ;
case 5 :
case 6 :
case 7 :
pba = popG567Gifts ( ) . ToArray ( ) ;
break ;
default :
throw new ArgumentException ( "Game not supported." ) ;
}
2015-12-18 05:15:40 +00:00
2015-12-19 06:04:01 +00:00
foreach ( PictureBox pb in pba )
{
pb . AllowDrop = true ;
2016-10-27 01:49:40 +00:00
pb . DragDrop + = pbBoxSlot_DragDrop ;
pb . DragEnter + = pbBoxSlot_DragEnter ;
pb . MouseDown + = pbBoxSlot_MouseDown ;
pb . ContextMenuStrip = mnuVSD ;
2016-07-06 02:12:18 +00:00
}
2016-06-20 04:22:43 +00:00
setGiftBoxes ( ) ;
getReceivedFlags ( ) ;
2015-12-19 06:04:01 +00:00
2014-06-28 21:22:05 +00:00
if ( LB_Received . Items . Count > 0 )
2014-12-10 23:24:34 +00:00
LB_Received . SelectedIndex = 0 ;
2015-03-11 01:44:51 +00:00
DragEnter + = tabMain_DragEnter ;
DragDrop + = tabMain_DragDrop ;
2015-04-01 00:58:23 +00:00
2016-06-20 04:22:43 +00:00
if ( g = = null )
2016-10-27 01:49:40 +00:00
clickView ( pba [ 0 ] , null ) ;
2016-06-20 04:22:43 +00:00
else
viewGiftData ( g ) ;
2014-06-28 21:22:05 +00:00
}
2016-06-20 04:22:43 +00:00
private readonly SaveFile SAV = Main . SAV . Clone ( ) ;
private MysteryGiftAlbum mga ;
private MysteryGift mg ;
2016-01-17 21:27:24 +00:00
private readonly PictureBox [ ] pba ;
2014-06-28 21:22:05 +00:00
// Repopulation Functions
2015-12-19 04:48:47 +00:00
private void setBackground ( int index , Image bg )
{
2016-06-20 04:22:43 +00:00
for ( int i = 0 ; i < mga . Gifts . Length ; i + + )
2015-12-19 04:48:47 +00:00
pba [ i ] . BackgroundImage = index = = i ? bg : null ;
}
2016-06-20 04:22:43 +00:00
private void setGiftBoxes ( )
2014-06-28 21:22:05 +00:00
{
2016-06-20 04:22:43 +00:00
for ( int i = 0 ; i < mga . Gifts . Length ; i + + )
2014-06-28 21:22:05 +00:00
{
2016-06-20 04:22:43 +00:00
MysteryGift m = mga . Gifts [ i ] ;
2017-01-12 06:28:35 +00:00
pba [ i ] . Image = m . Sprite ( ) ;
2014-06-28 21:22:05 +00:00
}
}
2016-06-20 04:22:43 +00:00
private void viewGiftData ( MysteryGift g )
2014-06-28 21:22:05 +00:00
{
2014-12-11 06:50:40 +00:00
try
2014-06-28 21:22:05 +00:00
{
2016-07-24 22:44:44 +00:00
// only check if the form is visible (not opening)
if ( Visible & & g . GiftUsed & & DialogResult . Yes = =
2017-01-08 07:54:09 +00:00
WinFormsUtil . Prompt ( MessageBoxButtons . YesNo ,
2015-12-18 05:15:40 +00:00
"Wonder Card is marked as USED and will not be able to be picked up in-game." ,
2015-09-13 04:32:30 +00:00
"Do you want to remove the USED flag so that it is UNUSED?" ) )
2016-06-20 04:22:43 +00:00
g . GiftUsed = false ;
2016-01-24 18:19:30 +00:00
2016-06-20 04:22:43 +00:00
RTB . Text = getDescription ( g ) ;
2017-01-12 06:28:35 +00:00
PB_Preview . Image = g . Sprite ( ) ;
2016-06-20 04:22:43 +00:00
mg = g ;
2014-06-28 21:22:05 +00:00
}
2015-01-11 07:31:51 +00:00
catch ( Exception e )
{
2017-01-08 07:54:09 +00:00
WinFormsUtil . Error ( "Loading of data failed... is this really a Wonder Card?" , e ) ;
2015-01-11 07:31:51 +00:00
RTB . Clear ( ) ;
2014-06-28 21:22:05 +00:00
}
}
2016-06-20 04:22:43 +00:00
private void getReceivedFlags ( )
2014-06-28 21:22:05 +00:00
{
LB_Received . Items . Clear ( ) ;
2016-06-20 04:22:43 +00:00
for ( int i = 1 ; i < mga . Flags . Length ; i + + )
if ( mga . Flags [ i ] )
2014-06-28 21:22:05 +00:00
LB_Received . Items . Add ( i . ToString ( "0000" ) ) ;
2016-04-22 02:16:55 +00:00
2015-12-19 06:04:01 +00:00
if ( LB_Received . Items . Count > 0 )
LB_Received . SelectedIndex = 0 ;
2014-06-28 21:22:05 +00:00
}
2015-12-19 06:04:01 +00:00
private void setCardID ( int cardID )
{
if ( cardID < = 0 | | cardID > = 0x100 * 8 ) return ;
2014-06-28 21:22:05 +00:00
2015-12-19 06:04:01 +00:00
string card = cardID . ToString ( "0000" ) ;
if ( ! LB_Received . Items . Contains ( card ) )
LB_Received . Items . Add ( card ) ;
LB_Received . SelectedIndex = LB_Received . Items . IndexOf ( card ) ;
}
2016-08-16 03:48:02 +00:00
// Mystery Gift IO (.file<->window)
2016-06-20 04:22:43 +00:00
private string getFilter ( )
{
switch ( SAV . Generation )
{
case 4 :
return "Gen4 Mystery Gift|*.pgt;*.pcd|All Files|*.*" ;
case 5 :
return "Gen5 Mystery Gift|*.pgf|All Files|*.*" ;
case 6 :
return "Gen6 Mystery Gift|*.wc6;*.wc6full|All Files|*.*" ;
2017-01-20 07:48:31 +00:00
case 7 :
return "Gen7 Mystery Gift|*.wc7;*.wc7full|All Files|*.*" ;
2016-06-20 04:22:43 +00:00
default :
return "" ;
}
}
2014-06-28 21:22:05 +00:00
private void B_Import_Click ( object sender , EventArgs e )
{
2016-06-20 04:22:43 +00:00
OpenFileDialog import = new OpenFileDialog { Filter = getFilter ( ) } ;
if ( import . ShowDialog ( ) ! = DialogResult . OK ) return ;
2015-03-12 04:44:12 +00:00
2016-06-20 04:22:43 +00:00
string path = import . FileName ;
MysteryGift g = MysteryGift . getMysteryGift ( File . ReadAllBytes ( path ) , Path . GetExtension ( path ) ) ;
if ( g = = null )
2014-06-28 21:22:05 +00:00
{
2017-01-08 07:54:09 +00:00
WinFormsUtil . Error ( "File is not a Mystery Gift:" , path ) ;
2015-03-12 04:44:12 +00:00
return ;
2014-06-28 21:22:05 +00:00
}
2016-06-20 04:22:43 +00:00
viewGiftData ( g ) ;
2014-06-28 21:22:05 +00:00
}
private void B_Output_Click ( object sender , EventArgs e )
{
2016-06-20 04:22:43 +00:00
SaveFileDialog outputwc6 = new SaveFileDialog
{
Filter = getFilter ( ) ,
2017-01-07 17:54:31 +00:00
FileName = Util . CleanFileName ( mg . FileName )
2016-06-20 04:22:43 +00:00
} ;
2015-03-12 04:44:12 +00:00
if ( outputwc6 . ShowDialog ( ) ! = DialogResult . OK ) return ;
2014-06-28 21:22:05 +00:00
2015-03-12 04:44:12 +00:00
string path = outputwc6 . FileName ;
2014-06-28 21:22:05 +00:00
2017-01-07 17:54:31 +00:00
if ( File . Exists ( path ) )
{
// File already exists, save a .bak
string bakpath = path + ".bak" ;
if ( ! File . Exists ( bakpath ) )
{
byte [ ] backupfile = File . ReadAllBytes ( path ) ;
File . WriteAllBytes ( bakpath , backupfile ) ;
}
}
2015-03-12 04:44:12 +00:00
2016-06-20 04:22:43 +00:00
File . WriteAllBytes ( path , mg . Data ) ;
2014-06-28 21:22:05 +00:00
}
2016-08-16 03:48:02 +00:00
private int getLastUnfilledByType ( MysteryGift Gift , MysteryGiftAlbum Album )
{
for ( int i = 0 ; i < Album . Gifts . Length ; i + + )
{
if ( ! Album . Gifts [ i ] . Empty )
continue ;
if ( Album . Gifts [ i ] . Type ! = Gift . Type )
continue ;
return i ;
}
return - 1 ;
}
// Mystery Gift RW (window<->sav)
2015-12-19 06:04:01 +00:00
private void clickView ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2016-02-01 07:15:54 +00:00
sender = ( ( sender as ToolStripItem ) ? . Owner as ContextMenuStrip ) ? . SourceControl ? ? sender as PictureBox ;
int index = Array . IndexOf ( pba , sender ) ;
2015-12-20 00:25:32 +00:00
2017-01-08 07:54:09 +00:00
setBackground ( index , Core . Properties . Resources . slotView ) ;
2016-06-20 04:22:43 +00:00
viewGiftData ( mga . Gifts [ index ] ) ;
2014-06-28 21:22:05 +00:00
}
2015-12-19 06:04:01 +00:00
private void clickSet ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2016-06-20 04:22:43 +00:00
if ( ! checkSpecialWonderCard ( mg ) )
2016-03-31 01:28:28 +00:00
return ;
2016-02-01 07:15:54 +00:00
sender = ( ( sender as ToolStripItem ) ? . Owner as ContextMenuStrip ) ? . SourceControl ? ? sender as PictureBox ;
int index = Array . IndexOf ( pba , sender ) ;
2015-12-20 00:25:32 +00:00
// Hijack to the latest unfilled slot if index creates interstitial empty slots.
2016-08-16 03:48:02 +00:00
int lastUnfilled = getLastUnfilledByType ( mg , mga ) ;
2016-03-31 01:28:28 +00:00
if ( lastUnfilled > - 1 & & lastUnfilled < index )
2015-12-20 00:25:32 +00:00
index = lastUnfilled ;
2017-01-20 16:43:41 +00:00
if ( mg is PCD & & mga . Gifts [ index ] is PGT )
mg = ( mg as PCD ) . Gift ;
else if ( mg . Type ! = mga . Gifts [ index ] . Type )
2016-06-20 04:22:43 +00:00
{
2017-01-08 07:54:09 +00:00
WinFormsUtil . Alert ( "Can't set slot here." , $"{mg.Type} != {mga.Gifts[index].Type}" ) ;
2016-06-20 04:22:43 +00:00
return ;
}
2017-01-08 07:54:09 +00:00
setBackground ( index , Core . Properties . Resources . slotSet ) ;
2016-08-16 03:48:02 +00:00
mga . Gifts [ index ] = mg . Clone ( ) ;
2016-06-20 04:22:43 +00:00
setGiftBoxes ( ) ;
setCardID ( mg . CardID ) ;
2014-06-28 21:22:05 +00:00
}
2015-12-19 06:04:01 +00:00
private void clickDelete ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2016-02-01 07:15:54 +00:00
sender = ( ( sender as ToolStripItem ) ? . Owner as ContextMenuStrip ) ? . SourceControl ? ? sender as PictureBox ;
int index = Array . IndexOf ( pba , sender ) ;
2015-12-19 06:04:01 +00:00
2016-06-20 04:22:43 +00:00
mga . Gifts [ index ] . Data = new byte [ mga . Gifts [ index ] . Data . Length ] ;
2016-08-16 03:48:02 +00:00
// Shuffle blank card down
int i = index ;
while ( i < mga . Gifts . Length - 1 )
{
if ( mga . Gifts [ i + 1 ] . Empty )
break ;
if ( mga . Gifts [ i + 1 ] . Type ! = mga . Gifts [ i ] . Type )
break ;
i + + ;
var mg1 = mga . Gifts [ i ] ;
var mg2 = mga . Gifts [ i - 1 ] ;
mga . Gifts [ i - 1 ] = mg1 ;
mga . Gifts [ i ] = mg2 ;
}
2017-01-08 07:54:09 +00:00
setBackground ( i , Core . Properties . Resources . slotDel ) ;
2016-06-20 04:22:43 +00:00
setGiftBoxes ( ) ;
2014-06-28 21:22:05 +00:00
}
// Close Window
private void B_Cancel_Click ( object sender , EventArgs e )
{
Close ( ) ;
}
private void B_Save_Click ( object sender , EventArgs e )
{
// Make sure all of the Received Flags are flipped!
2016-06-20 04:22:43 +00:00
bool [ ] flags = new bool [ mga . Flags . Length ] ;
2016-04-22 02:16:55 +00:00
foreach ( var o in LB_Received . Items )
flags [ Util . ToUInt32 ( o . ToString ( ) ) ] = true ;
2014-06-28 21:22:05 +00:00
2016-06-20 04:22:43 +00:00
mga . Flags = flags ;
SAV . GiftAlbum = mga ;
2016-04-22 02:16:55 +00:00
Main . SAV . Data = SAV . Data ;
2015-10-24 23:33:44 +00:00
Main . SAV . Edited = true ;
2014-06-28 21:22:05 +00:00
Close ( ) ;
}
2016-08-16 03:48:02 +00:00
// Delete Received Flag
2015-12-19 06:04:01 +00:00
private void clearRecievedFlag ( object sender , EventArgs e )
2014-06-28 21:22:05 +00:00
{
2016-02-01 07:15:54 +00:00
if ( LB_Received . SelectedIndex < 0 ) return ;
2015-03-12 04:44:12 +00:00
if ( LB_Received . Items . Count > 0 )
LB_Received . Items . Remove ( LB_Received . Items [ LB_Received . SelectedIndex ] ) ;
2015-12-19 06:04:01 +00:00
if ( LB_Received . Items . Count > 0 )
LB_Received . SelectedIndex = 0 ;
2014-06-28 21:22:05 +00:00
}
2014-12-10 23:24:34 +00:00
2015-12-19 06:04:01 +00:00
// Drag & Drop Wonder Cards
2014-12-10 23:24:34 +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 ) ;
2015-01-11 07:31:51 +00:00
2015-01-31 23:59:23 +00:00
// Check for multiple wondercards
2016-03-19 22:50:01 +00:00
if ( Directory . Exists ( files [ 0 ] ) )
files = Directory . GetFiles ( files [ 0 ] , "*" , SearchOption . AllDirectories ) ;
if ( files . Length = = 1 & & ! Directory . Exists ( files [ 0 ] ) )
2014-12-10 23:24:34 +00:00
{
2015-01-31 23:59:23 +00:00
string path = files [ 0 ] ; // open first D&D
2016-03-19 22:50:01 +00:00
long len = new FileInfo ( path ) . Length ;
2016-06-20 04:22:43 +00:00
if ( len > 0x1000 ) // arbitrary
2015-01-31 23:59:23 +00:00
{
2017-01-08 07:54:09 +00:00
WinFormsUtil . Alert ( "File is not a Mystery Gift." , path ) ;
2015-01-31 23:59:23 +00:00
return ;
}
2016-06-20 04:22:43 +00:00
MysteryGift g = MysteryGift . getMysteryGift ( File . ReadAllBytes ( path ) , Path . GetExtension ( path ) ) ;
if ( g = = null )
2016-03-31 01:28:28 +00:00
{
2017-01-08 07:54:09 +00:00
WinFormsUtil . Error ( "File is not a Mystery Gift:" , path ) ;
2016-06-20 04:22:43 +00:00
return ;
2016-03-31 01:28:28 +00:00
}
2016-06-20 04:22:43 +00:00
viewGiftData ( g ) ;
return ;
2016-03-19 22:50:01 +00:00
}
2016-06-20 04:22:43 +00:00
setGiftBoxes ( ) ;
2014-12-10 23:24:34 +00:00
}
2015-03-11 04:18:35 +00:00
2016-06-20 04:22:43 +00:00
private bool checkSpecialWonderCard ( MysteryGift g )
2016-03-31 01:28:28 +00:00
{
2016-06-20 04:22:43 +00:00
if ( SAV . Generation ! = 6 )
return true ;
if ( g is WC6 )
2016-03-31 01:28:28 +00:00
{
2016-06-20 04:22:43 +00:00
if ( g . CardID = = 2048 & & g . Item = = 726 ) // Eon Ticket (OR/AS)
{
if ( ! Main . SAV . ORAS | | ( ( SAV6 ) SAV ) . EonTicket < 0 )
goto reject ;
BitConverter . GetBytes ( WC6 . EonTicketConst ) . CopyTo ( SAV . Data , ( ( SAV6 ) SAV ) . EonTicket ) ;
}
2016-03-31 01:28:28 +00:00
}
return true ;
2017-01-08 07:54:09 +00:00
reject : WinFormsUtil . Alert ( "Unable to insert the Mystery Gift." , "Does this Mystery Gift really belong to this game?" ) ;
2016-03-31 01:28:28 +00:00
return false ;
}
2016-04-22 02:16:55 +00:00
2015-03-11 04:18:35 +00:00
private void L_QR_Click ( object sender , EventArgs e )
{
if ( ModifierKeys = = Keys . Alt )
{
2016-06-20 04:22:43 +00:00
byte [ ] data = QR . getQRData ( ) ;
2016-04-22 02:16:55 +00:00
if ( data = = null ) return ;
2016-07-24 22:44:44 +00:00
2016-08-16 03:48:02 +00:00
string [ ] types = mga . Gifts . Select ( g = > g . Type ) . Distinct ( ) . ToArray ( ) ;
2016-07-24 22:44:44 +00:00
MysteryGift gift = MysteryGift . getMysteryGift ( data ) ;
2016-08-16 03:48:02 +00:00
string giftType = gift . Type ;
2016-07-24 22:44:44 +00:00
if ( mga . Gifts . All ( card = > card . Data . Length ! = data . Length ) )
2017-01-08 07:54:09 +00:00
WinFormsUtil . Alert ( "Decoded data not valid for loaded save file." , $"QR Data Size: 0x{data.Length:X}" ) ;
2016-07-24 22:44:44 +00:00
else if ( types . All ( type = > type ! = giftType ) )
2017-01-08 07:54:09 +00:00
WinFormsUtil . Alert ( "Gift type is not compatible with the save file." , $"QR Gift Type: {gift.Type}" + Environment . NewLine + $"Expected Types: {string.Join(" , ", types)}" ) ;
2016-10-27 05:06:03 +00:00
else if ( gift . Species > SAV . MaxSpeciesID | | gift . Moves . Any ( move = > move > SAV . MaxMoveID ) | | gift . HeldItem > SAV . MaxItemID )
2017-01-08 07:54:09 +00:00
WinFormsUtil . Alert ( "Gift Details are not compatible with the save file." ) ;
2016-07-24 22:44:44 +00:00
else
try { viewGiftData ( gift ) ; }
2017-01-08 07:54:09 +00:00
catch { WinFormsUtil . Alert ( "Error loading Mystery Gift data." ) ; }
2015-03-11 04:18:35 +00:00
}
else
{
2016-06-20 04:22:43 +00:00
if ( mg . Data . SequenceEqual ( new byte [ mg . Data . Length ] ) )
2017-01-08 07:54:09 +00:00
{ WinFormsUtil . Alert ( "No wondercard data found in loaded slot!" ) ; return ; }
2016-07-24 22:44:44 +00:00
if ( SAV . Generation = = 6 & & mg . Item = = 726 & & mg . IsItem )
2017-01-08 07:54:09 +00:00
{ WinFormsUtil . Alert ( "Eon Ticket Wonder Cards will not function properly" , "Inject to the save file instead." ) ; return ; }
2016-06-20 04:22:43 +00:00
2015-03-11 04:18:35 +00:00
const string server = "http://lunarcookies.github.io/wc.html#" ;
2016-06-20 04:22:43 +00:00
Image qr = QR . getQRImage ( mg . Data , server ) ;
2015-03-14 02:59:51 +00:00
if ( qr = = null ) return ;
2015-03-11 04:18:35 +00:00
2016-08-16 03:48:02 +00:00
string desc = $"({mg.Type}) {getDescription(mg)}" ;
2015-03-11 04:18:35 +00:00
2017-01-27 17:09:28 +00:00
new QR ( qr , PB_Preview . Image , desc + "PKHeX Wonder Card @ ProjectPokemon.org" , "" , "" , "" ) . ShowDialog ( ) ;
2015-03-11 04:18:35 +00:00
}
}
2015-12-18 05:15:40 +00:00
private void pbBoxSlot_MouseDown ( object sender , MouseEventArgs e )
{
2016-06-20 04:22:43 +00:00
switch ( ModifierKeys )
2015-12-18 05:15:40 +00:00
{
2016-06-20 04:22:43 +00:00
case Keys . Control : clickView ( sender , e ) ; return ;
case Keys . Shift : clickSet ( sender , e ) ; return ;
case Keys . Alt : clickDelete ( sender , e ) ; return ;
2015-12-18 05:15:40 +00:00
}
2016-06-20 04:22:43 +00:00
PictureBox pb = sender as PictureBox ;
if ( pb ? . Image = = null )
2015-12-19 06:04:01 +00:00
return ;
if ( e . Button ! = MouseButtons . Left | | e . Clicks ! = 1 ) return ;
2016-02-01 07:15:54 +00:00
int index = Array . IndexOf ( pba , sender ) ;
2015-12-19 06:17:01 +00:00
wc_slot = index ;
2015-12-19 06:04:01 +00:00
// Create Temp File to Drag
Cursor . Current = Cursors . Hand ;
// Prepare Data
2016-06-20 04:22:43 +00:00
MysteryGift card = mga . Gifts [ index ] ;
2017-01-20 07:48:31 +00:00
string filename = Util . CleanFileName ( $"{card.CardID:0000} - {card.CardTitle}.{card.Extension}" ) ;
2015-12-19 06:04:01 +00:00
// Make File
string newfile = Path . Combine ( Path . GetTempPath ( ) , Util . CleanFileName ( filename ) ) ;
try
{
2016-04-22 02:16:55 +00:00
File . WriteAllBytes ( newfile , card . Data ) ;
2015-12-19 06:04:01 +00:00
DoDragDrop ( new DataObject ( DataFormats . FileDrop , new [ ] { newfile } ) , DragDropEffects . Move ) ;
}
2016-08-26 03:59:29 +00:00
catch ( Exception x )
2017-01-08 07:54:09 +00:00
{ WinFormsUtil . Error ( "Drag & Drop Error" , x ) ; }
2015-12-19 06:04:01 +00:00
File . Delete ( newfile ) ;
2015-12-19 06:17:01 +00:00
wc_slot = - 1 ;
2015-12-18 05:15:40 +00:00
}
2015-12-19 06:04:01 +00:00
private void pbBoxSlot_DragDrop ( object sender , DragEventArgs e )
2015-12-18 05:15:40 +00:00
{
2016-02-01 07:15:54 +00:00
int index = Array . IndexOf ( pba , sender ) ;
2015-12-19 06:04:01 +00:00
// Hijack to the latest unfilled slot if index creates interstitial empty slots.
2016-08-16 03:48:02 +00:00
int lastUnfilled = getLastUnfilledByType ( mg , mga ) ;
2017-01-21 03:35:56 +00:00
if ( lastUnfilled > - 1 & & lastUnfilled < index & & mga . Gifts [ lastUnfilled ] . Type = = mga . Gifts [ index ] . Type )
2015-12-19 06:04:01 +00:00
index = lastUnfilled ;
2016-06-20 04:22:43 +00:00
if ( wc_slot = = - 1 ) // dropped
2015-12-19 06:17:01 +00:00
{
string [ ] files = ( string [ ] ) e . Data . GetData ( DataFormats . FileDrop ) ;
2015-12-19 06:04:01 +00:00
2016-06-20 04:22:43 +00:00
if ( files . Length < 1 )
2015-12-19 06:17:01 +00:00
return ;
2016-06-20 04:22:43 +00:00
if ( PCD . Size < ( int ) new FileInfo ( files [ 0 ] ) . Length )
2017-01-08 07:54:09 +00:00
{ WinFormsUtil . Alert ( "Data size invalid." , files [ 0 ] ) ; return ; }
2016-04-22 02:16:55 +00:00
2016-06-20 04:22:43 +00:00
byte [ ] data = File . ReadAllBytes ( files [ 0 ] ) ;
2017-01-21 03:35:56 +00:00
MysteryGift gift = MysteryGift . getMysteryGift ( data , new FileInfo ( files [ 0 ] ) . Extension ) ;
2017-01-20 16:43:41 +00:00
2017-01-21 03:35:56 +00:00
if ( gift is PCD & & mga . Gifts [ index ] is PGT )
gift = ( gift as PCD ) . Gift ;
else if ( gift . Type ! = mga . Gifts [ index ] . Type )
2016-06-20 04:22:43 +00:00
{
2017-01-21 03:35:56 +00:00
WinFormsUtil . Alert ( "Can't set slot here." , $"{gift.Type} != {mga.Gifts[index].Type}" ) ;
2016-08-16 03:48:02 +00:00
return ;
2016-06-20 04:22:43 +00:00
}
2017-01-20 16:43:41 +00:00
setBackground ( index , Core . Properties . Resources . slotSet ) ;
2017-01-21 03:35:56 +00:00
mga . Gifts [ index ] = gift . Clone ( ) ;
2017-01-20 16:43:41 +00:00
2016-06-20 04:22:43 +00:00
setCardID ( mga . Gifts [ index ] . CardID ) ;
viewGiftData ( mga . Gifts [ index ] ) ;
2015-12-19 06:17:01 +00:00
}
else // Swap Data
{
2016-06-20 04:22:43 +00:00
MysteryGift s1 = mga . Gifts [ index ] ;
MysteryGift s2 = mga . Gifts [ wc_slot ] ;
2017-01-21 03:35:56 +00:00
if ( s2 is PCD & & s1 is PGT )
{
// set the PGT to the PGT slot instead
viewGiftData ( s2 ) ;
clickSet ( pba [ index ] , null ) ;
{ WinFormsUtil . Alert ( $"Set {s2.Type} gift to {s1.Type} slot." ) ; return ; }
}
2016-08-16 03:48:02 +00:00
if ( s1 . Type ! = s2 . Type )
2017-01-21 03:35:56 +00:00
{ WinFormsUtil . Alert ( $"Can't swap {s2.Type} with {s1.Type}." ) ; return ; }
2016-06-20 04:22:43 +00:00
mga . Gifts [ wc_slot ] = s1 ;
mga . Gifts [ index ] = s2 ;
2016-08-16 03:48:02 +00:00
if ( mga . Gifts [ wc_slot ] . Empty ) // empty slot created, slide down
{
int i = wc_slot ;
while ( i < index )
{
if ( mga . Gifts [ i + 1 ] . Empty )
break ;
if ( mga . Gifts [ i + 1 ] . Type ! = mga . Gifts [ i ] . Type )
break ;
i + + ;
var mg1 = mga . Gifts [ i ] ;
var mg2 = mga . Gifts [ i - 1 ] ;
mga . Gifts [ i - 1 ] = mg1 ;
mga . Gifts [ i ] = mg2 ;
}
index = i - 1 ;
}
2015-12-19 06:17:01 +00:00
}
2017-01-08 07:54:09 +00:00
setBackground ( index , Core . Properties . Resources . slotView ) ;
2016-06-20 04:22:43 +00:00
setGiftBoxes ( ) ;
2015-12-18 05:15:40 +00:00
}
2015-12-19 06:04:01 +00:00
private void pbBoxSlot_DragEnter ( object sender , DragEventArgs e )
2015-12-18 05:15:40 +00:00
{
2015-12-19 06:04:01 +00:00
if ( e . AllowedEffect = = ( DragDropEffects . Copy | DragDropEffects . Link ) ) // external file
e . Effect = DragDropEffects . Copy ;
else if ( e . Data ! = null ) // within
e . Effect = DragDropEffects . Move ;
2015-12-18 05:15:40 +00:00
}
2015-12-19 06:17:01 +00:00
private int wc_slot = - 1 ;
2016-06-20 04:22:43 +00:00
private static string getDescription ( MysteryGift gift )
2016-04-22 02:16:55 +00:00
{
2016-06-20 04:22:43 +00:00
if ( gift . Empty )
return "Empty Slot. No data!" ;
2016-04-22 02:16:55 +00:00
2016-09-04 17:38:53 +00:00
string s = gift . getCardHeader ( ) + Environment . NewLine ;
2016-06-20 04:22:43 +00:00
if ( gift . IsItem )
{
2017-01-08 07:54:09 +00:00
s + = "Item: " + GameInfo . Strings . itemlist [ gift . Item ] + Environment . NewLine + "Quantity: " + gift . Quantity + Environment . NewLine ;
2016-06-20 04:22:43 +00:00
}
2017-01-05 22:45:53 +00:00
else if ( gift . IsPokémon )
2016-06-20 04:22:43 +00:00
{
PKM pk = gift . convertToPKM ( Main . SAV ) ;
2016-04-22 02:16:55 +00:00
2016-06-20 04:22:43 +00:00
try
2016-04-22 02:16:55 +00:00
{
2017-01-08 07:54:09 +00:00
s + = $"{GameInfo.Strings.specieslist[pk.Species]} @ {GameInfo.Strings.itemlist[pk.HeldItem]} --- " ;
s + = ( pk . IsEgg ? GameInfo . Strings . eggname : $"{pk.OT_Name} - {pk.TID:00000}/{pk.SID:00000}" ) + Environment . NewLine ;
s + = $"{GameInfo.Strings.movelist[pk.Move1]} / {GameInfo.Strings.movelist[pk.Move2]} / {GameInfo.Strings.movelist[pk.Move3]} / {GameInfo.Strings.movelist[pk.Move4]}" + Environment . NewLine ;
2016-11-20 23:04:28 +00:00
if ( gift is WC7 )
{
var addItem = ( ( WC7 ) gift ) . AdditionalItem ;
if ( addItem ! = 0 )
2017-01-27 17:09:28 +00:00
s + = $"+ {GameInfo.Strings.itemlist[addItem]}" + Environment . NewLine ;
2016-11-20 23:04:28 +00:00
}
2016-04-22 02:16:55 +00:00
}
2017-01-05 22:45:53 +00:00
catch { s + = "Unable to create gift description." + Environment . NewLine ; }
}
2017-01-27 17:09:28 +00:00
else if ( gift . IsBP )
{
s + = "BP: " + gift . BP + Environment . NewLine ;
}
else if ( gift . IsBean )
{
s + = "Bean ID: " + gift . Bean + Environment . NewLine + "Quantity: " + gift . Quantity + Environment . NewLine ;
}
2017-01-05 22:45:53 +00:00
else { s + = "Unknown Wonder Card Type!" + Environment . NewLine ; }
if ( gift is WC7 )
{
var wc7 = ( WC7 ) gift ;
s + = $"Repeatable: {wc7.GiftRepeatable}" + Environment . NewLine ;
s + = $"Collected: {wc7.GiftUsed}" + Environment . NewLine ;
s + = $"Once Per Day: {wc7.GiftOncePerDay}" + Environment . NewLine ;
2016-04-22 02:16:55 +00:00
}
2016-06-20 04:22:43 +00:00
return s ;
2016-04-22 02:16:55 +00:00
}
2016-10-27 01:49:40 +00:00
// UI Generation
private List < PictureBox > popG4Gifts ( )
{
List < PictureBox > pb = new List < PictureBox > ( ) ;
// Row 1
var f1 = getFlowLayoutPanel ( ) ;
f1 . Controls . Add ( getLabel ( "PGT 1-6" ) ) ;
for ( int i = 0 ; i < 6 ; i + + )
{
var p = getPictureBox ( ) ;
f1 . Controls . Add ( p ) ;
pb . Add ( p ) ;
}
// Row 2
var f2 = getFlowLayoutPanel ( ) ;
f2 . Controls . Add ( getLabel ( "PGT 7-8" ) ) ;
for ( int i = 6 ; i < 8 ; i + + )
{
var p = getPictureBox ( ) ;
f2 . Controls . Add ( p ) ;
pb . Add ( p ) ;
}
// Row 3
var f3 = getFlowLayoutPanel ( ) ;
f3 . Margin = new Padding ( 0 , f3 . Height , 0 , 0 ) ;
f3 . Controls . Add ( getLabel ( "PCD 1-3" ) ) ;
for ( int i = 8 ; i < 11 ; i + + )
{
var p = getPictureBox ( ) ;
f3 . Controls . Add ( p ) ;
pb . Add ( p ) ;
}
FLP_Gifts . Controls . Add ( f1 ) ;
FLP_Gifts . Controls . Add ( f2 ) ;
FLP_Gifts . Controls . Add ( f3 ) ;
return pb ;
}
private List < PictureBox > popG567Gifts ( )
{
List < PictureBox > pb = new List < PictureBox > ( ) ;
for ( int i = 0 ; i < mga . Gifts . Length / 6 ; i + + )
{
var flp = getFlowLayoutPanel ( ) ;
flp . Controls . Add ( getLabel ( $"{i * 6 + 1}-{i * 6 + 6}" ) ) ;
for ( int j = 0 ; j < 6 ; j + + )
{
var p = getPictureBox ( ) ;
flp . Controls . Add ( p ) ;
pb . Add ( p ) ;
}
FLP_Gifts . Controls . Add ( flp ) ;
}
return pb ;
}
private static FlowLayoutPanel getFlowLayoutPanel ( )
{
return new FlowLayoutPanel
{
Width = 305 ,
Height = 34 ,
Padding = new Padding ( 0 ) ,
Margin = new Padding ( 0 ) ,
} ;
}
private static Label getLabel ( string text )
{
return new Label
{
Size = new Size ( 40 , 34 ) ,
AutoSize = false ,
TextAlign = ContentAlignment . MiddleRight ,
Text = text ,
Padding = new Padding ( 0 ) ,
Margin = new Padding ( 0 ) ,
} ;
}
private static PictureBox getPictureBox ( )
{
return new PictureBox
{
Size = new Size ( 42 , 32 ) ,
SizeMode = PictureBoxSizeMode . CenterImage ,
BorderStyle = BorderStyle . FixedSingle ,
BackColor = Color . Transparent ,
Padding = new Padding ( 0 ) ,
Margin = new Padding ( 1 ) ,
} ;
}
2016-04-22 02:16:55 +00:00
}
2014-12-15 00:50:15 +00:00
}