2011-02-20 08:40:22 +00:00
using System ;
2011-07-24 06:45:05 +00:00
using System.Text ;
2011-02-20 08:40:22 +00:00
using System.Threading ;
2011-01-11 02:55:51 +00:00
using System.Drawing ;
using System.Drawing.Imaging ;
using System.IO ;
using System.Windows.Forms ;
using BizHawk.Core ;
2011-08-03 00:57:01 +00:00
using BizHawk.DiscSystem ;
2011-01-11 02:55:51 +00:00
using BizHawk.Emulation.Consoles.Sega ;
using BizHawk.Emulation.Consoles.TurboGrafx ;
2011-01-18 10:28:10 +00:00
using BizHawk.Emulation.Consoles.Calculator ;
2011-01-20 06:24:31 +00:00
using BizHawk.Emulation.Consoles.Gameboy ;
2011-02-20 02:17:09 +00:00
using BizHawk.Emulation.Consoles.Nintendo ;
2011-08-03 03:00:19 +00:00
using BizHawk.MultiClient.tools ;
2012-03-04 19:02:28 +00:00
using System.Collections.Generic ;
2011-01-11 02:55:51 +00:00
namespace BizHawk.MultiClient
{
2011-07-11 07:35:14 +00:00
2011-02-20 08:40:22 +00:00
public partial class MainForm : Form
{
2012-03-09 23:33:56 +00:00
public bool INTERIM = true ;
2012-03-31 01:28:45 +00:00
public const string EMUVERSION = "BizHawk v1.0.4 interim" ; //TODO: Get rid of this, only the movie object uses it, maybe it can use assembly info
2011-02-20 08:40:22 +00:00
private Control renderTarget ;
2011-01-11 02:55:51 +00:00
private RetainedViewportPanel retainedPanel ;
2011-05-11 01:47:28 +00:00
public string CurrentlyOpenRom ;
2011-07-01 01:28:25 +00:00
SavestateManager StateSlots = new SavestateManager ( ) ;
2011-08-06 19:30:21 +00:00
2011-06-11 19:39:34 +00:00
public bool PressFrameAdvance = false ;
public bool PressRewind = false ;
2011-07-11 07:35:14 +00:00
//avi/wav state
AviWriter CurrAviWriter = null ;
2011-02-20 08:40:22 +00:00
//runloop control
2011-02-21 09:48:53 +00:00
bool exit ;
bool runloop_frameProgress ;
DateTime FrameAdvanceTimestamp = DateTime . MinValue ;
2011-02-20 08:40:22 +00:00
public bool EmulatorPaused ;
2012-01-28 21:43:55 +00:00
public EventWaitHandle MainWait ;
2011-03-16 06:30:25 +00:00
int runloop_fps ;
2011-06-10 07:12:57 +00:00
int runloop_last_fps ;
2011-02-21 09:48:53 +00:00
bool runloop_frameadvance ;
2011-03-16 06:30:25 +00:00
DateTime runloop_second ;
2011-06-11 12:54:26 +00:00
bool runloop_last_ff ;
2011-08-27 18:09:54 +00:00
Throttle throttle ;
2011-06-11 12:54:26 +00:00
bool unthrottled = false ;
2011-02-20 08:40:22 +00:00
//For handling automatic pausing when entering the menu
private bool wasPaused = false ;
private bool didMenuPause = false ;
//tool dialogs
public RamWatch RamWatch1 = new RamWatch ( ) ;
public RamSearch RamSearch1 = new RamSearch ( ) ;
2011-06-11 12:54:26 +00:00
public HexEditor HexEditor1 = new HexEditor ( ) ;
public NESNameTableViewer NESNameTableViewer1 = new NESNameTableViewer ( ) ;
public NESPPU NESPPU1 = new NESPPU ( ) ;
public NESDebugger NESDebug1 = new NESDebugger ( ) ;
2012-03-12 05:19:59 +00:00
public PCEBGViewer PCEBGViewer1 = new PCEBGViewer ( ) ;
2011-06-11 12:54:26 +00:00
public Cheats Cheats1 = new Cheats ( ) ;
public ToolBox ToolBox1 = new ToolBox ( ) ;
public TI83KeyPad TI83KeyPad1 = new TI83KeyPad ( ) ;
public TAStudio TAStudio1 = new TAStudio ( ) ;
2012-03-12 04:44:34 +00:00
#if WINDOWS
2012-01-21 20:05:53 +00:00
public LuaConsole LuaConsole1 = new LuaConsole ( ) ;
2012-03-12 04:44:34 +00:00
#endif
2011-02-20 08:40:22 +00:00
public MainForm ( string [ ] args )
{
2011-09-03 18:07:30 +00:00
Global . MovieSession = new MovieSession ( ) ;
Global . MovieSession . Movie = new Movie ( ) ;
2012-01-28 21:43:55 +00:00
MainWait = new AutoResetEvent ( false ) ;
2011-08-21 06:07:38 +00:00
Icon = BizHawk . MultiClient . Properties . Resources . logo ;
2011-03-21 00:54:30 +00:00
InitializeComponent ( ) ;
2011-09-11 00:11:46 +00:00
Global . Game = GameInfo . GetNullGame ( ) ;
2011-07-10 20:01:27 +00:00
if ( Global . Config . ShowLogWindow )
{
2012-03-09 21:36:55 +00:00
ShowConsole ( ) ;
2012-02-24 20:45:27 +00:00
//PsxApi.StdioFixes();
2011-07-10 20:01:27 +00:00
displayLogWindowToolStripMenuItem . Checked = true ;
}
2011-09-24 16:19:38 +00:00
2011-08-27 18:09:54 +00:00
throttle = new Throttle ( ) ;
2011-08-08 01:48:31 +00:00
DiscSystem . FFMpeg . FFMpegPath = PathManager . MakeProgramRelativePath ( Global . Config . FFMpegPath ) ;
2011-07-09 19:54:24 +00:00
2011-08-06 19:30:21 +00:00
Global . CheatList = new CheatList ( ) ;
2011-07-22 01:14:13 +00:00
UpdateStatusSlots ( ) ;
2011-08-09 00:51:46 +00:00
2011-03-07 10:41:46 +00:00
//in order to allow late construction of this database, we hook up a delegate here to dearchive the data and provide it on demand
//we could background thread this later instead if we wanted to be real clever
2011-06-11 12:54:26 +00:00
NES . BootGodDB . GetDatabaseBytes = ( ) = >
{
2012-03-12 04:44:26 +00:00
using ( HawkFile NesCartFile = new HawkFile ( Path . Combine ( PathManager . GetExeDirectoryAbsolute ( ) , "NesCarts.7z" ) ) . BindFirst ( ) )
2011-06-11 12:54:26 +00:00
return Util . ReadAllBytes ( NesCartFile . GetStream ( ) ) ;
2011-03-07 10:41:46 +00:00
} ;
2011-02-20 08:40:22 +00:00
Global . MainForm = this ;
2011-06-11 22:15:08 +00:00
Global . CoreInputComm = new CoreInputComm ( ) ;
SyncCoreInputComm ( ) ;
2011-02-20 08:40:22 +00:00
2011-07-31 19:46:42 +00:00
Console . WriteLine ( "Scanning cores:" ) ;
foreach ( var ci in Introspection . GetCoreInfo ( ) )
{
Console . WriteLine ( "{0} - {1} ({2})" , ci . FriendlyName , ci . Version , ci . ClassName ) ;
}
2012-03-12 04:44:26 +00:00
Database . LoadDatabase ( Path . Combine ( PathManager . GetExeDirectoryAbsolute ( ) , "gamedb.txt" ) ) ;
2011-01-11 02:55:51 +00:00
2011-03-21 00:54:30 +00:00
SyncPresentationMode ( ) ;
2011-01-11 02:55:51 +00:00
2011-02-20 08:40:22 +00:00
Load + = ( o , e ) = >
2011-02-21 16:35:42 +00:00
{
AllowDrop = true ;
DragEnter + = FormDragEnter ;
DragDrop + = FormDragDrop ;
} ;
2011-02-20 08:40:22 +00:00
2011-06-11 12:54:26 +00:00
Closing + = ( o , e ) = >
{
2011-08-06 22:03:10 +00:00
Global . CheatList . SaveSettings ( ) ;
2011-06-11 12:54:26 +00:00
CloseGame ( ) ;
2011-09-03 18:07:30 +00:00
Global . MovieSession . Movie . StopMovie ( ) ;
2012-02-03 12:18:27 +00:00
SaveConfig ( ) ;
2011-06-11 12:54:26 +00:00
} ;
2011-02-20 08:40:22 +00:00
ResizeBegin + = ( o , e ) = >
{
if ( Global . Sound ! = null ) Global . Sound . StopSound ( ) ;
} ;
ResizeEnd + = ( o , e ) = >
{
if ( Global . RenderPanel ! = null ) Global . RenderPanel . Resized = true ;
if ( Global . Sound ! = null ) Global . Sound . StartSound ( ) ;
} ;
2011-07-13 01:29:13 +00:00
Input . Initialize ( ) ;
InitControls ( ) ;
2011-02-20 08:40:22 +00:00
Global . Emulator = new NullEmulator ( ) ;
2011-06-11 12:54:26 +00:00
Global . ActiveController = Global . NullControls ;
2011-08-09 22:13:57 +00:00
Global . AutoFireController = Global . AutofireNullControls ;
2012-03-12 04:44:34 +00:00
#if WINDOWS
2011-02-20 08:40:22 +00:00
Global . Sound = new Sound ( Handle , Global . DSound ) ;
2012-03-12 04:44:34 +00:00
#else
Global . Sound = new Sound ( ) ;
#endif
2011-02-20 08:40:22 +00:00
Global . Sound . StartSound ( ) ;
2011-06-28 23:43:13 +00:00
RewireInputChain ( ) ;
2011-02-05 21:00:59 +00:00
//TODO - replace this with some kind of standard dictionary-yielding parser in a separate component
string cmdRom = null ;
string cmdLoadState = null ;
2011-06-11 12:54:26 +00:00
string cmdMovie = null ;
2011-02-05 21:00:59 +00:00
for ( int i = 0 ; i < args . Length ; i + + )
2011-06-11 12:54:26 +00:00
{
2011-06-06 21:08:38 +00:00
//for some reason sometimes visual studio will pass this to us on the commandline. it makes no sense.
if ( args [ i ] = = ">" )
{
i + + ;
string stdout = args [ i ] ;
Console . SetOut ( new StreamWriter ( stdout ) ) ;
continue ;
}
2011-02-05 21:00:59 +00:00
string arg = args [ i ] . ToLower ( ) ;
2011-06-06 21:08:38 +00:00
if ( arg . StartsWith ( "--load-slot=" ) )
cmdLoadState = arg . Substring ( arg . IndexOf ( '=' ) + 1 ) ;
else if ( arg . StartsWith ( "--movie=" ) )
cmdMovie = arg . Substring ( arg . IndexOf ( '=' ) + 1 ) ;
else
cmdRom = arg ;
2011-02-05 21:00:59 +00:00
}
2011-03-19 09:12:56 +00:00
if ( cmdRom ! = null )
{
//Commandline should always override auto-load
2011-02-05 21:00:59 +00:00
LoadRom ( cmdRom ) ;
2011-03-19 09:12:56 +00:00
if ( Global . Game = = null )
{
2011-05-22 00:13:12 +00:00
MessageBox . Show ( "Failed to load " + cmdRom + " specified on commandline" ) ;
2011-03-19 09:12:56 +00:00
}
}
2011-02-20 08:40:22 +00:00
else if ( Global . Config . AutoLoadMostRecentRom & & ! Global . Config . RecentRoms . IsEmpty ( ) )
LoadRomFromRecent ( Global . Config . RecentRoms . GetRecentFileByPosition ( 0 ) ) ;
2011-01-19 04:18:33 +00:00
2011-06-11 12:54:26 +00:00
if ( cmdMovie ! = null )
{
2011-06-30 02:30:06 +00:00
if ( Global . Game = = null )
OpenROM ( ) ;
if ( Global . Game ! = null )
{
Movie m = new Movie ( cmdMovie , MOVIEMODE . PLAY ) ;
ReadOnly = true ;
StartNewMovie ( m , false ) ;
Global . Config . RecentMovies . Add ( cmdMovie ) ;
}
2011-06-11 12:54:26 +00:00
}
else if ( Global . Config . AutoLoadMostRecentMovie & & ! Global . Config . RecentMovies . IsEmpty ( ) )
{
2011-06-30 02:30:06 +00:00
if ( Global . Game = = null )
OpenROM ( ) ;
if ( Global . Game ! = null )
{
Movie m = new Movie ( Global . Config . RecentMovies . GetRecentFileByPosition ( 0 ) , MOVIEMODE . PLAY ) ;
ReadOnly = true ;
StartNewMovie ( m , false ) ;
}
2011-06-11 12:54:26 +00:00
}
2011-05-21 22:37:15 +00:00
2011-03-19 09:12:56 +00:00
if ( cmdLoadState ! = null & & Global . Game ! = null )
2011-02-05 21:00:59 +00:00
LoadState ( "QuickSave" + cmdLoadState ) ;
2011-09-17 00:25:34 +00:00
else if ( Global . Config . AutoLoadLastSaveSlot & & Global . Game ! = null )
LoadState ( "QuickSave" + Global . Config . SaveSlot . ToString ( ) ) ;
2011-02-05 21:00:59 +00:00
2011-02-20 08:40:22 +00:00
if ( Global . Config . AutoLoadRamWatch )
LoadRamWatch ( ) ;
if ( Global . Config . AutoLoadRamSearch )
LoadRamSearch ( ) ;
2011-06-11 12:54:26 +00:00
if ( Global . Config . AutoLoadHexEditor )
LoadHexEditor ( ) ;
if ( Global . Config . AutoLoadCheats )
LoadCheatsWindow ( ) ;
2011-03-16 14:37:01 +00:00
if ( Global . Config . AutoLoadNESPPU & & Global . Emulator is NES )
2011-06-11 12:54:26 +00:00
LoadNESPPU ( ) ;
if ( Global . Config . AutoLoadNESNameTable & & Global . Emulator is NES )
LoadNESNameTable ( ) ;
if ( Global . Config . AutoLoadNESDebugger & & Global . Emulator is NES )
LoadNESDebugger ( ) ;
if ( Global . Config . NESGGAutoload & & Global . Emulator is NES )
LoadGameGenieEC ( ) ;
2011-06-11 22:32:12 +00:00
if ( Global . Config . AutoloadTAStudio )
LoadTAStudio ( ) ;
2012-01-10 01:30:17 +00:00
if ( Global . Config . AutoLoadLuaConsole )
OpenLuaConsole ( ) ;
2012-03-13 02:41:10 +00:00
if ( Global . Config . PCEBGViewerAutoload & & Global . Emulator is PCEngine )
LoadPCEBGViewer ( ) ;
2011-02-20 08:40:22 +00:00
if ( Global . Config . MainWndx > = 0 & & Global . Config . MainWndy > = 0 & & Global . Config . SaveWindowPosition )
this . Location = new Point ( Global . Config . MainWndx , Global . Config . MainWndy ) ;
2011-06-11 12:54:26 +00:00
if ( Global . Config . DisplayStatusBar = = false )
2011-07-01 01:28:25 +00:00
StatusSlot0 . Visible = false ;
2011-06-11 12:54:26 +00:00
else
displayStatusBarToolStripMenuItem . Checked = true ;
2011-06-10 04:41:33 +00:00
2011-02-20 08:40:22 +00:00
if ( Global . Config . StartPaused )
PauseEmulator ( ) ;
2011-09-11 00:11:46 +00:00
if ( ! INTERIM )
{
debuggerToolStripMenuItem . Enabled = false ;
2012-03-03 20:49:44 +00:00
//luaConsoleToolStripMenuItem.Enabled = false;
2011-09-11 00:11:46 +00:00
}
2011-02-21 09:48:53 +00:00
}
2011-02-20 08:40:22 +00:00
2011-06-11 22:15:08 +00:00
void SyncCoreInputComm ( )
{
Global . CoreInputComm . NES_BackdropColor = Global . Config . NESBackgroundColor ;
Global . CoreInputComm . NES_UnlimitedSprites = Global . Config . NESAllowMoreThanEightSprites ;
Global . CoreInputComm . NES_ShowBG = Global . Config . NESDispBackground ;
Global . CoreInputComm . NES_ShowOBJ = Global . Config . NESDispSprites ;
2012-03-11 09:51:23 +00:00
Global . CoreInputComm . PCE_ShowBG1 = Global . Config . PCEDispBG1 ;
Global . CoreInputComm . PCE_ShowOBJ1 = Global . Config . PCEDispOBJ1 ;
Global . CoreInputComm . PCE_ShowBG2 = Global . Config . PCEDispBG2 ;
Global . CoreInputComm . PCE_ShowOBJ2 = Global . Config . PCEDispOBJ2 ;
2012-03-11 16:15:20 +00:00
Global . CoreInputComm . SMS_ShowBG = Global . Config . SMSDispBG ;
Global . CoreInputComm . SMS_ShowOBJ = Global . Config . SMSDispOBJ ;
2011-06-11 22:15:08 +00:00
}
2011-03-21 00:54:30 +00:00
void SyncPresentationMode ( )
{
2012-03-12 04:44:34 +00:00
#if WINDOWS
2011-08-21 01:07:58 +00:00
bool gdi = Global . Config . DisplayGDI ;
2011-09-24 16:19:38 +00:00
if ( Global . Direct3D = = null )
2011-08-21 01:07:58 +00:00
gdi = true ;
2012-03-12 04:44:34 +00:00
#endif
2011-03-21 00:54:30 +00:00
if ( renderTarget ! = null )
{
renderTarget . Dispose ( ) ;
Controls . Remove ( renderTarget ) ;
}
if ( retainedPanel ! = null ) retainedPanel . Dispose ( ) ;
if ( Global . RenderPanel ! = null ) Global . RenderPanel . Dispose ( ) ;
2012-03-12 04:44:34 +00:00
#if WINDOWS
2011-03-21 00:54:30 +00:00
if ( gdi )
2012-03-12 04:44:34 +00:00
#endif
2011-03-21 00:54:30 +00:00
renderTarget = retainedPanel = new RetainedViewportPanel ( ) ;
2012-03-12 04:44:34 +00:00
#if WINDOWS
2011-03-21 00:54:30 +00:00
else renderTarget = new ViewportPanel ( ) ;
2012-03-12 04:44:34 +00:00
#endif
2011-03-21 00:54:30 +00:00
Controls . Add ( renderTarget ) ;
Controls . SetChildIndex ( renderTarget , 0 ) ;
renderTarget . Dock = DockStyle . Fill ;
renderTarget . BackColor = Color . Black ;
2012-03-12 04:44:34 +00:00
#if WINDOWS
2011-03-21 00:54:30 +00:00
if ( gdi )
{
2012-03-12 04:44:34 +00:00
#endif
2011-03-21 00:54:30 +00:00
Global . RenderPanel = new SysdrawingRenderPanel ( retainedPanel ) ;
retainedPanel . ActivateThreaded ( ) ;
2012-03-12 04:44:34 +00:00
#if WINDOWS
2011-03-21 00:54:30 +00:00
}
else
{
2011-08-21 01:07:58 +00:00
try
{
var d3dPanel = new Direct3DRenderPanel ( Global . Direct3D , renderTarget ) ;
d3dPanel . CreateDevice ( ) ;
Global . RenderPanel = d3dPanel ;
}
catch
{
Program . DisplayDirect3DError ( ) ;
Global . Direct3D . Dispose ( ) ;
Global . Direct3D = null ;
SyncPresentationMode ( ) ;
}
2011-03-21 00:54:30 +00:00
}
2012-03-12 04:44:34 +00:00
#endif
2011-03-21 00:54:30 +00:00
}
2011-06-11 12:54:26 +00:00
void SyncThrottle ( )
{
2011-09-04 05:18:38 +00:00
bool fastforward = Global . ClientControls [ "Fast Forward" ] ;
Global . ForceNoVsync = unthrottled | | fastforward ;
2011-09-16 00:40:33 +00:00
throttle . SetCoreFps ( Global . Emulator . CoreOutputComm . VsyncRate ) ;
2012-03-18 17:11:59 +00:00
throttle . signal_paused = EmulatorPaused | | Global . Emulator is NullEmulator ;
2011-06-11 12:54:26 +00:00
throttle . signal_unthrottle = unthrottled ;
2011-09-04 05:18:38 +00:00
if ( fastforward )
2011-06-11 12:54:26 +00:00
throttle . SetSpeedPercent ( Global . Config . SpeedPercentAlternate ) ;
else
throttle . SetSpeedPercent ( Global . Config . SpeedPercent ) ;
}
2011-06-10 07:12:57 +00:00
2011-06-11 12:54:26 +00:00
void SetSpeedPercentAlternate ( int value )
{
Global . Config . SpeedPercentAlternate = value ;
SyncThrottle ( ) ;
Global . RenderPanel . AddMessage ( "Alternate Speed: " + value + "%" ) ;
}
2011-03-21 00:54:30 +00:00
2011-02-21 09:48:53 +00:00
void SetSpeedPercent ( int value )
{
Global . Config . SpeedPercent = value ;
2011-06-11 12:54:26 +00:00
SyncThrottle ( ) ;
Global . RenderPanel . AddMessage ( "Speed: " + value + "%" ) ;
2011-02-20 08:40:22 +00:00
}
public void ProgramRunLoop ( )
{
2012-02-24 20:38:35 +00:00
CheckMessages ( ) ;
LogConsole . PositionConsole ( ) ;
2011-02-20 08:40:22 +00:00
for ( ; ; )
{
2011-07-09 22:09:39 +00:00
Input . Instance . Update ( ) ;
2011-07-10 07:39:40 +00:00
//handle events and dispatch as a hotkey action, or a hotkey button, or an input button
ProcessInput ( ) ;
Global . ClientControls . LatchFromPhysical ( Global . HotkeyCoalescer ) ;
Global . ActiveController . LatchFromPhysical ( Global . ControllerInputCoalescer ) ;
2011-07-24 20:23:27 +00:00
Global . ActiveController . OR_FromLogical ( Global . ClickyVirtualPadController ) ;
2011-08-09 00:51:46 +00:00
Global . AutoFireController . LatchFromPhysical ( Global . ControllerInputCoalescer ) ;
2011-07-24 20:23:27 +00:00
Global . ClickyVirtualPadController . FrameTick ( ) ;
2012-01-28 21:43:55 +00:00
2012-03-23 23:03:39 +00:00
#if WINDOWS
2012-03-30 12:26:36 +00:00
LuaConsole1 . ResumeScripts ( false ) ;
2012-03-23 23:03:39 +00:00
#endif
2011-02-21 09:48:53 +00:00
StepRunLoop_Core ( ) ;
2011-09-16 00:40:33 +00:00
//if(!IsNullEmulator())
2011-09-24 16:19:38 +00:00
StepRunLoop_Throttle ( ) ;
2011-06-11 12:54:26 +00:00
2011-02-20 08:40:22 +00:00
Render ( ) ;
2012-01-28 21:43:55 +00:00
2011-02-20 08:40:22 +00:00
CheckMessages ( ) ;
2011-02-21 09:48:53 +00:00
if ( exit )
2011-02-20 18:28:01 +00:00
break ;
2011-02-20 08:40:22 +00:00
Thread . Sleep ( 0 ) ;
}
2011-07-11 07:35:14 +00:00
Shutdown ( ) ;
}
void Shutdown ( )
{
if ( CurrAviWriter ! = null )
{
CurrAviWriter . CloseFile ( ) ;
CurrAviWriter = null ;
2012-02-24 07:48:06 +00:00
}
2011-02-20 08:40:22 +00:00
}
void CheckMessages ( )
{
Application . DoEvents ( ) ;
if ( ActiveForm ! = null )
ScreenSaver . ResetTimerPeriodically ( ) ;
}
2012-01-21 20:20:06 +00:00
public void PauseEmulator ( )
2011-02-20 08:40:22 +00:00
{
EmulatorPaused = true ;
2011-07-09 18:39:48 +00:00
PauseStrip . Image = BizHawk . MultiClient . Properties . Resources . Pause ;
2011-02-20 08:40:22 +00:00
}
2012-01-21 20:20:06 +00:00
public void UnpauseEmulator ( )
2011-02-20 08:40:22 +00:00
{
EmulatorPaused = false ;
2011-07-09 18:39:48 +00:00
PauseStrip . Image = BizHawk . MultiClient . Properties . Resources . Blank ;
2011-02-20 08:40:22 +00:00
}
2011-06-11 12:54:26 +00:00
public void TogglePause ( )
{
EmulatorPaused ^ = true ;
2011-06-19 20:50:46 +00:00
if ( EmulatorPaused )
2011-07-09 18:39:48 +00:00
PauseStrip . Image = BizHawk . MultiClient . Properties . Resources . Pause ;
2011-06-19 20:50:46 +00:00
else
2011-07-09 18:39:48 +00:00
PauseStrip . Image = BizHawk . MultiClient . Properties . Resources . Blank ;
2011-06-19 20:50:46 +00:00
2011-06-11 12:54:26 +00:00
}
2011-05-22 18:38:44 +00:00
2011-02-20 08:40:22 +00:00
private void LoadRomFromRecent ( string rom )
{
2011-06-11 12:54:26 +00:00
bool r = LoadRom ( rom ) ;
2011-02-20 08:40:22 +00:00
if ( ! r )
{
Global . Sound . StopSound ( ) ;
DialogResult result = MessageBox . Show ( "Could not open " + rom + "\nRemove from list?" , "File not found" , MessageBoxButtons . YesNo , MessageBoxIcon . Error ) ;
if ( result = = DialogResult . Yes )
Global . Config . RecentRoms . Remove ( rom ) ;
Global . Sound . StartSound ( ) ;
}
}
2011-06-11 12:54:26 +00:00
private void LoadMoviesFromRecent ( string movie )
{
2011-07-30 23:59:31 +00:00
Movie m = new Movie ( movie , MOVIEMODE . PLAY ) ;
2011-07-13 01:29:13 +00:00
2011-07-30 23:59:31 +00:00
if ( ! m . Loaded )
2011-06-11 12:54:26 +00:00
{
Global . Sound . StopSound ( ) ;
DialogResult result = MessageBox . Show ( "Could not open " + movie + "\nRemove from list?" , "File not found" , MessageBoxButtons . YesNo , MessageBoxIcon . Error ) ;
if ( result = = DialogResult . Yes )
Global . Config . RecentMovies . Remove ( movie ) ;
Global . Sound . StartSound ( ) ;
}
2011-07-13 01:29:13 +00:00
else
{
ReadOnly = true ;
StartNewMovie ( m , false ) ;
}
2011-06-11 12:54:26 +00:00
}
2011-05-19 18:50:09 +00:00
2011-02-20 08:40:22 +00:00
public static ControllerDefinition ClientControlsDef = new ControllerDefinition
{
Name = "Emulator Frontend Controls" ,
2012-02-24 07:48:06 +00:00
BoolButtons = { "Fast Forward" , "Rewind" , "Hard Reset" , "Mode Flip" , "Quick Save State" , "Quick Load State" , "Save Named State" , "Load Named State" ,
2011-06-30 02:22:12 +00:00
"Emulator Pause" , "Frame Advance" , "Unthrottle" , "Screenshot" , "Toggle Fullscreen" , "SelectSlot0" , "SelectSlot1" , "SelectSlot2" , "SelectSlot3" , "SelectSlot4" ,
"SelectSlot5" , "SelectSlot6" , "SelectSlot7" , "SelectSlot8" , "SelectSlot9" , "SaveSlot0" , "SaveSlot1" , "SaveSlot2" , "SaveSlot3" , "SaveSlot4" ,
"SaveSlot5" , "SaveSlot6" , "SaveSlot7" , "SaveSlot8" , "SaveSlot9" , "LoadSlot0" , "LoadSlot1" , "LoadSlot2" , "LoadSlot3" , "LoadSlot4" , "LoadSlot5" , "LoadSlot6" ,
2012-02-24 07:48:06 +00:00
"LoadSlot7" , "LoadSlot8" , "LoadSlot9" , "ToolBox" , "Previous Slot" , "Next Slot" , "Ram Watch" , "Ram Search" , "Ram Poke" , "Hex Editor" ,
2011-06-30 02:22:12 +00:00
"Lua Console" , "Cheats" , "Open ROM" , "Close ROM" , "Display FPS" , "Display FrameCounter" , "Display LagCounter" , "Display Input" , "Toggle Read Only" ,
"Play Movie" , "Record Movie" , "Stop Movie" , "Play Beginning" , "Volume Up" , "Volume Down" , "Toggle MultiTrack" , "Record All" , "Record None" , "Increment Player" ,
2011-10-01 03:43:37 +00:00
"Soft Reset" , "Decrement Player" , "Record AVI" , "Stop AVI" , "Toggle Menu" }
2011-02-20 08:40:22 +00:00
} ;
private void InitControls ( )
{
var controls = new Controller ( ClientControlsDef ) ;
2012-03-28 02:32:05 +00:00
controls . BindMulti ( "IncreaseWindowSize" , Global . Config . IncreaseWindowSize ) ;
controls . BindMulti ( "DecreaseWindowSize" , Global . Config . DecreaseWindowSize ) ;
2011-02-20 08:40:22 +00:00
controls . BindMulti ( "Fast Forward" , Global . Config . FastForwardBinding ) ;
controls . BindMulti ( "Rewind" , Global . Config . RewindBinding ) ;
controls . BindMulti ( "Hard Reset" , Global . Config . HardResetBinding ) ;
controls . BindMulti ( "Emulator Pause" , Global . Config . EmulatorPauseBinding ) ;
controls . BindMulti ( "Frame Advance" , Global . Config . FrameAdvanceBinding ) ;
2011-07-05 02:36:46 +00:00
controls . BindMulti ( "Unthrottle" , Global . Config . TurboBinding ) ;
2011-02-20 08:40:22 +00:00
controls . BindMulti ( "Screenshot" , Global . Config . ScreenshotBinding ) ;
controls . BindMulti ( "Toggle Fullscreen" , Global . Config . ToggleFullscreenBinding ) ;
controls . BindMulti ( "Quick Save State" , Global . Config . QuickSave ) ;
controls . BindMulti ( "Quick Load State" , Global . Config . QuickLoad ) ;
controls . BindMulti ( "SelectSlot0" , Global . Config . SelectSlot0 ) ;
controls . BindMulti ( "SelectSlot1" , Global . Config . SelectSlot1 ) ;
controls . BindMulti ( "SelectSlot2" , Global . Config . SelectSlot2 ) ;
controls . BindMulti ( "SelectSlot3" , Global . Config . SelectSlot3 ) ;
controls . BindMulti ( "SelectSlot4" , Global . Config . SelectSlot4 ) ;
controls . BindMulti ( "SelectSlot5" , Global . Config . SelectSlot5 ) ;
controls . BindMulti ( "SelectSlot6" , Global . Config . SelectSlot6 ) ;
controls . BindMulti ( "SelectSlot7" , Global . Config . SelectSlot7 ) ;
controls . BindMulti ( "SelectSlot8" , Global . Config . SelectSlot8 ) ;
controls . BindMulti ( "SelectSlot9" , Global . Config . SelectSlot9 ) ;
controls . BindMulti ( "SaveSlot0" , Global . Config . SaveSlot0 ) ;
controls . BindMulti ( "SaveSlot1" , Global . Config . SaveSlot1 ) ;
controls . BindMulti ( "SaveSlot2" , Global . Config . SaveSlot2 ) ;
controls . BindMulti ( "SaveSlot3" , Global . Config . SaveSlot3 ) ;
controls . BindMulti ( "SaveSlot4" , Global . Config . SaveSlot4 ) ;
controls . BindMulti ( "SaveSlot5" , Global . Config . SaveSlot5 ) ;
controls . BindMulti ( "SaveSlot6" , Global . Config . SaveSlot6 ) ;
controls . BindMulti ( "SaveSlot7" , Global . Config . SaveSlot7 ) ;
controls . BindMulti ( "SaveSlot8" , Global . Config . SaveSlot8 ) ;
controls . BindMulti ( "SaveSlot9" , Global . Config . SaveSlot9 ) ;
controls . BindMulti ( "LoadSlot0" , Global . Config . LoadSlot0 ) ;
controls . BindMulti ( "LoadSlot1" , Global . Config . LoadSlot1 ) ;
controls . BindMulti ( "LoadSlot2" , Global . Config . LoadSlot2 ) ;
controls . BindMulti ( "LoadSlot3" , Global . Config . LoadSlot3 ) ;
controls . BindMulti ( "LoadSlot4" , Global . Config . LoadSlot4 ) ;
controls . BindMulti ( "LoadSlot5" , Global . Config . LoadSlot5 ) ;
controls . BindMulti ( "LoadSlot6" , Global . Config . LoadSlot6 ) ;
controls . BindMulti ( "LoadSlot7" , Global . Config . LoadSlot7 ) ;
controls . BindMulti ( "LoadSlot8" , Global . Config . LoadSlot8 ) ;
controls . BindMulti ( "LoadSlot9" , Global . Config . LoadSlot9 ) ;
2011-06-11 12:54:26 +00:00
controls . BindMulti ( "ToolBox" , Global . Config . ToolBox ) ;
controls . BindMulti ( "Save Named State" , Global . Config . SaveNamedState ) ;
controls . BindMulti ( "Load Named State" , Global . Config . LoadNamedState ) ;
controls . BindMulti ( "Previous Slot" , Global . Config . PreviousSlot ) ;
controls . BindMulti ( "Next Slot" , Global . Config . NextSlot ) ;
controls . BindMulti ( "Ram Watch" , Global . Config . RamWatch ) ;
controls . BindMulti ( "Ram Search" , Global . Config . RamSearch ) ;
controls . BindMulti ( "Ram Poke" , Global . Config . RamPoke ) ;
controls . BindMulti ( "Hex Editor" , Global . Config . HexEditor ) ;
controls . BindMulti ( "Lua Console" , Global . Config . LuaConsole ) ;
controls . BindMulti ( "Cheats" , Global . Config . Cheats ) ;
controls . BindMulti ( "Open ROM" , Global . Config . OpenROM ) ;
controls . BindMulti ( "Close ROM" , Global . Config . CloseROM ) ;
controls . BindMulti ( "Display FPS" , Global . Config . FPSBinding ) ;
controls . BindMulti ( "Display FrameCounter" , Global . Config . FrameCounterBinding ) ;
controls . BindMulti ( "Display LagCounter" , Global . Config . LagCounterBinding ) ;
controls . BindMulti ( "Display Input" , Global . Config . InputDisplayBinding ) ;
controls . BindMulti ( "Toggle Read Only" , Global . Config . ReadOnlyToggleBinding ) ;
controls . BindMulti ( "Play Movie" , Global . Config . PlayMovieBinding ) ;
controls . BindMulti ( "Record Movie" , Global . Config . RecordMovieBinding ) ;
controls . BindMulti ( "Stop Movie" , Global . Config . StopMovieBinding ) ;
controls . BindMulti ( "Play Beginning" , Global . Config . PlayBeginningBinding ) ;
controls . BindMulti ( "Volume Up" , Global . Config . VolUpBinding ) ;
controls . BindMulti ( "Volume Down" , Global . Config . VolDownBinding ) ;
2011-06-30 02:22:12 +00:00
controls . BindMulti ( "Toggle MultiTrack" , Global . Config . ToggleMultiTrack ) ;
controls . BindMulti ( "Record All" , Global . Config . MTRecordAll ) ;
controls . BindMulti ( "Record None" , Global . Config . MTRecordNone ) ;
controls . BindMulti ( "Increment Player" , Global . Config . MTIncrementPlayer ) ;
controls . BindMulti ( "Decrement Player" , Global . Config . MTDecrementPlayer ) ;
controls . BindMulti ( "Soft Reset" , Global . Config . SoftResetBinding ) ;
2011-07-12 00:05:14 +00:00
controls . BindMulti ( "Record AVI" , Global . Config . AVIRecordBinding ) ;
controls . BindMulti ( "Stop AVI" , Global . Config . AVIStopBinding ) ;
2011-10-01 03:43:37 +00:00
controls . BindMulti ( "Toggle Menu" , Global . Config . ToggleMenuBinding ) ;
2011-04-11 01:30:11 +00:00
2011-02-20 08:40:22 +00:00
Global . ClientControls = controls ;
2011-06-11 12:54:26 +00:00
Global . NullControls = new Controller ( NullEmulator . NullController ) ;
2011-08-10 04:31:07 +00:00
Global . AutofireNullControls = new AutofireController ( NullEmulator . NullController ) ;
2011-05-08 13:43:53 +00:00
2011-02-20 08:40:22 +00:00
var smsControls = new Controller ( SMS . SmsController ) ;
smsControls . BindMulti ( "Reset" , Global . Config . SmsReset ) ;
smsControls . BindMulti ( "Pause" , Global . Config . SmsPause ) ;
for ( int i = 0 ; i < 2 ; i + + )
{
smsControls . BindMulti ( string . Format ( "P{0} Up" , i + 1 ) , Global . Config . SMSController [ i ] . Up ) ;
smsControls . BindMulti ( string . Format ( "P{0} Left" , i + 1 ) , Global . Config . SMSController [ i ] . Left ) ;
smsControls . BindMulti ( string . Format ( "P{0} Right" , i + 1 ) , Global . Config . SMSController [ i ] . Right ) ;
smsControls . BindMulti ( string . Format ( "P{0} Down" , i + 1 ) , Global . Config . SMSController [ i ] . Down ) ;
smsControls . BindMulti ( string . Format ( "P{0} B1" , i + 1 ) , Global . Config . SMSController [ i ] . B1 ) ;
smsControls . BindMulti ( string . Format ( "P{0} B2" , i + 1 ) , Global . Config . SMSController [ i ] . B2 ) ;
}
Global . SMSControls = smsControls ;
2011-08-09 22:13:57 +00:00
var asmsControls = new AutofireController ( SMS . SmsController ) ;
2011-08-09 02:16:46 +00:00
asmsControls . Autofire = true ;
asmsControls . BindMulti ( "Reset" , Global . Config . SmsReset ) ;
asmsControls . BindMulti ( "Pause" , Global . Config . SmsPause ) ;
for ( int i = 0 ; i < 2 ; i + + )
{
asmsControls . BindMulti ( string . Format ( "P{0} Up" , i + 1 ) , Global . Config . SMSAutoController [ i ] . Up ) ;
asmsControls . BindMulti ( string . Format ( "P{0} Left" , i + 1 ) , Global . Config . SMSAutoController [ i ] . Left ) ;
asmsControls . BindMulti ( string . Format ( "P{0} Right" , i + 1 ) , Global . Config . SMSAutoController [ i ] . Right ) ;
asmsControls . BindMulti ( string . Format ( "P{0} Down" , i + 1 ) , Global . Config . SMSAutoController [ i ] . Down ) ;
asmsControls . BindMulti ( string . Format ( "P{0} B1" , i + 1 ) , Global . Config . SMSAutoController [ i ] . B1 ) ;
asmsControls . BindMulti ( string . Format ( "P{0} B2" , i + 1 ) , Global . Config . SMSAutoController [ i ] . B2 ) ;
}
Global . AutofireSMSControls = asmsControls ;
2011-02-20 08:40:22 +00:00
var pceControls = new Controller ( PCEngine . PCEngineController ) ;
2011-03-14 06:12:40 +00:00
for ( int i = 0 ; i < 5 ; i + + )
2011-02-20 08:40:22 +00:00
{
2011-06-11 12:54:26 +00:00
pceControls . BindMulti ( "P" + ( i + 1 ) + " Up" , Global . Config . PCEController [ i ] . Up ) ;
pceControls . BindMulti ( "P" + ( i + 1 ) + " Down" , Global . Config . PCEController [ i ] . Down ) ;
pceControls . BindMulti ( "P" + ( i + 1 ) + " Left" , Global . Config . PCEController [ i ] . Left ) ;
pceControls . BindMulti ( "P" + ( i + 1 ) + " Right" , Global . Config . PCEController [ i ] . Right ) ;
pceControls . BindMulti ( "P" + ( i + 1 ) + " B2" , Global . Config . PCEController [ i ] . II ) ;
pceControls . BindMulti ( "P" + ( i + 1 ) + " B1" , Global . Config . PCEController [ i ] . I ) ;
pceControls . BindMulti ( "P" + ( i + 1 ) + " Select" , Global . Config . PCEController [ i ] . Select ) ;
pceControls . BindMulti ( "P" + ( i + 1 ) + " Run" , Global . Config . PCEController [ i ] . Run ) ;
2011-02-20 08:40:22 +00:00
}
Global . PCEControls = pceControls ;
2011-08-09 22:13:57 +00:00
var apceControls = new AutofireController ( PCEngine . PCEngineController ) ;
2011-08-09 02:40:22 +00:00
apceControls . Autofire = true ;
for ( int i = 0 ; i < 5 ; i + + )
{
apceControls . BindMulti ( "P" + ( i + 1 ) + " Up" , Global . Config . PCEAutoController [ i ] . Up ) ;
apceControls . BindMulti ( "P" + ( i + 1 ) + " Down" , Global . Config . PCEAutoController [ i ] . Down ) ;
apceControls . BindMulti ( "P" + ( i + 1 ) + " Left" , Global . Config . PCEAutoController [ i ] . Left ) ;
apceControls . BindMulti ( "P" + ( i + 1 ) + " Right" , Global . Config . PCEAutoController [ i ] . Right ) ;
apceControls . BindMulti ( "P" + ( i + 1 ) + " B2" , Global . Config . PCEAutoController [ i ] . II ) ;
apceControls . BindMulti ( "P" + ( i + 1 ) + " B1" , Global . Config . PCEAutoController [ i ] . I ) ;
apceControls . BindMulti ( "P" + ( i + 1 ) + " Select" , Global . Config . PCEAutoController [ i ] . Select ) ;
apceControls . BindMulti ( "P" + ( i + 1 ) + " Run" , Global . Config . PCEAutoController [ i ] . Run ) ;
}
Global . AutofirePCEControls = apceControls ;
2011-06-11 12:54:26 +00:00
var nesControls = new Controller ( NES . NESController ) ;
2011-07-13 02:11:20 +00:00
2011-06-19 00:18:02 +00:00
for ( int i = 0 ; i < 2 /*TODO*/ ; i + + )
2011-06-11 12:54:26 +00:00
{
2011-06-19 00:18:02 +00:00
nesControls . BindMulti ( "P" + ( i + 1 ) + " Up" , Global . Config . NESController [ i ] . Up ) ;
nesControls . BindMulti ( "P" + ( i + 1 ) + " Down" , Global . Config . NESController [ i ] . Down ) ;
nesControls . BindMulti ( "P" + ( i + 1 ) + " Left" , Global . Config . NESController [ i ] . Left ) ;
nesControls . BindMulti ( "P" + ( i + 1 ) + " Right" , Global . Config . NESController [ i ] . Right ) ;
nesControls . BindMulti ( "P" + ( i + 1 ) + " A" , Global . Config . NESController [ i ] . A ) ;
nesControls . BindMulti ( "P" + ( i + 1 ) + " B" , Global . Config . NESController [ i ] . B ) ;
nesControls . BindMulti ( "P" + ( i + 1 ) + " Select" , Global . Config . NESController [ i ] . Select ) ;
nesControls . BindMulti ( "P" + ( i + 1 ) + " Start" , Global . Config . NESController [ i ] . Start ) ;
2011-06-11 12:54:26 +00:00
}
Global . NESControls = nesControls ;
2011-03-01 13:25:23 +00:00
2011-08-09 22:13:57 +00:00
var anesControls = new AutofireController ( NES . NESController ) ;
2011-08-09 00:51:46 +00:00
anesControls . Autofire = true ;
2011-08-09 01:38:51 +00:00
for ( int i = 0 ; i < 2 /*TODO*/ ; i + + )
2011-08-09 00:51:46 +00:00
{
2011-08-09 01:38:51 +00:00
anesControls . BindMulti ( "P" + ( i + 1 ) + " Up" , Global . Config . NESAutoController [ i ] . Up ) ;
anesControls . BindMulti ( "P" + ( i + 1 ) + " Down" , Global . Config . NESAutoController [ i ] . Down ) ;
anesControls . BindMulti ( "P" + ( i + 1 ) + " Left" , Global . Config . NESAutoController [ i ] . Left ) ;
anesControls . BindMulti ( "P" + ( i + 1 ) + " Right" , Global . Config . NESAutoController [ i ] . Right ) ;
anesControls . BindMulti ( "P" + ( i + 1 ) + " A" , Global . Config . NESAutoController [ i ] . A ) ;
anesControls . BindMulti ( "P" + ( i + 1 ) + " B" , Global . Config . NESAutoController [ i ] . B ) ;
anesControls . BindMulti ( "P" + ( i + 1 ) + " Select" , Global . Config . NESAutoController [ i ] . Select ) ;
anesControls . BindMulti ( "P" + ( i + 1 ) + " Start" , Global . Config . NESAutoController [ i ] . Start ) ;
2011-08-09 00:51:46 +00:00
}
2011-08-09 02:16:46 +00:00
Global . AutofireNESControls = anesControls ;
2011-08-09 00:51:46 +00:00
2011-06-27 01:24:26 +00:00
var gbControls = new Controller ( Gameboy . GbController ) ;
gbControls . BindMulti ( "Up" , Global . Config . GBController . Up ) ;
gbControls . BindMulti ( "Down" , Global . Config . GBController . Down ) ;
gbControls . BindMulti ( "Left" , Global . Config . GBController . Left ) ;
gbControls . BindMulti ( "Right" , Global . Config . GBController . Right ) ;
gbControls . BindMulti ( "A" , Global . Config . GBController . A ) ;
gbControls . BindMulti ( "B" , Global . Config . GBController . B ) ;
gbControls . BindMulti ( "Select" , Global . Config . GBController . Select ) ;
gbControls . BindMulti ( "Start" , Global . Config . GBController . Start ) ;
Global . GBControls = gbControls ;
2011-08-09 22:13:57 +00:00
var agbControls = new AutofireController ( Gameboy . GbController ) ;
2011-08-09 02:40:22 +00:00
agbControls . Autofire = true ;
agbControls . BindMulti ( "Up" , Global . Config . GBAutoController . Up ) ;
agbControls . BindMulti ( "Down" , Global . Config . GBAutoController . Down ) ;
agbControls . BindMulti ( "Left" , Global . Config . GBAutoController . Left ) ;
agbControls . BindMulti ( "Right" , Global . Config . GBAutoController . Right ) ;
agbControls . BindMulti ( "A" , Global . Config . GBAutoController . A ) ;
agbControls . BindMulti ( "B" , Global . Config . GBAutoController . B ) ;
agbControls . BindMulti ( "Select" , Global . Config . GBAutoController . Select ) ;
agbControls . BindMulti ( "Start" , Global . Config . GBAutoController . Start ) ;
Global . AutofireGBControls = agbControls ;
2011-02-20 08:40:22 +00:00
var genControls = new Controller ( Genesis . GenesisController ) ;
2011-12-24 01:59:51 +00:00
genControls . BindMulti ( "P1 Up" , Global . Config . GenesisController [ 0 ] . Up ) ;
genControls . BindMulti ( "P1 Left" , Global . Config . GenesisController [ 0 ] . Left ) ;
genControls . BindMulti ( "P1 Right" , Global . Config . GenesisController [ 0 ] . Right ) ;
genControls . BindMulti ( "P1 Down" , Global . Config . GenesisController [ 0 ] . Down ) ;
genControls . BindMulti ( "P1 A" , Global . Config . GenesisController [ 0 ] . A ) ;
genControls . BindMulti ( "P1 B" , Global . Config . GenesisController [ 0 ] . B ) ;
genControls . BindMulti ( "P1 C" , Global . Config . GenesisController [ 0 ] . C ) ;
genControls . BindMulti ( "P1 Start" , Global . Config . GenesisController [ 0 ] . Start ) ;
2011-02-20 08:40:22 +00:00
Global . GenControls = genControls ;
2011-01-18 10:28:10 +00:00
2012-04-14 16:02:45 +00:00
var agenControls = new AutofireController ( Genesis . GenesisController ) ;
agenControls . BindMulti ( "P1 Up" , Global . Config . GenesisAutoController [ 0 ] . Up ) ;
agenControls . BindMulti ( "P1 Left" , Global . Config . GenesisAutoController [ 0 ] . Left ) ;
agenControls . BindMulti ( "P1 Right" , Global . Config . GenesisAutoController [ 0 ] . Right ) ;
agenControls . BindMulti ( "P1 Down" , Global . Config . GenesisAutoController [ 0 ] . Down ) ;
agenControls . BindMulti ( "P1 A" , Global . Config . GenesisAutoController [ 0 ] . A ) ;
agenControls . BindMulti ( "P1 B" , Global . Config . GenesisAutoController [ 0 ] . B ) ;
agenControls . BindMulti ( "P1 C" , Global . Config . GenesisAutoController [ 0 ] . C ) ;
agenControls . BindMulti ( "P1 Start" , Global . Config . GenesisAutoController [ 0 ] . Start ) ;
Global . AutofireGenControls = agenControls ;
2012-03-07 00:40:20 +00:00
var a2600Controls = new Controller ( Atari2600 . Atari2600ControllerDefinition ) ;
a2600Controls . BindMulti ( "P1 Up" , Global . Config . Atari2600Controller [ 0 ] . Up ) ;
a2600Controls . BindMulti ( "P1 Left" , Global . Config . Atari2600Controller [ 0 ] . Left ) ;
a2600Controls . BindMulti ( "P1 Right" , Global . Config . Atari2600Controller [ 0 ] . Right ) ;
a2600Controls . BindMulti ( "P1 Down" , Global . Config . Atari2600Controller [ 0 ] . Down ) ;
a2600Controls . BindMulti ( "P1 Button" , Global . Config . Atari2600Controller [ 0 ] . Button ) ;
2012-03-22 06:33:28 +00:00
a2600Controls . BindMulti ( "P2 Up" , Global . Config . Atari2600Controller [ 1 ] . Up ) ;
a2600Controls . BindMulti ( "P2 Left" , Global . Config . Atari2600Controller [ 1 ] . Left ) ;
a2600Controls . BindMulti ( "P2 Right" , Global . Config . Atari2600Controller [ 1 ] . Right ) ;
a2600Controls . BindMulti ( "P2 Down" , Global . Config . Atari2600Controller [ 1 ] . Down ) ;
a2600Controls . BindMulti ( "P2 Button" , Global . Config . Atari2600Controller [ 1 ] . Button ) ;
2012-03-30 16:40:52 +00:00
a2600Controls . BindMulti ( "Reset" , Global . Config . Atari2600ConsoleButtons [ 0 ] . Reset ) ;
a2600Controls . BindMulti ( "Select" , Global . Config . Atari2600ConsoleButtons [ 0 ] . Select ) ;
2012-03-07 00:40:20 +00:00
Global . Atari2600Controls = a2600Controls ;
var autofireA2600Controls = new AutofireController ( Atari2600 . Atari2600ControllerDefinition ) ;
2012-03-23 02:15:58 +00:00
autofireA2600Controls . BindMulti ( "P1 Up" , Global . Config . Atari2600AutoController [ 0 ] . Up ) ;
autofireA2600Controls . BindMulti ( "P1 Left" , Global . Config . Atari2600AutoController [ 0 ] . Left ) ;
autofireA2600Controls . BindMulti ( "P1 Right" , Global . Config . Atari2600AutoController [ 0 ] . Right ) ;
autofireA2600Controls . BindMulti ( "P1 Down" , Global . Config . Atari2600AutoController [ 0 ] . Down ) ;
autofireA2600Controls . BindMulti ( "P1 Button" , Global . Config . Atari2600AutoController [ 0 ] . Button ) ;
autofireA2600Controls . BindMulti ( "P2 Up" , Global . Config . Atari2600AutoController [ 1 ] . Up ) ;
autofireA2600Controls . BindMulti ( "P2 Left" , Global . Config . Atari2600AutoController [ 1 ] . Left ) ;
autofireA2600Controls . BindMulti ( "P2 Right" , Global . Config . Atari2600AutoController [ 1 ] . Right ) ;
autofireA2600Controls . BindMulti ( "P2 Down" , Global . Config . Atari2600AutoController [ 1 ] . Down ) ;
2012-03-22 06:33:28 +00:00
autofireA2600Controls . BindMulti ( "P2 Button" , Global . Config . Atari2600Controller [ 1 ] . Button ) ;
2012-03-07 00:40:20 +00:00
Global . AutofireAtari2600Controls = autofireA2600Controls ;
2012-01-28 21:43:55 +00:00
2011-01-18 10:28:10 +00:00
var TI83Controls = new Controller ( TI83 . TI83Controller ) ;
2011-07-13 02:11:20 +00:00
TI83Controls . BindMulti ( "0" , Global . Config . TI83Controller [ 0 ] . _0 ) ;
2011-04-24 02:01:36 +00:00
TI83Controls . BindMulti ( "1" , Global . Config . TI83Controller [ 0 ] . _1 ) ;
TI83Controls . BindMulti ( "2" , Global . Config . TI83Controller [ 0 ] . _2 ) ;
2011-06-11 12:54:26 +00:00
TI83Controls . BindMulti ( "3" , Global . Config . TI83Controller [ 0 ] . _3 ) ;
TI83Controls . BindMulti ( "4" , Global . Config . TI83Controller [ 0 ] . _4 ) ;
TI83Controls . BindMulti ( "5" , Global . Config . TI83Controller [ 0 ] . _5 ) ;
TI83Controls . BindMulti ( "6" , Global . Config . TI83Controller [ 0 ] . _6 ) ;
TI83Controls . BindMulti ( "7" , Global . Config . TI83Controller [ 0 ] . _7 ) ;
TI83Controls . BindMulti ( "8" , Global . Config . TI83Controller [ 0 ] . _8 ) ;
TI83Controls . BindMulti ( "9" , Global . Config . TI83Controller [ 0 ] . _9 ) ;
2011-04-24 02:01:36 +00:00
TI83Controls . BindMulti ( "ON" , Global . Config . TI83Controller [ 0 ] . ON ) ;
TI83Controls . BindMulti ( "ENTER" , Global . Config . TI83Controller [ 0 ] . ENTER ) ;
TI83Controls . BindMulti ( "DOWN" , Global . Config . TI83Controller [ 0 ] . DOWN ) ;
TI83Controls . BindMulti ( "LEFT" , Global . Config . TI83Controller [ 0 ] . LEFT ) ;
TI83Controls . BindMulti ( "RIGHT" , Global . Config . TI83Controller [ 0 ] . RIGHT ) ;
TI83Controls . BindMulti ( "UP" , Global . Config . TI83Controller [ 0 ] . UP ) ;
TI83Controls . BindMulti ( "PLUS" , Global . Config . TI83Controller [ 0 ] . PLUS ) ;
TI83Controls . BindMulti ( "MINUS" , Global . Config . TI83Controller [ 0 ] . MINUS ) ;
TI83Controls . BindMulti ( "MULTIPLY" , Global . Config . TI83Controller [ 0 ] . MULTIPLY ) ;
TI83Controls . BindMulti ( "DIVIDE" , Global . Config . TI83Controller [ 0 ] . DIVIDE ) ;
TI83Controls . BindMulti ( "CLEAR" , Global . Config . TI83Controller [ 0 ] . CLEAR ) ;
TI83Controls . BindMulti ( "DOT" , Global . Config . TI83Controller [ 0 ] . DOT ) ;
2011-06-11 12:54:26 +00:00
TI83Controls . BindMulti ( "EXP" , Global . Config . TI83Controller [ 0 ] . EXP ) ;
TI83Controls . BindMulti ( "DASH" , Global . Config . TI83Controller [ 0 ] . DASH ) ;
TI83Controls . BindMulti ( "PARACLOSE" , Global . Config . TI83Controller [ 0 ] . DASH ) ;
TI83Controls . BindMulti ( "TAN" , Global . Config . TI83Controller [ 0 ] . TAN ) ;
TI83Controls . BindMulti ( "VARS" , Global . Config . TI83Controller [ 0 ] . VARS ) ;
TI83Controls . BindMulti ( "PARAOPEN" , Global . Config . TI83Controller [ 0 ] . PARAOPEN ) ;
TI83Controls . BindMulti ( "COS" , Global . Config . TI83Controller [ 0 ] . COS ) ;
TI83Controls . BindMulti ( "PRGM" , Global . Config . TI83Controller [ 0 ] . PRGM ) ;
TI83Controls . BindMulti ( "STAT" , Global . Config . TI83Controller [ 0 ] . STAT ) ;
TI83Controls . BindMulti ( "COMMA" , Global . Config . TI83Controller [ 0 ] . COMMA ) ;
TI83Controls . BindMulti ( "SIN" , Global . Config . TI83Controller [ 0 ] . SIN ) ;
TI83Controls . BindMulti ( "MATRIX" , Global . Config . TI83Controller [ 0 ] . MATRIX ) ;
TI83Controls . BindMulti ( "X" , Global . Config . TI83Controller [ 0 ] . X ) ;
TI83Controls . BindMulti ( "STO" , Global . Config . TI83Controller [ 0 ] . STO ) ;
TI83Controls . BindMulti ( "LN" , Global . Config . TI83Controller [ 0 ] . LN ) ;
TI83Controls . BindMulti ( "LOG" , Global . Config . TI83Controller [ 0 ] . LOG ) ;
TI83Controls . BindMulti ( "SQUARED" , Global . Config . TI83Controller [ 0 ] . SQUARED ) ;
TI83Controls . BindMulti ( "NEG1" , Global . Config . TI83Controller [ 0 ] . NEG1 ) ;
TI83Controls . BindMulti ( "MATH" , Global . Config . TI83Controller [ 0 ] . MATH ) ;
TI83Controls . BindMulti ( "ALPHA" , Global . Config . TI83Controller [ 0 ] . ALPHA ) ;
TI83Controls . BindMulti ( "GRAPH" , Global . Config . TI83Controller [ 0 ] . GRAPH ) ;
TI83Controls . BindMulti ( "TRACE" , Global . Config . TI83Controller [ 0 ] . TRACE ) ;
TI83Controls . BindMulti ( "ZOOM" , Global . Config . TI83Controller [ 0 ] . ZOOM ) ;
TI83Controls . BindMulti ( "WINDOW" , Global . Config . TI83Controller [ 0 ] . WINDOW ) ;
TI83Controls . BindMulti ( "Y" , Global . Config . TI83Controller [ 0 ] . Y ) ;
TI83Controls . BindMulti ( "2ND" , Global . Config . TI83Controller [ 0 ] . SECOND ) ;
TI83Controls . BindMulti ( "MODE" , Global . Config . TI83Controller [ 0 ] . MODE ) ;
TI83Controls . BindMulti ( "DEL" , Global . Config . TI83Controller [ 0 ] . DEL ) ;
2011-01-18 10:28:10 +00:00
Global . TI83Controls = TI83Controls ;
2011-02-20 08:40:22 +00:00
}
2011-06-11 12:54:26 +00:00
private static void FormDragEnter ( object sender , DragEventArgs e )
2011-02-20 08:40:22 +00:00
{
e . Effect = e . Data . GetDataPresent ( DataFormats . FileDrop ) ? DragDropEffects . Copy : DragDropEffects . None ;
}
2011-06-11 12:54:26 +00:00
private bool IsValidMovieExtension ( string ext )
{
2012-04-02 00:47:52 +00:00
if ( ext . ToUpper ( ) = = "." + Global . Config . MovieExtension )
return true ;
else if ( ext . ToUpper ( ) = = ".TAS" )
return true ;
else if ( ext . ToUpper ( ) = = ".BKM" )
return true ;
return false ;
2011-06-11 12:54:26 +00:00
}
2011-05-13 17:03:05 +00:00
2011-02-20 08:40:22 +00:00
private void FormDragDrop ( object sender , DragEventArgs e )
{
string [ ] filePaths = ( string [ ] ) e . Data . GetData ( DataFormats . FileDrop ) ;
2011-06-11 12:54:26 +00:00
if ( IsValidMovieExtension ( Path . GetExtension ( filePaths [ 0 ] ) ) )
{
Movie m = new Movie ( filePaths [ 0 ] , MOVIEMODE . PLAY ) ;
StartNewMovie ( m , false ) ;
}
else if ( Path . GetExtension ( filePaths [ 0 ] ) . ToUpper ( ) = = ".STATE" )
LoadStateFile ( filePaths [ 0 ] , Path . GetFileName ( filePaths [ 0 ] ) ) ;
else if ( Path . GetExtension ( filePaths [ 0 ] ) . ToUpper ( ) = = ".CHT" )
{
LoadCheatsWindow ( ) ;
Cheats1 . LoadCheatFile ( filePaths [ 0 ] , false ) ;
Cheats1 . DisplayCheatsList ( ) ;
}
else if ( Path . GetExtension ( filePaths [ 0 ] ) . ToUpper ( ) = = ".WCH" )
{
LoadRamWatch ( ) ;
RamWatch1 . LoadWatchFile ( filePaths [ 0 ] , false ) ;
RamWatch1 . DisplayWatchList ( ) ;
}
2012-02-15 00:43:21 +00:00
else if ( MovieImport . IsValidMovieExtension ( Path . GetExtension ( filePaths [ 0 ] ) ) )
2011-06-11 12:54:26 +00:00
{
2012-03-03 18:11:07 +00:00
if ( CurrentlyOpenRom = = null )
OpenROM ( ) ;
else
LoadRom ( CurrentlyOpenRom ) ;
2012-03-03 18:24:34 +00:00
2012-02-24 07:48:06 +00:00
string errorMsg = "" ;
string warningMsg = "" ;
Movie m = MovieImport . ImportFile ( filePaths [ 0 ] , out errorMsg , out warningMsg ) ;
if ( errorMsg . Length > 0 )
MessageBox . Show ( errorMsg , "Conversion error" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
2011-07-14 01:12:18 +00:00
else
StartNewMovie ( m , false ) ;
2012-02-24 07:48:06 +00:00
Global . RenderPanel . AddMessage ( warningMsg ) ;
2012-03-30 12:26:36 +00:00
}
else
2011-06-11 12:54:26 +00:00
LoadRom ( filePaths [ 0 ] ) ;
2011-02-20 08:40:22 +00:00
}
2011-02-23 16:22:41 +00:00
public bool IsNullEmulator ( )
2011-02-20 08:40:22 +00:00
{
if ( Global . Emulator is NullEmulator )
return true ;
else
return false ;
}
private string DisplayNameForSystem ( string system )
{
2011-09-11 00:11:46 +00:00
string str = "" ;
2011-02-20 08:40:22 +00:00
switch ( system )
{
2011-09-11 00:11:46 +00:00
case "SG" : str + = "SG-1000" ; break ;
case "SMS" : str + = "Sega Master System" ; break ;
case "GG" : str + = "Game Gear" ; break ;
2011-09-24 17:05:34 +00:00
case "PCECD" : str + = "TurboGrafx-16 (CD)" ; break ;
2011-09-11 00:11:46 +00:00
case "PCE" : str + = "TurboGrafx-16" ; break ;
case "SGX" : str + = "SuperGrafx" ; break ;
case "GEN" : str + = "Genesis" ; break ;
case "TI83" : str + = "TI-83" ; break ;
case "NES" : str + = "NES" ; break ;
case "GB" : str + = "Game Boy" ; break ;
2012-03-30 12:26:36 +00:00
case "A26" : str + = "Atari 2600" ; break ;
2011-02-20 08:40:22 +00:00
}
2012-03-30 12:26:36 +00:00
2011-09-24 17:05:34 +00:00
if ( INTERIM ) str + = " (interim)" ;
2011-09-11 00:11:46 +00:00
return str ;
2011-02-20 08:40:22 +00:00
}
2012-03-30 12:26:36 +00:00
public string GetMovieExtName ( )
{
string str = "" , system = Global . Game . System , ext = GetAlternateExt ( ) ;
switch ( system )
{
case "SG" : str + = "SG-1000" ; break ;
case "SMS" : str + = "Sega Master System" ; break ;
case "GG" : str + = "Game Gear" ; break ;
case "PCECD" : str + = "TurboGrafx-16 (CD)" ; break ;
case "PCE" : str + = "TurboGrafx-16" ; break ;
case "SGX" : str + = "SuperGrafx" ; break ;
case "GEN" : str + = "Genesis" ; break ;
case "TI83" : str + = "TI-83" ; break ;
case "NES" : str + = "NES" ; break ;
case "GB" : str + = "Game Boy" ; break ;
}
return str + " Movie File (*" + ext + ")|*" + ext ;
}
private string GetAlternateExt ( )
{
string str = "." , system = Global . Game . System ;
switch ( system )
{
case "SG" : str + = "1000" ; break ;
case "SMS" : str + = "sms" ; break ;
case "GG" : str + = "gg" ; break ;
case "PCECD" : str + = "pcecd" ; break ;
case "PCE" : str + = "pce" ; break ;
case "SGX" : str + = "sgx" ; break ;
case "GEN" : str + = "gen" ; break ;
case "TI83" : str + = "ti83" ; break ;
case "NES" : str + = "nes" ; break ;
case "GB" : str + = "gb" ; break ;
}
2012-03-31 00:38:39 +00:00
return str + "." + Global . Config . MovieExtension ;
2012-03-30 12:26:36 +00:00
}
2012-03-28 08:35:43 +00:00
2011-06-11 12:54:26 +00:00
private void HandlePlatformMenus ( )
{
2011-03-13 00:44:45 +00:00
string system = "" ;
if ( Global . Game ! = null )
system = Global . Game . System ;
2011-06-11 12:54:26 +00:00
switch ( system )
{
case "TI83" :
NESToolStripMenuItem . Visible = false ;
2012-03-11 17:08:25 +00:00
tI83ToolStripMenuItem . Visible = true ;
2012-03-11 15:12:48 +00:00
pCEToolStripMenuItem . Visible = false ;
2012-03-11 17:08:25 +00:00
sMSToolStripMenuItem . Visible = false ;
2011-06-27 00:15:47 +00:00
gBToolStripMenuItem . Visible = false ;
2011-06-11 12:54:26 +00:00
break ;
case "NES" :
NESToolStripMenuItem . Visible = true ;
tI83ToolStripMenuItem . Visible = false ;
2012-03-11 15:12:48 +00:00
pCEToolStripMenuItem . Visible = false ;
2012-03-11 17:08:25 +00:00
sMSToolStripMenuItem . Visible = false ;
2012-03-11 15:12:48 +00:00
gBToolStripMenuItem . Visible = false ;
break ;
case "PCE" :
case "PCECD" :
case "SGX" :
NESToolStripMenuItem . Visible = false ;
tI83ToolStripMenuItem . Visible = false ;
pCEToolStripMenuItem . Visible = true ;
2012-03-11 17:08:25 +00:00
sMSToolStripMenuItem . Visible = false ;
gBToolStripMenuItem . Visible = false ;
break ;
case "SMS" :
case "SG" :
tI83ToolStripMenuItem . Visible = false ;
NESToolStripMenuItem . Visible = false ;
pCEToolStripMenuItem . Visible = false ;
sMSToolStripMenuItem . Visible = true ;
2011-06-27 00:15:47 +00:00
gBToolStripMenuItem . Visible = false ;
break ;
2011-07-15 03:25:32 +00:00
case "GB" :
2011-06-27 00:15:47 +00:00
NESToolStripMenuItem . Visible = false ;
tI83ToolStripMenuItem . Visible = false ;
2012-03-11 15:12:48 +00:00
pCEToolStripMenuItem . Visible = false ;
2012-03-11 17:08:25 +00:00
sMSToolStripMenuItem . Visible = false ;
2011-06-27 00:15:47 +00:00
gBToolStripMenuItem . Visible = true ;
2011-06-11 12:54:26 +00:00
break ;
default :
tI83ToolStripMenuItem . Visible = false ;
NESToolStripMenuItem . Visible = false ;
2012-03-11 15:12:48 +00:00
pCEToolStripMenuItem . Visible = false ;
2012-03-11 17:08:25 +00:00
sMSToolStripMenuItem . Visible = false ;
2011-06-27 00:15:47 +00:00
gBToolStripMenuItem . Visible = false ;
2011-06-11 12:54:26 +00:00
break ;
}
}
2011-03-02 17:12:48 +00:00
2011-04-06 05:43:59 +00:00
void SyncControls ( )
{
2011-06-11 12:54:26 +00:00
if ( Global . Game = = null ) return ;
switch ( Global . Game . System )
2011-04-06 05:43:59 +00:00
{
2011-06-11 12:54:26 +00:00
case "SG" :
2011-04-06 05:43:59 +00:00
case "SMS" :
2011-06-11 12:54:26 +00:00
Global . ActiveController = Global . SMSControls ;
2011-08-09 02:16:46 +00:00
Global . AutoFireController = Global . AutofireSMSControls ;
2011-04-06 05:43:59 +00:00
break ;
case "GG" :
2011-06-11 12:54:26 +00:00
Global . ActiveController = Global . SMSControls ;
2011-08-09 02:40:22 +00:00
Global . AutoFireController = Global . AutofireSMSControls ;
2011-04-06 05:43:59 +00:00
break ;
2012-03-07 00:40:20 +00:00
case "A26" :
Global . ActiveController = Global . Atari2600Controls ;
Global . AutoFireController = Global . AutofireAtari2600Controls ;
break ;
2011-04-06 05:43:59 +00:00
case "PCE" :
2011-09-24 17:05:34 +00:00
case "PCECD" :
2011-06-11 12:54:26 +00:00
Global . ActiveController = Global . PCEControls ;
2011-08-09 02:40:22 +00:00
Global . AutoFireController = Global . AutofirePCEControls ;
2011-04-06 05:43:59 +00:00
break ;
case "SGX" :
2011-06-11 12:54:26 +00:00
Global . ActiveController = Global . PCEControls ;
2011-08-09 02:40:22 +00:00
Global . AutoFireController = Global . AutofirePCEControls ;
2011-04-06 05:43:59 +00:00
break ;
case "GEN" :
2011-06-11 12:54:26 +00:00
Global . ActiveController = Global . GenControls ;
2011-08-09 02:40:22 +00:00
Global . AutoFireController = Global . AutofireGenControls ;
2011-04-06 05:43:59 +00:00
break ;
case "TI83" :
2011-06-11 12:54:26 +00:00
Global . ActiveController = Global . TI83Controls ;
2011-04-06 05:43:59 +00:00
break ;
case "NES" :
2011-06-11 12:54:26 +00:00
Global . ActiveController = Global . NESControls ;
2011-08-09 02:16:46 +00:00
Global . AutoFireController = Global . AutofireNESControls ;
2011-04-06 05:43:59 +00:00
break ;
case "GB" :
break ;
2011-06-11 12:54:26 +00:00
default :
Global . ActiveController = Global . NullControls ;
break ;
2011-04-06 05:43:59 +00:00
}
2011-06-27 05:31:46 +00:00
RewireInputChain ( ) ;
}
void RewireInputChain ( )
{
2011-07-10 07:39:40 +00:00
Global . ControllerInputCoalescer = new InputCoalescer ( ) ;
2011-09-24 16:19:38 +00:00
2011-07-10 07:39:40 +00:00
Global . ControllerInputCoalescer . Type = Global . ActiveController . Type ;
2011-08-09 00:51:46 +00:00
Global . OrControllerAdapter . Source = Global . ActiveController ;
Global . OrControllerAdapter . SourceOr = Global . AutoFireController ;
Global . UD_LR_ControllerAdapter . Source = Global . OrControllerAdapter ;
2011-08-08 23:35:13 +00:00
2011-08-09 00:51:46 +00:00
Global . StickyXORAdapter . Source = Global . UD_LR_ControllerAdapter ;
2011-09-24 16:19:38 +00:00
2011-08-08 23:35:13 +00:00
Global . MultitrackRewiringControllerAdapter . Source = Global . StickyXORAdapter ;
2011-06-27 05:31:46 +00:00
Global . MovieInputSourceAdapter . Source = Global . MultitrackRewiringControllerAdapter ;
2011-08-21 04:44:40 +00:00
Global . ControllerOutput . Source = Global . MovieOutputHardpoint ;
2011-08-09 00:51:46 +00:00
2011-06-27 05:31:46 +00:00
Global . Emulator . Controller = Global . ControllerOutput ;
2011-07-24 23:14:16 +00:00
Global . MovieSession . MovieControllerAdapter . Type = Global . MovieInputSourceAdapter . Type ;
2011-08-21 04:44:40 +00:00
//connect the movie session before MovieOutputHardpoint if it is doing anything
//otherwise connect the MovieInputSourceAdapter to it, effectively bypassing the movie session
2011-07-24 23:14:16 +00:00
if ( Global . MovieSession . Movie ! = null )
2011-08-21 04:44:40 +00:00
Global . MovieOutputHardpoint . Source = Global . MovieSession . MovieControllerAdapter ;
2011-07-24 23:14:16 +00:00
else
2011-08-21 04:44:40 +00:00
Global . MovieOutputHardpoint . Source = Global . MovieInputSourceAdapter ;
2011-04-06 05:43:59 +00:00
}
2011-05-11 01:47:28 +00:00
public bool LoadRom ( string path )
2011-02-20 08:40:22 +00:00
{
2011-07-30 23:20:49 +00:00
if ( path = = null ) return false ;
2011-06-27 05:31:46 +00:00
using ( var file = new HawkFile ( ) )
2011-01-20 06:24:31 +00:00
{
2011-10-14 03:40:34 +00:00
string [ ] romExtensions = new string [ ] { "SMS" , "PCE" , "SGX" , "GG" , "SG" , "BIN" , "GEN" , "SMD" , "GB" , "NES" , "ROM" } ;
2011-06-27 05:31:46 +00:00
//lets not use this unless we need to
//file.NonArchiveExtensions = romExtensions;
file . Open ( path ) ;
2011-03-07 02:04:42 +00:00
//if the provided file doesnt even exist, give up!
2011-03-07 02:44:30 +00:00
if ( ! file . Exists ) return false ;
2011-03-07 01:07:49 +00:00
2011-03-07 02:04:42 +00:00
//try binding normal rom extensions first
if ( ! file . IsBound )
2011-06-27 05:31:46 +00:00
file . BindSoleItemOf ( romExtensions ) ;
2011-03-07 02:04:42 +00:00
//if we have an archive and need to bind something, then pop the dialog
if ( file . IsArchive & & ! file . IsBound )
{
var ac = new ArchiveChooser ( file ) ;
if ( ac . ShowDialog ( this ) = = DialogResult . OK )
{
file . BindArchiveMember ( ac . SelectedMemberIndex ) ;
}
else return false ;
}
2011-03-07 10:41:46 +00:00
IEmulator nextEmulator = null ;
2011-08-04 03:20:54 +00:00
RomGame rom = null ;
2011-08-09 00:51:46 +00:00
GameInfo game = null ;
2011-03-07 01:07:49 +00:00
2011-08-04 03:20:54 +00:00
try
2011-03-07 01:07:49 +00:00
{
2012-02-24 20:45:27 +00:00
//if (file.Extension.ToLower() == ".exe")
//{
// PSX psx = new PSX();
// nextEmulator = psx;
// psx.LoadFile(file.CanonicalFullPath);
// game = new GameInfo();
// game.System = "PSX";
// game.Name = "xx";
// game.Hash = "xx";
//}
//else
if ( file . Extension . ToLower ( ) = = ".iso" )
2012-02-24 20:38:35 +00:00
{
//if (Global.PsxCoreLibrary.IsOpen)
//{
// // sorry zero ;'( I leave de-RomGameifying this to you
// //PsxCore psx = new PsxCore(Global.PsxCoreLibrary);
// //nextEmulator = psx;
// //game = new RomGame();
// //var disc = Disc.FromIsoPath(path);
// //Global.DiscHopper.Clear();
// //Global.DiscHopper.Enqueue(disc);
// //Global.DiscHopper.Insert();
// //psx.SetDiscHopper(Global.DiscHopper);
//}
2011-08-09 00:51:46 +00:00
}
else if ( file . Extension . ToLower ( ) = = ".cue" )
{
2012-01-23 00:38:28 +00:00
Disc disc = Disc . FromCuePath ( path , new CueBinPrefs ( ) ) ;
2011-08-09 00:51:46 +00:00
var hash = disc . GetHash ( ) ;
game = Database . CheckDatabase ( hash ) ;
if ( game = = null )
{
2012-02-24 07:48:06 +00:00
// Game was not found in DB. For now we're going to send it to the PCE-CD core.
2011-08-09 00:51:46 +00:00
// In the future we need to do something smarter, possibly including simply asking the user
// what system the game is for.
game = new GameInfo ( ) ;
2011-09-24 17:05:34 +00:00
game . System = "PCECD" ;
2011-08-14 18:20:13 +00:00
game . Name = Path . GetFileNameWithoutExtension ( file . Name ) ;
2011-09-11 00:11:46 +00:00
game . Hash = hash ;
2011-08-09 00:51:46 +00:00
}
switch ( game . System )
{
case "PCE" :
2011-09-24 17:05:34 +00:00
case "PCECD" :
2011-08-09 00:51:46 +00:00
{
2012-03-03 21:51:20 +00:00
string biosPath = PathManager . MakeAbsolutePath ( Global . Config . PathPCEBios , "PCE" ) ;
if ( File . Exists ( biosPath ) = = false )
{
MessageBox . Show ( "PCE-CD System Card not found. Please check the BIOS path in Config->Paths->PC Engine." ) ;
return false ;
}
rom = new RomGame ( new HawkFile ( biosPath ) ) ;
2011-08-30 04:02:52 +00:00
2012-03-03 21:51:20 +00:00
if ( rom . GameInfo . Status = = RomStatus . BadDump )
MessageBox . Show ( "The PCE-CD System Card you have selected is known to be a bad dump. This may cause problems playing PCE-CD games.\n\n" +
"It is recommended that you find a good dump of the system card. Sorry to be the bearer of bad news!" ) ;
2011-08-30 04:02:52 +00:00
2012-03-03 21:51:20 +00:00
else if ( rom . GameInfo . NotInDatabase )
MessageBox . Show ( "The PCE-CD System Card you have selected is not recognized in our database. That might mean it's a bad dump, or isn't the correct rom." ) ;
2011-08-30 04:02:52 +00:00
2012-03-03 21:51:20 +00:00
else if ( rom . GameInfo [ "BIOS" ] = = false )
MessageBox . Show ( "The PCE-CD System Card you have selected is not a BIOS image. You may have selected the wrong rom." ) ;
2011-08-30 04:02:52 +00:00
2012-03-03 21:51:20 +00:00
if ( rom . GameInfo [ "SuperSysCard" ] )
game . AddOption ( "SuperSysCard" ) ;
if ( ( game [ "NeedSuperSysCard" ] ) & & game [ "SuperSysCard" ] = = false )
MessageBox . Show ( "This game requires a version 3.0 System card and won't run with the system card you've selected. Try selecting a 3.0 System Card in Config->Paths->PC Engine." ) ;
2011-09-24 16:09:40 +00:00
2012-03-03 21:51:20 +00:00
if ( Global . Config . PceSpriteLimit ) game . AddOption ( "ForceSpriteLimit" ) ;
if ( Global . Config . PceEqualizeVolume ) game . AddOption ( "EqualizeVolumes" ) ;
if ( Global . Config . PceArcadeCardRewindHack ) game . AddOption ( "ArcadeRewindHack" ) ;
2011-09-19 00:39:28 +00:00
2012-03-03 21:51:20 +00:00
nextEmulator = new PCEngine ( game , disc , rom . RomData ) ;
break ;
}
2011-08-09 00:51:46 +00:00
}
}
else
{
rom = new RomGame ( file ) ;
game = rom . GameInfo ;
switch ( game . System )
{
case "SMS" :
case "SG" :
if ( Global . Config . SmsEnableFM ) game . AddOption ( "UseFM" ) ;
if ( Global . Config . SmsAllowOverlock ) game . AddOption ( "AllowOverclock" ) ;
if ( Global . Config . SmsForceStereoSeparation ) game . AddOption ( "ForceStereo" ) ;
2011-09-24 16:09:40 +00:00
if ( Global . Config . SmsSpriteLimit ) game . AddOption ( "SpriteLimit" ) ;
2011-08-09 00:51:46 +00:00
nextEmulator = new SMS ( game , rom . RomData ) ;
break ;
case "GG" :
if ( Global . Config . SmsAllowOverlock ) game . AddOption ( "AllowOverclock" ) ;
2011-09-24 16:09:40 +00:00
if ( Global . Config . SmsSpriteLimit ) game . AddOption ( "SpriteLimit" ) ;
2011-08-09 00:51:46 +00:00
nextEmulator = new SMS ( game , rom . RomData ) ;
break ;
2012-03-07 00:40:20 +00:00
case "A26" :
nextEmulator = new Atari2600 ( game , rom . FileData ) ;
break ;
2011-08-09 00:51:46 +00:00
case "PCE" :
2011-09-24 17:05:34 +00:00
case "PCECD" :
2011-08-09 00:51:46 +00:00
case "SGX" :
2011-09-24 16:09:40 +00:00
if ( Global . Config . PceSpriteLimit ) game . AddOption ( "ForceSpriteLimit" ) ;
2011-08-09 00:51:46 +00:00
nextEmulator = new PCEngine ( game , rom . RomData ) ;
break ;
case "GEN" :
2011-10-01 17:06:25 +00:00
nextEmulator = new Genesis ( game , rom . RomData ) ;
2011-08-09 00:51:46 +00:00
break ;
case "TI83" :
nextEmulator = new TI83 ( game , rom . RomData ) ;
if ( Global . Config . TI83autoloadKeyPad )
LoadTI83KeyPad ( ) ;
break ;
case "NES" :
{
NES nes = new NES ( game , rom . FileData ) ;
2012-03-15 19:16:43 +00:00
nes . SoundOn = Global . Config . SoundEnabled ;
2011-09-04 01:12:12 +00:00
nes . FirstDrawLine = Global . Config . NESTopLine ;
nes . LastDrawLine = Global . Config . NESBottomLine ;
2011-09-04 01:58:16 +00:00
nes . SetClipLeftAndRight ( Global . Config . NESClipLeftAndRight ) ;
2011-08-09 00:51:46 +00:00
nextEmulator = nes ;
if ( Global . Config . NESAutoLoadPalette & & Global . Config . NESPaletteFile . Length > 0 & &
HawkFile . ExistsAt ( Global . Config . NESPaletteFile ) )
{
nes . SetPalette (
NES . Palettes . Load_FCEUX_Palette ( HawkFile . ReadAllBytes ( Global . Config . NESPaletteFile ) ) ) ;
}
}
break ;
case "GB" :
2011-12-27 02:10:07 +00:00
Gameboy gb = new Gameboy ( game , rom . FileData ) ;
nextEmulator = gb ;
2011-08-09 00:51:46 +00:00
break ;
}
}
if ( nextEmulator = = null )
throw new Exception ( ) ;
2011-08-04 03:20:54 +00:00
nextEmulator . CoreInputComm = Global . CoreInputComm ;
2011-07-24 06:45:05 +00:00
}
2011-08-04 03:20:54 +00:00
catch ( Exception ex )
2011-07-24 06:45:05 +00:00
{
2011-08-04 03:20:54 +00:00
MessageBox . Show ( "Exception during loadgame:\n\n" + ex . ToString ( ) ) ;
return false ;
2011-03-07 10:41:46 +00:00
}
2011-08-09 00:51:46 +00:00
2011-07-24 06:45:05 +00:00
if ( nextEmulator = = null ) throw new Exception ( ) ;
2011-03-07 10:41:46 +00:00
CloseGame ( ) ;
2011-06-11 12:54:26 +00:00
Global . Emulator . Dispose ( ) ;
2011-03-07 10:41:46 +00:00
Global . Emulator = nextEmulator ;
Global . Game = game ;
2011-04-06 05:43:59 +00:00
SyncControls ( ) ;
2011-03-07 10:41:46 +00:00
2011-06-18 21:39:53 +00:00
if ( game . System = = "NES" )
{
2011-09-24 20:38:48 +00:00
NES nes = Global . Emulator as NES ;
Global . Game . Name = nes . GameName ;
Global . Game . Status = nes . RomStatus ;
2011-06-18 21:39:53 +00:00
}
2011-03-07 10:41:46 +00:00
2011-04-21 23:22:33 +00:00
Text = DisplayNameForSystem ( game . System ) + " - " + game . Name ;
2011-03-07 01:07:49 +00:00
ResetRewindBuffer ( ) ;
2012-04-02 19:50:26 +00:00
if ( Global . Config . RecentRoms . GetRecentFileByPosition ( 0 ) ! = file . CanonicalFullPath )
{
#if WINDOWS
LuaConsole1 . Restart ( ) ;
#endif
}
2011-05-21 19:31:00 +00:00
Global . Config . RecentRoms . Add ( file . CanonicalFullPath ) ;
2011-08-04 03:20:54 +00:00
if ( File . Exists ( PathManager . SaveRamPath ( game ) ) )
2011-03-07 01:07:49 +00:00
LoadSaveRam ( ) ;
2012-01-10 02:11:17 +00:00
if ( Global . Config . AutoSavestates )
LoadState ( "Auto" ) ;
2011-03-07 01:07:49 +00:00
2011-09-16 00:40:33 +00:00
////setup the throttle based on platform's specifications
////(one day later for some systems we will need to modify it at runtime as the display mode changes)
//{
// throttle.SetCoreFps(Global.Emulator.CoreOutputComm.VsyncRate);
// SyncThrottle();
//}
2011-03-07 01:07:49 +00:00
RamSearch1 . Restart ( ) ;
2011-06-11 12:54:26 +00:00
RamWatch1 . Restart ( ) ;
2011-03-07 01:07:49 +00:00
HexEditor1 . Restart ( ) ;
2011-06-11 12:54:26 +00:00
NESPPU1 . Restart ( ) ;
NESNameTableViewer1 . Restart ( ) ;
NESDebug1 . Restart ( ) ;
2012-03-12 05:19:59 +00:00
PCEBGViewer1 . Restart ( ) ;
2011-06-11 12:54:26 +00:00
TI83KeyPad1 . Restart ( ) ;
2011-07-30 17:59:18 +00:00
TAStudio1 . Restart ( ) ;
2011-08-07 01:16:55 +00:00
Cheats1 . Restart ( ) ;
2012-01-10 02:11:17 +00:00
ToolBox1 . Restart ( ) ;
2011-06-11 12:54:26 +00:00
if ( Global . Config . LoadCheatFileByGame )
{
2011-08-06 22:03:10 +00:00
if ( Global . CheatList . AttemptLoadCheatFile ( ) )
2011-06-11 12:54:26 +00:00
Global . RenderPanel . AddMessage ( "Cheats file loaded" ) ;
}
2011-08-07 01:16:55 +00:00
2011-06-12 22:55:34 +00:00
CurrentlyOpenRom = file . CanonicalFullPath ;
2011-06-11 12:54:26 +00:00
HandlePlatformMenus ( ) ;
2011-07-31 23:25:00 +00:00
StateSlots . Clear ( ) ;
2011-08-26 23:54:15 +00:00
UpdateStatusSlots ( ) ;
2011-07-10 15:36:41 +00:00
UpdateDumpIcon ( ) ;
2011-03-07 01:07:49 +00:00
return true ;
2011-02-21 09:48:53 +00:00
}
2011-02-20 08:40:22 +00:00
}
2011-07-10 15:36:41 +00:00
private void UpdateDumpIcon ( )
{
2011-07-10 21:00:28 +00:00
DumpStatus . Image = BizHawk . MultiClient . Properties . Resources . Blank ;
DumpStatus . ToolTipText = "" ;
if ( Global . Emulator = = null ) return ;
2011-07-22 01:34:21 +00:00
if ( Global . Game = = null ) return ;
2011-07-10 21:00:28 +00:00
2011-08-04 03:20:54 +00:00
var status = Global . Game . Status ;
2011-07-10 21:00:28 +00:00
string annotation = "" ;
if ( status = = RomStatus . BadDump )
2011-07-10 15:36:41 +00:00
{
2011-07-10 21:00:28 +00:00
DumpStatus . Image = BizHawk . MultiClient . Properties . Resources . ExclamationRed ;
annotation = "Warning: Bad ROM Dump" ;
}
else if ( status = = RomStatus . Overdump )
{
DumpStatus . Image = BizHawk . MultiClient . Properties . Resources . ExclamationRed ;
annotation = "Warning: Overdump" ;
}
else if ( status = = RomStatus . NotInDatabase )
{
DumpStatus . Image = BizHawk . MultiClient . Properties . Resources . RetroQuestion ;
annotation = "Warning: Unknown ROM" ;
}
else if ( status = = RomStatus . TranslatedRom )
{
DumpStatus . Image = BizHawk . MultiClient . Properties . Resources . Translation ;
annotation = "Translated ROM" ;
}
else if ( status = = RomStatus . Homebrew )
{
DumpStatus . Image = BizHawk . MultiClient . Properties . Resources . HomeBrew ;
annotation = "Homebrew ROM" ;
}
else if ( Global . Game . Status = = RomStatus . Hack )
{
DumpStatus . Image = BizHawk . MultiClient . Properties . Resources . Hack ;
annotation = "Hacked ROM" ;
2011-07-10 15:36:41 +00:00
}
else
{
2011-07-10 21:00:28 +00:00
DumpStatus . Image = BizHawk . MultiClient . Properties . Resources . GreenCheck ;
annotation = "Verified good dump" ;
2011-07-10 15:36:41 +00:00
}
2011-07-10 21:00:28 +00:00
if ( ! string . IsNullOrEmpty ( Global . Emulator . CoreOutputComm . RomStatusAnnotation ) )
annotation = Global . Emulator . CoreOutputComm . RomStatusAnnotation ;
DumpStatus . ToolTipText = annotation ;
2011-07-10 15:36:41 +00:00
}
2011-02-20 08:40:22 +00:00
private void LoadSaveRam ( )
{
2011-08-09 00:51:46 +00:00
try
{
using ( var reader = new BinaryReader ( new FileStream ( PathManager . SaveRamPath ( Global . Game ) , FileMode . Open , FileAccess . Read ) ) )
reader . Read ( Global . Emulator . SaveRam , 0 , Global . Emulator . SaveRam . Length ) ;
}
catch { }
2011-02-20 08:40:22 +00:00
}
private void CloseGame ( )
{
2012-01-28 21:43:55 +00:00
if ( Global . Config . AutoSavestates & & Global . Emulator is NullEmulator = = false )
SaveState ( "Auto" ) ;
if ( Global . Emulator . SaveRamModified )
2011-08-09 00:51:46 +00:00
SaveRam ( ) ;
2011-06-11 12:54:26 +00:00
Global . Emulator . Dispose ( ) ;
2011-03-02 06:18:26 +00:00
Global . Emulator = new NullEmulator ( ) ;
2011-06-11 12:54:26 +00:00
Global . ActiveController = Global . NullControls ;
2011-08-09 22:13:57 +00:00
Global . AutoFireController = Global . AutofireNullControls ;
2011-09-03 18:07:30 +00:00
Global . MovieSession . Movie . StopMovie ( ) ;
2011-02-20 08:40:22 +00:00
}
2011-08-09 00:51:46 +00:00
private static void SaveRam ( )
{
string path = PathManager . SaveRamPath ( Global . Game ) ;
2011-08-04 03:20:54 +00:00
2011-08-09 00:51:46 +00:00
var f = new FileInfo ( path ) ;
if ( f . Directory . Exists = = false )
f . Directory . Create ( ) ;
2011-08-04 03:20:54 +00:00
2011-08-09 00:51:46 +00:00
var writer = new BinaryWriter ( new FileStream ( path , FileMode . Create , FileAccess . Write ) ) ;
int len = Util . SaveRamBytesUsed ( Global . Emulator . SaveRam ) ;
writer . Write ( Global . Emulator . SaveRam , 0 , len ) ;
writer . Close ( ) ;
}
2011-08-04 03:20:54 +00:00
2011-07-09 22:09:39 +00:00
void OnSelectSlot ( int num )
{
2011-09-17 00:04:50 +00:00
Global . Config . SaveSlot = num ;
2011-07-09 22:09:39 +00:00
SaveSlotSelectedMessage ( ) ;
2011-08-09 00:51:46 +00:00
UpdateStatusSlots ( ) ;
2011-07-09 22:09:39 +00:00
}
2011-07-24 23:14:16 +00:00
/// <summary>
/// Controls whether the app generates input events. should be turned off for most modal dialogs
/// </summary>
public bool AllowInput
{
get
{
//the main form gets input
2011-08-27 02:45:02 +00:00
if ( Form . ActiveForm = = this ) return true ;
2011-08-09 00:51:46 +00:00
2011-07-24 23:14:16 +00:00
//modals that need to capture input for binding purposes get input, of course
if ( Form . ActiveForm is InputConfig ) return true ;
if ( Form . ActiveForm is tools . HotkeyWindow ) return true ;
2011-08-09 00:51:46 +00:00
2011-07-24 23:14:16 +00:00
//if no form is active on this process, then the background input setting applies
if ( Form . ActiveForm = = null & & Global . Config . AcceptBackgroundInput ) return true ;
return false ;
}
}
2011-07-10 07:39:40 +00:00
public void ProcessInput ( )
2011-06-11 12:54:26 +00:00
{
2011-08-09 00:51:46 +00:00
for ( ; ; )
2011-06-11 12:54:26 +00:00
{
2011-07-10 07:39:40 +00:00
//loop through all available events
2011-07-09 22:09:39 +00:00
var ie = Input . Instance . DequeueEvent ( ) ;
2012-03-24 15:55:22 +00:00
if ( ie = = null ) { break ; }
2011-06-11 12:54:26 +00:00
2011-07-10 19:50:59 +00:00
//useful debugging:
//Console.WriteLine(ie);
2011-07-09 22:09:39 +00:00
//TODO - wonder what happens if we pop up something interactive as a response to one of these hotkeys? may need to purge further processing
2011-06-11 12:54:26 +00:00
2012-03-24 15:55:22 +00:00
//look for client cntrol bindings for this key
2011-07-09 22:09:39 +00:00
var triggers = Global . ClientControls . SearchBindings ( ie . LogicalButton . ToString ( ) ) ;
2011-07-10 02:14:58 +00:00
if ( triggers . Count = = 0 )
{
2011-07-10 19:50:59 +00:00
bool sys_hotkey = false ;
//maybe it is a system alt-key which hasnt been overridden
if ( ie . EventType = = Input . InputEventType . Press )
{
if ( ie . LogicalButton . Alt & & ie . LogicalButton . Button . Length = = 1 )
{
char c = ie . LogicalButton . Button . ToLower ( ) [ 0 ] ;
2011-08-09 00:51:46 +00:00
if ( c > = 'a' & & c < = 'z' | | c = = ' ' )
2011-07-10 19:50:59 +00:00
{
SendAltKeyChar ( c ) ;
sys_hotkey = true ;
}
}
if ( ie . LogicalButton . Alt & & ie . LogicalButton . Button = = "Space" )
{
SendPlainAltKey ( 32 ) ;
sys_hotkey = true ;
}
}
//ordinarily, an alt release with nothing else would move focus to the menubar. but that is sort of useless, and hard to implement exactly right.
2011-08-09 00:51:46 +00:00
2011-07-10 19:50:59 +00:00
//no hotkeys or system keys bound this, so mutate it to an unmodified key and assign it for use as a game controller input
2011-07-10 07:39:40 +00:00
//(we have a rule that says: modified events may be used for game controller inputs but not hotkeys)
2011-07-10 19:50:59 +00:00
if ( ! sys_hotkey )
{
var mutated_ie = new Input . InputEvent ( ) ;
mutated_ie . EventType = ie . EventType ;
mutated_ie . LogicalButton = ie . LogicalButton ;
mutated_ie . LogicalButton . Modifiers = Input . ModifierKey . None ;
Global . ControllerInputCoalescer . Receive ( mutated_ie ) ;
}
2011-07-10 02:14:58 +00:00
}
2011-07-10 07:39:40 +00:00
bool handled = false ;
if ( ie . EventType = = Input . InputEventType . Press )
2011-07-09 22:09:39 +00:00
{
2011-07-10 07:39:40 +00:00
foreach ( var trigger in triggers )
2011-07-10 06:24:04 +00:00
{
2011-07-10 07:39:40 +00:00
handled | = CheckHotkey ( trigger ) ;
2011-07-10 06:24:04 +00:00
}
2011-07-10 07:39:40 +00:00
}
2011-07-10 02:14:58 +00:00
2011-07-10 07:39:40 +00:00
//hotkeys which arent handled as actions get coalesced as pollable buttons
if ( ! handled )
{
Global . HotkeyCoalescer . Receive ( ie ) ;
}
2011-08-09 00:51:46 +00:00
2011-07-10 07:39:40 +00:00
} //foreach event
2011-07-10 02:14:58 +00:00
2011-07-10 07:39:40 +00:00
}
bool CheckHotkey ( string trigger )
{
//todo - could have these in a table somehow ?
switch ( trigger )
{
default :
return false ;
2012-03-28 02:32:05 +00:00
case "IncreaseWindowSize" :
IncreaseWindowSize ( ) ;
break ;
case "DecreaseWindowSize" :
DecreaseWIndowSize ( ) ;
break ;
2011-07-12 00:05:14 +00:00
case "Record AVI" :
RecordAVI ( ) ;
break ;
case "Stop AVI" :
StopAVI ( ) ;
break ;
2011-07-10 07:39:40 +00:00
case "ToolBox" :
LoadToolBox ( ) ;
break ;
2011-08-09 00:51:46 +00:00
2011-07-10 07:39:40 +00:00
case "Quick Save State" :
if ( ! IsNullEmulator ( ) )
2012-03-30 12:26:36 +00:00
SaveState ( "QuickSave" + Global . Config . SaveSlot . ToString ( ) ) ;
2011-07-10 07:39:40 +00:00
break ;
2011-07-09 22:09:39 +00:00
2011-07-10 07:39:40 +00:00
case "Quick Load State" :
if ( ! IsNullEmulator ( ) )
2011-09-17 00:04:50 +00:00
LoadState ( "QuickSave" + Global . Config . SaveSlot . ToString ( ) ) ;
2011-07-10 07:39:40 +00:00
break ;
2011-07-09 22:09:39 +00:00
2011-07-10 07:39:40 +00:00
case "Unthrottle" :
unthrottled ^ = true ;
Global . RenderPanel . AddMessage ( "Unthrottled: " + unthrottled ) ;
break ;
2011-07-09 22:09:39 +00:00
2012-01-28 21:43:55 +00:00
case "Hard Reset" :
{
bool autoSaveState = Global . Config . AutoSavestates ;
Global . Config . AutoSavestates = false ;
LoadRom ( CurrentlyOpenRom ) ;
Global . Config . AutoSavestates = autoSaveState ;
break ;
}
2011-07-09 22:09:39 +00:00
2011-07-10 07:39:40 +00:00
case "Screenshot" :
TakeScreenshot ( ) ;
break ;
2011-07-09 22:09:39 +00:00
2011-07-10 07:39:40 +00:00
case "SaveSlot0" : if ( ! IsNullEmulator ( ) ) SaveState ( "QuickSave0" ) ; break ;
case "SaveSlot1" : if ( ! IsNullEmulator ( ) ) SaveState ( "QuickSave1" ) ; break ;
case "SaveSlot2" : if ( ! IsNullEmulator ( ) ) SaveState ( "QuickSave2" ) ; break ;
case "SaveSlot3" : if ( ! IsNullEmulator ( ) ) SaveState ( "QuickSave3" ) ; break ;
case "SaveSlot4" : if ( ! IsNullEmulator ( ) ) SaveState ( "QuickSave4" ) ; break ;
case "SaveSlot5" : if ( ! IsNullEmulator ( ) ) SaveState ( "QuickSave5" ) ; break ;
case "SaveSlot6" : if ( ! IsNullEmulator ( ) ) SaveState ( "QuickSave6" ) ; break ;
case "SaveSlot7" : if ( ! IsNullEmulator ( ) ) SaveState ( "QuickSave7" ) ; break ;
case "SaveSlot8" : if ( ! IsNullEmulator ( ) ) SaveState ( "QuickSave8" ) ; break ;
case "SaveSlot9" : if ( ! IsNullEmulator ( ) ) SaveState ( "QuickSave9" ) ; break ;
case "LoadSlot0" : if ( ! IsNullEmulator ( ) ) LoadState ( "QuickSave0" ) ; break ;
case "LoadSlot1" : if ( ! IsNullEmulator ( ) ) LoadState ( "QuickSave1" ) ; break ;
case "LoadSlot2" : if ( ! IsNullEmulator ( ) ) LoadState ( "QuickSave2" ) ; break ;
case "LoadSlot3" : if ( ! IsNullEmulator ( ) ) LoadState ( "QuickSave3" ) ; break ;
case "LoadSlot4" : if ( ! IsNullEmulator ( ) ) LoadState ( "QuickSave4" ) ; break ;
case "LoadSlot5" : if ( ! IsNullEmulator ( ) ) LoadState ( "QuickSave5" ) ; break ;
case "LoadSlot6" : if ( ! IsNullEmulator ( ) ) LoadState ( "QuickSave6" ) ; break ;
case "LoadSlot7" : if ( ! IsNullEmulator ( ) ) LoadState ( "QuickSave7" ) ; break ;
case "LoadSlot8" : if ( ! IsNullEmulator ( ) ) LoadState ( "QuickSave8" ) ; break ;
case "LoadSlot9" : if ( ! IsNullEmulator ( ) ) LoadState ( "QuickSave9" ) ; break ;
2012-03-24 15:55:22 +00:00
case "SelectSlot0" : OnSelectSlot ( 0 ) ; break ;
case "SelectSlot1" : OnSelectSlot ( 1 ) ; break ;
case "SelectSlot2" : OnSelectSlot ( 2 ) ; break ;
case "SelectSlot3" : OnSelectSlot ( 3 ) ; break ;
case "SelectSlot4" : OnSelectSlot ( 4 ) ; break ;
2011-07-10 07:39:40 +00:00
case "SelectSlot5" : OnSelectSlot ( 5 ) ; break ;
case "SelectSlot6" : OnSelectSlot ( 6 ) ; break ;
case "SelectSlot7" : OnSelectSlot ( 7 ) ; break ;
case "SelectSlot8" : OnSelectSlot ( 8 ) ; break ;
case "SelectSlot9" : OnSelectSlot ( 9 ) ; break ;
case "Toggle Fullscreen" : ToggleFullscreen ( ) ; break ;
case "Save Named State" : SaveStateAs ( ) ; break ;
case "Load Named State" : LoadStateAs ( ) ; break ;
case "Previous Slot" : PreviousSlot ( ) ; break ;
case "Next Slot" : NextSlot ( ) ; break ;
case "Ram Watch" : LoadRamWatch ( ) ; break ;
case "Ram Search" : LoadRamSearch ( ) ; break ;
case "Ram Poke" :
{
RamPoke r = new RamPoke ( ) ;
r . Show ( ) ;
break ;
}
case "Hex Editor" : LoadHexEditor ( ) ; break ;
case "Lua Console" :
{
2012-01-10 01:30:17 +00:00
OpenLuaConsole ( ) ;
2011-07-10 07:39:40 +00:00
break ;
}
case "Cheats" : LoadCheatsWindow ( ) ; break ;
case "Open ROM" :
{
OpenROM ( ) ;
break ;
}
case "Close ROM" : CloseROM ( ) ; break ;
2011-08-09 00:51:46 +00:00
2011-07-10 07:39:40 +00:00
case "Display FPS" : ToggleFPS ( ) ; break ;
2011-06-11 12:54:26 +00:00
2011-07-10 07:39:40 +00:00
case "Display FrameCounter" : ToggleFrameCounter ( ) ; break ;
case "Display LagCounter" : ToggleLagCounter ( ) ; break ;
case "Display Input" : ToggleInputDisplay ( ) ; break ;
case "Toggle Read Only" : ToggleReadOnly ( ) ; break ;
2011-08-09 00:51:46 +00:00
case "Play Movie" :
2011-07-10 07:39:40 +00:00
{
PlayMovie ( ) ;
break ;
}
case "Record Movie" :
{
RecordMovie ( ) ;
break ;
}
2011-07-22 01:34:21 +00:00
case "Stop Movie" : StopMovie ( ) ; break ;
2011-07-10 07:39:40 +00:00
case "Play Beginning" : PlayMovieFromBeginning ( ) ; break ;
case "Volume Up" : VolumeUp ( ) ; break ;
case "Volume Down" : VolumeDown ( ) ; break ;
case "Soft Reset" : SoftReset ( ) ; break ;
case "Toggle MultiTrack" :
{
2011-09-03 18:07:30 +00:00
if ( Global . MovieSession . Movie . Mode > MOVIEMODE . INACTIVE )
2011-07-10 07:39:40 +00:00
{
2011-08-17 02:06:50 +00:00
Global . MovieSession . MultiTrack . IsActive = ! Global . MovieSession . MultiTrack . IsActive ;
if ( Global . MovieSession . MultiTrack . IsActive )
{
Global . RenderPanel . AddMessage ( "MultiTrack Enabled" ) ;
Global . RenderPanel . MT = "Recording None" ;
}
else
Global . RenderPanel . AddMessage ( "MultiTrack Disabled" ) ;
Global . MovieSession . MultiTrack . RecordAll = false ;
Global . MovieSession . MultiTrack . CurrentPlayer = 0 ;
2011-07-10 07:39:40 +00:00
}
else
2011-08-17 02:06:50 +00:00
{
Global . RenderPanel . AddMessage ( "MultiTrack cannot be enabled while not recording." ) ;
}
2011-07-10 07:39:40 +00:00
break ;
}
case "Increment Player" :
{
2011-07-24 23:14:16 +00:00
Global . MovieSession . MultiTrack . CurrentPlayer + + ;
Global . MovieSession . MultiTrack . RecordAll = false ;
if ( Global . MovieSession . MultiTrack . CurrentPlayer > 5 ) //TODO: Replace with console's maximum or current maximum players??!
2011-07-10 07:39:40 +00:00
{
2011-07-24 23:14:16 +00:00
Global . MovieSession . MultiTrack . CurrentPlayer = 1 ;
2011-07-10 07:39:40 +00:00
}
2011-08-09 00:51:46 +00:00
Global . RenderPanel . MT = "Recording Player " + Global . MovieSession . MultiTrack . CurrentPlayer . ToString ( ) ;
2011-07-10 07:39:40 +00:00
break ;
}
case "Decrement Player" :
{
2011-07-24 23:14:16 +00:00
Global . MovieSession . MultiTrack . CurrentPlayer - - ;
Global . MovieSession . MultiTrack . RecordAll = false ;
2011-08-09 00:51:46 +00:00
if ( Global . MovieSession . MultiTrack . CurrentPlayer < 1 )
2011-07-10 07:39:40 +00:00
{
2012-02-24 07:48:06 +00:00
Global . MovieSession . MultiTrack . CurrentPlayer = 5 ; //TODO: Replace with console's maximum or current maximum players??!
2011-07-10 07:39:40 +00:00
}
2011-08-09 00:51:46 +00:00
Global . RenderPanel . MT = "Recording Player " + Global . MovieSession . MultiTrack . CurrentPlayer . ToString ( ) ;
2011-07-10 07:39:40 +00:00
break ;
}
case "Record All" :
{
2011-07-24 23:14:16 +00:00
Global . MovieSession . MultiTrack . CurrentPlayer = 0 ;
Global . MovieSession . MultiTrack . RecordAll = true ;
2011-07-10 07:39:40 +00:00
Global . RenderPanel . MT = "Recording All" ;
break ;
}
case "Record None" :
{
2011-07-24 23:14:16 +00:00
Global . MovieSession . MultiTrack . CurrentPlayer = 0 ;
Global . MovieSession . MultiTrack . RecordAll = false ;
2011-08-09 00:51:46 +00:00
Global . RenderPanel . MT = "Recording None" ;
2011-07-10 07:39:40 +00:00
break ;
}
case "Emulator Pause" :
//used to be here: (the pause hotkey is ignored when we are frame advancing)
TogglePause ( ) ;
break ;
2011-10-01 03:43:37 +00:00
case "Toggle Menu" :
ShowHideMenu ( ) ;
break ;
2011-07-10 07:39:40 +00:00
} //switch(trigger)
return true ;
2011-06-11 12:54:26 +00:00
}
2011-02-21 09:48:53 +00:00
void StepRunLoop_Throttle ( )
{
2011-06-11 12:54:26 +00:00
SyncThrottle ( ) ;
2011-02-21 09:48:53 +00:00
throttle . signal_frameAdvance = runloop_frameadvance ;
throttle . signal_continuousframeAdvancing = runloop_frameProgress ;
throttle . Step ( true , - 1 ) ;
}
2011-02-20 08:40:22 +00:00
void StepRunLoop_Core ( )
{
2011-06-11 12:54:26 +00:00
bool runFrame = false ;
2011-02-21 09:48:53 +00:00
runloop_frameadvance = false ;
DateTime now = DateTime . Now ;
2011-02-23 06:40:04 +00:00
bool suppressCaptureRewind = false ;
2011-02-20 08:40:22 +00:00
2011-02-21 09:48:53 +00:00
double frameAdvanceTimestampDelta = ( now - FrameAdvanceTimestamp ) . TotalMilliseconds ;
bool frameProgressTimeElapsed = Global . Config . FrameProgressDelayMs < frameAdvanceTimestampDelta ;
2011-02-20 08:40:22 +00:00
2012-03-16 15:27:45 +00:00
if ( Global . Emulator . IsLagFrame & & frameProgressTimeElapsed & & Global . Config . SkipLagFrame )
{
Global . Emulator . FrameAdvance ( true ) ;
}
2012-03-07 03:58:54 +00:00
2011-07-24 17:35:53 +00:00
if ( Global . ClientControls [ "Frame Advance" ] | | PressFrameAdvance )
2011-02-20 08:40:22 +00:00
{
2011-02-21 09:48:53 +00:00
//handle the initial trigger of a frame advance
if ( FrameAdvanceTimestamp = = DateTime . MinValue )
2011-02-20 08:40:22 +00:00
{
2011-08-19 01:36:41 +00:00
PauseEmulator ( ) ;
2011-02-20 08:40:22 +00:00
runFrame = true ;
2011-02-21 09:48:53 +00:00
runloop_frameadvance = true ;
FrameAdvanceTimestamp = now ;
2011-02-20 08:40:22 +00:00
}
else
{
2011-02-21 09:48:53 +00:00
//handle the timed transition from countdown to FrameProgress
if ( frameProgressTimeElapsed )
{
runFrame = true ;
runloop_frameProgress = true ;
UnpauseEmulator ( ) ;
}
2011-02-20 08:40:22 +00:00
}
}
2011-02-21 09:48:53 +00:00
else
2011-02-20 08:40:22 +00:00
{
2011-02-21 09:48:53 +00:00
//handle release of frame advance: do we need to deactivate FrameProgress?
if ( runloop_frameProgress )
{
runloop_frameProgress = false ;
PauseEmulator ( ) ;
}
FrameAdvanceTimestamp = DateTime . MinValue ;
2011-02-20 08:40:22 +00:00
}
2012-03-16 15:27:45 +00:00
if ( ! EmulatorPaused )
{
runFrame = true ;
}
2011-02-20 08:40:22 +00:00
2011-07-26 06:34:45 +00:00
if ( Global . Config . RewindEnabled & & Global . ClientControls [ "Rewind" ] | | PressRewind )
2011-02-20 08:40:22 +00:00
{
2011-07-26 01:08:38 +00:00
Rewind ( 1 ) ;
suppressCaptureRewind = true ;
runFrame = true ;
2011-07-26 06:34:45 +00:00
PressRewind = false ;
2011-07-26 01:08:38 +00:00
}
2011-02-20 08:40:22 +00:00
2011-02-21 19:06:54 +00:00
bool genSound = false ;
2011-02-20 08:40:22 +00:00
if ( runFrame )
{
2012-01-28 21:43:55 +00:00
//client input-related duties
2012-03-26 03:01:39 +00:00
Global . RenderPanel . ClearGUIText ( ) ;
2012-03-12 04:44:34 +00:00
#if WINDOWS
2012-03-23 23:03:39 +00:00
LuaConsole1 . ResumeScripts ( true ) ;
2012-03-12 04:44:34 +00:00
#endif
2012-01-28 21:43:55 +00:00
2012-03-30 12:26:36 +00:00
runloop_fps + + ;
2011-07-10 07:39:40 +00:00
bool ff = Global . ClientControls [ "Fast Forward" ] ;
2011-06-10 07:12:57 +00:00
bool updateFpsString = ( runloop_last_ff ! = ff ) ;
runloop_last_ff = ff ;
2011-06-11 12:54:26 +00:00
2011-03-16 06:30:25 +00:00
if ( ( DateTime . Now - runloop_second ) . TotalSeconds > 1 )
{
2011-06-10 07:12:57 +00:00
runloop_last_fps = runloop_fps ;
2011-03-16 06:30:25 +00:00
runloop_second = DateTime . Now ;
runloop_fps = 0 ;
2011-06-10 07:12:57 +00:00
updateFpsString = true ;
}
if ( updateFpsString )
{
string fps_string = runloop_last_fps + " fps" ;
if ( ff ) fps_string + = " >>" ;
Global . RenderPanel . FPS = fps_string ;
2011-03-16 06:30:25 +00:00
}
2011-06-11 12:54:26 +00:00
if ( ! suppressCaptureRewind & & Global . Config . RewindEnabled ) CaptureRewindState ( ) ;
2011-02-21 19:06:54 +00:00
if ( ! runloop_frameadvance ) genSound = true ;
else if ( ! Global . Config . MuteFrameAdvance )
genSound = true ;
2011-06-11 12:54:26 +00:00
2011-07-24 23:14:16 +00:00
MovieSession session = Global . MovieSession ;
2011-09-03 18:07:30 +00:00
if ( Global . MovieSession . Movie . Mode = = MOVIEMODE . RECORD | | Global . MovieSession . Movie . Mode = = MOVIEMODE . PLAY )
2011-06-27 05:31:46 +00:00
{
2011-07-24 23:14:16 +00:00
session . LatchInputFromLog ( ) ;
2011-06-27 05:31:46 +00:00
}
2011-09-03 18:07:30 +00:00
if ( Global . MovieSession . Movie . Mode = = MOVIEMODE . RECORD )
2011-06-27 05:31:46 +00:00
{
2011-07-24 23:14:16 +00:00
if ( session . MultiTrack . IsActive )
2011-07-04 22:24:48 +00:00
{
2011-07-24 23:14:16 +00:00
session . LatchMultitrackPlayerInput ( Global . MovieInputSourceAdapter , Global . MultitrackRewiringControllerAdapter ) ;
2011-07-04 22:24:48 +00:00
}
else
{
2011-07-24 23:14:16 +00:00
session . LatchInputFromPlayer ( Global . MovieInputSourceAdapter ) ;
2011-07-04 22:24:48 +00:00
}
2011-08-21 04:44:40 +00:00
//the movie session makes sure that the correct input has been read and merged to its MovieControllerAdapter;
//this has been wired to Global.MovieOutputHardpoint in RewireInputChain
session . Movie . CommitFrame ( Global . Emulator . Frame , Global . MovieOutputHardpoint ) ;
2011-06-27 05:31:46 +00:00
}
2011-09-03 18:07:30 +00:00
if ( Global . MovieSession . Movie . Mode = = MOVIEMODE . INACTIVE | | Global . MovieSession . Movie . Mode = = MOVIEMODE . FINISHED )
2011-06-27 05:31:46 +00:00
{
2011-07-24 23:14:16 +00:00
session . LatchInputFromPlayer ( Global . MovieInputSourceAdapter ) ;
2011-06-27 05:31:46 +00:00
}
2011-08-09 00:51:46 +00:00
2011-09-03 18:07:30 +00:00
if ( Global . MovieSession . Movie . Mode = = MOVIEMODE . PLAY )
2011-06-11 12:54:26 +00:00
{
2011-09-03 18:07:30 +00:00
if ( Global . MovieSession . Movie . Length ( ) = = Global . Emulator . Frame )
2011-06-11 12:54:26 +00:00
{
2011-09-03 18:07:30 +00:00
Global . MovieSession . Movie . SetMovieFinished ( ) ;
2011-06-12 14:42:50 +00:00
}
2011-06-11 12:54:26 +00:00
}
2011-09-03 18:07:30 +00:00
if ( Global . MovieSession . Movie . Mode = = MOVIEMODE . FINISHED )
2011-07-26 00:11:23 +00:00
{
2011-09-03 18:07:30 +00:00
if ( Global . MovieSession . Movie . Length ( ) > Global . Emulator . Frame )
2011-07-26 00:11:23 +00:00
{
2011-09-03 18:07:30 +00:00
Global . MovieSession . Movie . StartPlayback ( ) ;
//Global.MovieSession.MovieControllerAdapter.SetControllersAsMnemonic(Global.MovieSession.Movie.GetInputFrame(Global.Emulator.Frame));
2011-07-26 00:11:23 +00:00
//Global.MovieMode = true;
//adelikat: is Global.MovieMode doing anything anymore? if not we shoudl remove this variable
session . LatchInputFromLog ( ) ;
}
}
2011-08-09 00:51:46 +00:00
2011-07-26 00:11:23 +00:00
//TODO: adelikat: don't know what this should do so leaving it commented out
2011-09-03 18:07:30 +00:00
//if (Global.MovieSession.Movie.Mode == MOVIEMODE.RECORD && Global.MovieSession.MultiTrack.IsActive)
2012-02-24 07:48:06 +00:00
//{
2011-09-03 18:07:30 +00:00
// Global.MovieSession.MovieControllerAdapter.SetControllersAsMnemonic(Global.MovieSession.Movie.GetInputFrame(Global.Emulator.Frame-1));
2011-07-24 23:14:16 +00:00
//}
2011-06-27 05:31:46 +00:00
//=======================================
2011-08-09 00:51:46 +00:00
MemoryPulse . Pulse ( ) ;
2011-02-21 09:48:53 +00:00
Global . Emulator . FrameAdvance ( ! throttle . skipnextframe ) ;
2011-08-09 00:51:46 +00:00
MemoryPulse . Pulse ( ) ;
2011-06-27 05:31:46 +00:00
//=======================================
2011-07-11 07:35:14 +00:00
if ( CurrAviWriter ! = null )
{
//TODO - this will stray over time! have AviWriter keep an accumulation!
int samples = ( int ) ( 44100 / Global . Emulator . CoreOutputComm . VsyncRate ) ;
2011-08-09 00:51:46 +00:00
short [ ] temp = new short [ samples * 2 ] ;
2011-07-11 07:35:14 +00:00
Global . Emulator . SoundProvider . GetSamples ( temp ) ;
genSound = false ;
CurrAviWriter . AddFrame ( Global . Emulator . VideoProvider ) ;
CurrAviWriter . AddSamples ( temp ) ;
}
2011-07-09 00:26:23 +00:00
UpdateTools ( ) ;
2011-06-11 12:54:26 +00:00
2011-08-29 22:25:40 +00:00
if ( Global . Emulator . IsLagFrame & & Global . Config . AutofireLagFrames )
2011-08-29 03:28:34 +00:00
{
Global . AutoFireController . IncrementStarts ( ) ;
}
2012-03-16 15:27:45 +00:00
PressFrameAdvance = false ;
2011-02-20 08:40:22 +00:00
}
2011-02-21 19:06:54 +00:00
2011-06-02 02:59:18 +00:00
if ( genSound )
2011-02-21 19:06:54 +00:00
Global . Sound . UpdateSound ( Global . Emulator . SoundProvider ) ;
else
2011-06-02 02:59:18 +00:00
Global . Sound . UpdateSound ( NullSound . SilenceProvider ) ;
2011-02-20 08:40:22 +00:00
}
2011-07-09 00:26:23 +00:00
/// <summary>
/// Update all tools that are frame dependent like Ram Search
/// </summary>
public void UpdateTools ( )
{
RamWatch1 . UpdateValues ( ) ;
RamSearch1 . UpdateValues ( ) ;
HexEditor1 . UpdateValues ( ) ;
NESNameTableViewer1 . UpdateValues ( ) ;
NESPPU1 . UpdateValues ( ) ;
2012-03-12 05:19:59 +00:00
PCEBGViewer1 . UpdateValues ( ) ;
2012-03-12 06:27:34 +00:00
PCEBGViewer1 . Generate ( ) ; // TODO: just a makeshift. PCE core should provide callbacks.
2011-07-09 00:26:23 +00:00
TAStudio1 . UpdateValues ( ) ;
}
2012-03-04 01:30:30 +00:00
private unsafe Image MakeScreenshotImage ( )
2011-06-11 12:54:26 +00:00
{
var video = Global . Emulator . VideoProvider ;
var image = new Bitmap ( video . BufferWidth , video . BufferHeight , PixelFormat . Format32bppArgb ) ;
2011-02-20 08:40:22 +00:00
2012-03-04 01:30:30 +00:00
//TODO - replace with BitmapBuffer
2011-06-11 12:54:26 +00:00
var framebuf = video . GetVideoBuffer ( ) ;
2012-03-30 12:26:36 +00:00
var bmpdata = image . LockBits ( new Rectangle ( 0 , 0 , image . Width , image . Height ) , ImageLockMode . WriteOnly , PixelFormat . Format32bppArgb ) ;
2012-03-04 01:30:30 +00:00
int * ptr = ( int * ) bmpdata . Scan0 . ToPointer ( ) ;
2012-03-30 12:26:36 +00:00
int stride = bmpdata . Stride / 4 ;
2011-06-11 12:54:26 +00:00
for ( int y = 0 ; y < video . BufferHeight ; y + + )
for ( int x = 0 ; x < video . BufferWidth ; x + + )
2011-07-10 01:55:37 +00:00
{
int col = framebuf [ ( y * video . BufferWidth ) + x ] ;
if ( Global . Emulator is TI83 )
{
if ( col = = 0 )
col = Color . Black . ToArgb ( ) ;
else
col = Color . White . ToArgb ( ) ;
}
2012-03-04 01:30:30 +00:00
ptr [ y * stride + x ] = col ;
2011-07-10 01:55:37 +00:00
}
2012-03-04 01:30:30 +00:00
image . UnlockBits ( bmpdata ) ;
return image ;
2011-06-11 12:54:26 +00:00
}
2011-05-21 02:51:47 +00:00
2012-03-18 04:08:05 +00:00
void TakeScreenshotToClipboard ( )
{
using ( var img = MakeScreenshotImage ( ) )
{
System . Windows . Forms . Clipboard . SetImage ( img ) ;
}
Global . RenderPanel . AddMessage ( "Screenshot saved to clipboard." ) ;
}
2011-05-21 02:51:47 +00:00
private void TakeScreenshot ( )
{
2012-03-04 01:30:30 +00:00
string path = String . Format ( PathManager . ScreenshotPrefix ( Global . Game ) + ".{0:yyyy-MM-dd HH.mm.ss}.png" , DateTime . Now ) ;
TakeScreenshot ( path ) ;
2012-03-04 19:02:28 +00:00
/ * int frames = 120 ;
int skip = 1 ;
int speed = 1 ;
bool reversable = true ;
string path = String . Format ( PathManager . ScreenshotPrefix ( Global . Game ) + frames + "Frames-Skip=" + skip + "-Speed=" + speed + "-reversable=" + reversable + ".gif" ) ;
makeAnimatedGif ( frames , skip , speed , reversable , path ) ; * /
//Was using this code to test the animated gif functions
2012-03-04 01:30:30 +00:00
}
private void TakeScreenshot ( string path )
{
var fi = new FileInfo ( path ) ;
if ( fi . Directory . Exists = = false )
fi . Directory . Create ( ) ;
using ( var img = MakeScreenshotImage ( ) )
{
img . Save ( fi . FullName , ImageFormat . Png ) ;
}
Global . RenderPanel . AddMessage ( fi . Name + " saved." ) ;
2011-02-20 08:40:22 +00:00
}
2012-02-03 12:18:27 +00:00
public void SaveState ( string name )
2011-02-20 08:40:22 +00:00
{
2011-08-04 03:20:54 +00:00
string path = PathManager . SaveStatePrefix ( Global . Game ) + "." + name + ".State" ;
2011-02-20 08:40:22 +00:00
var file = new FileInfo ( path ) ;
if ( file . Directory . Exists = = false )
file . Directory . Create ( ) ;
2011-07-31 21:39:54 +00:00
//Make backup first
if ( Global . Config . BackupSavestates & & file . Exists = = true )
{
string backup = path + ".bak" ;
var backupFile = new FileInfo ( backup ) ;
if ( backupFile . Exists = = true )
backupFile . Delete ( ) ;
file . CopyTo ( backup ) ;
}
2011-02-20 08:40:22 +00:00
var writer = new StreamWriter ( path ) ;
2012-03-18 18:24:24 +00:00
SaveStateFile ( writer , name , false ) ;
2012-03-28 01:03:50 +00:00
LuaConsole1 . LuaImp . SavestateRegisterSave ( name ) ;
2011-07-31 20:57:14 +00:00
}
2012-03-18 18:24:24 +00:00
public void SaveStateFile ( StreamWriter writer , string name , bool fromLua )
2011-07-31 20:57:14 +00:00
{
2011-02-20 08:40:22 +00:00
Global . Emulator . SaveStateText ( writer ) ;
2011-06-11 12:54:26 +00:00
HandleMovieSaveState ( writer ) ;
2011-09-24 16:19:38 +00:00
if ( Global . Config . SaveScreenshotWithStates )
{
if ( ! ( Global . Emulator is NES ) ) //NES saves the video buffer on its own so it does not need to do this
{
writer . Write ( "Framebuffer " ) ;
Global . Emulator . VideoProvider . GetVideoBuffer ( ) . SaveAsHex ( writer ) ;
}
}
2011-09-11 21:08:41 +00:00
2011-02-20 08:40:22 +00:00
writer . Close ( ) ;
2012-03-18 18:24:24 +00:00
2011-02-20 08:40:22 +00:00
Global . RenderPanel . AddMessage ( "Saved state: " + name ) ;
2012-03-18 18:24:24 +00:00
if ( ! fromLua )
{
2012-03-30 12:26:36 +00:00
2012-03-18 18:24:24 +00:00
UpdateStatusSlots ( ) ;
}
2011-02-20 08:40:22 +00:00
}
2011-06-11 12:54:26 +00:00
private void SaveStateAs ( )
{
var sfd = new SaveFileDialog ( ) ;
2011-08-04 03:20:54 +00:00
string path = PathManager . SaveStatePrefix ( Global . Game ) ;
2011-06-11 12:54:26 +00:00
sfd . InitialDirectory = path ;
2011-09-24 16:25:16 +00:00
sfd . FileName = PathManager . SaveStatePrefix ( Global . Game ) + "." + "QuickSave0.State" ;
2011-06-11 12:54:26 +00:00
var file = new FileInfo ( path ) ;
if ( file . Directory . Exists = = false )
file . Directory . Create ( ) ;
2012-03-08 12:37:40 +00:00
Global . Sound . StopSound ( ) ;
2011-06-11 12:54:26 +00:00
var result = sfd . ShowDialog ( ) ;
2012-03-08 12:37:40 +00:00
Global . Sound . StartSound ( ) ;
2011-06-11 12:54:26 +00:00
if ( result ! = DialogResult . OK )
return ;
var writer = new StreamWriter ( sfd . FileName ) ;
2012-03-18 18:24:24 +00:00
SaveStateFile ( writer , sfd . FileName , false ) ;
2011-06-11 12:54:26 +00:00
}
2012-01-22 22:20:09 +00:00
public void LoadStateFile ( string path , string name )
2011-06-11 12:54:26 +00:00
{
2011-08-20 19:27:00 +00:00
if ( HandleMovieLoadState ( path ) )
2011-07-31 16:41:27 +00:00
{
2011-08-20 19:27:00 +00:00
var reader = new StreamReader ( path ) ;
2011-07-31 16:41:27 +00:00
Global . Emulator . LoadStateText ( reader ) ;
2011-09-11 21:08:41 +00:00
while ( true )
{
2011-09-24 16:19:38 +00:00
string str = reader . ReadLine ( ) ;
if ( str = = null ) break ;
if ( str . Trim ( ) = = "" ) continue ;
string [ ] args = str . Split ( ' ' ) ;
2011-09-15 23:32:21 +00:00
if ( args [ 0 ] = = "Framebuffer" )
2011-09-24 16:19:38 +00:00
Global . Emulator . VideoProvider . GetVideoBuffer ( ) . ReadFromHex ( args [ 1 ] ) ;
2011-09-11 21:08:41 +00:00
}
2011-09-24 16:19:38 +00:00
reader . Close ( ) ;
UpdateTools ( ) ;
2011-07-31 16:41:27 +00:00
Global . RenderPanel . AddMessage ( "Loaded state: " + name ) ;
}
2011-07-31 17:35:02 +00:00
else
Global . RenderPanel . AddMessage ( "Loadstate error!" ) ;
2011-06-11 12:54:26 +00:00
}
2011-05-22 19:52:49 +00:00
2012-02-03 12:18:27 +00:00
public void LoadState ( string name )
2011-05-16 15:38:48 +00:00
{
2011-08-04 03:20:54 +00:00
string path = PathManager . SaveStatePrefix ( Global . Game ) + "." + name + ".State" ;
2011-05-16 15:38:48 +00:00
if ( File . Exists ( path ) = = false )
return ;
2011-05-22 19:52:49 +00:00
LoadStateFile ( path , name ) ;
2012-03-28 01:03:50 +00:00
LuaConsole1 . LuaImp . SavestateRegisterLoad ( name ) ;
2011-02-20 08:40:22 +00:00
}
2011-06-11 12:54:26 +00:00
private void LoadStateAs ( )
{
var ofd = new OpenFileDialog ( ) ;
2011-08-04 03:20:54 +00:00
ofd . InitialDirectory = PathManager . SaveStatePrefix ( Global . Game ) ;
2011-07-25 01:30:18 +00:00
ofd . Filter = "Save States (*.State)|*.State|All Files|*.*" ;
2011-06-11 12:54:26 +00:00
ofd . RestoreDirectory = true ;
2011-04-11 00:22:17 +00:00
2011-06-11 12:54:26 +00:00
Global . Sound . StopSound ( ) ;
var result = ofd . ShowDialog ( ) ;
Global . Sound . StartSound ( ) ;
2011-04-11 00:22:17 +00:00
2011-06-11 12:54:26 +00:00
if ( result ! = DialogResult . OK )
return ;
2011-04-11 00:22:17 +00:00
2011-06-11 12:54:26 +00:00
if ( File . Exists ( ofd . FileName ) = = false )
return ;
LoadStateFile ( ofd . FileName , Path . GetFileName ( ofd . FileName ) ) ;
}
2011-04-11 00:22:17 +00:00
2011-02-20 08:40:22 +00:00
private void SaveSlotSelectedMessage ( )
{
2011-09-17 00:04:50 +00:00
Global . RenderPanel . AddMessage ( "Slot " + Global . Config . SaveSlot + " selected." ) ;
2011-02-20 08:40:22 +00:00
}
private void UpdateAutoLoadRecentRom ( )
{
if ( Global . Config . AutoLoadMostRecentRom = = true )
{
autoloadMostRecentToolStripMenuItem . Checked = false ;
Global . Config . AutoLoadMostRecentRom = false ;
}
else
{
autoloadMostRecentToolStripMenuItem . Checked = true ;
Global . Config . AutoLoadMostRecentRom = true ;
}
}
2011-06-11 12:54:26 +00:00
private void UpdateAutoLoadRecentMovie ( )
{
if ( Global . Config . AutoLoadMostRecentMovie = = true )
{
autoloadMostRecentToolStripMenuItem1 . Checked = false ;
Global . Config . AutoLoadMostRecentMovie = false ;
}
else
{
autoloadMostRecentToolStripMenuItem1 . Checked = true ;
Global . Config . AutoLoadMostRecentMovie = true ;
}
}
2011-05-19 18:50:09 +00:00
2011-08-09 00:51:46 +00:00
public void LoadRamSearch ( )
2011-02-20 08:40:22 +00:00
{
if ( ! RamSearch1 . IsHandleCreated | | RamSearch1 . IsDisposed )
{
RamSearch1 = new RamSearch ( ) ;
RamSearch1 . Show ( ) ;
}
else
RamSearch1 . Focus ( ) ;
}
2011-06-11 12:54:26 +00:00
public void LoadGameGenieEC ( )
{
NESGameGenie gg = new NESGameGenie ( ) ;
gg . Show ( ) ;
}
public void LoadHexEditor ( )
{
if ( ! HexEditor1 . IsHandleCreated | | HexEditor1 . IsDisposed )
{
HexEditor1 = new HexEditor ( ) ;
HexEditor1 . Show ( ) ;
}
else
HexEditor1 . Focus ( ) ;
}
public void LoadToolBox ( )
{
if ( ! ToolBox1 . IsHandleCreated | | ToolBox1 . IsDisposed )
{
ToolBox1 = new ToolBox ( ) ;
ToolBox1 . Show ( ) ;
}
else
ToolBox1 . Close ( ) ;
}
public void LoadNESPPU ( )
{
if ( ! NESPPU1 . IsHandleCreated | | NESPPU1 . IsDisposed )
{
NESPPU1 = new NESPPU ( ) ;
NESPPU1 . Show ( ) ;
}
else
NESPPU1 . Focus ( ) ;
}
public void LoadNESNameTable ( )
{
if ( ! NESNameTableViewer1 . IsHandleCreated | | NESNameTableViewer1 . IsDisposed )
{
NESNameTableViewer1 = new NESNameTableViewer ( ) ;
NESNameTableViewer1 . Show ( ) ;
}
else
NESNameTableViewer1 . Focus ( ) ;
}
public void LoadNESDebugger ( )
{
if ( ! NESDebug1 . IsHandleCreated | | NESDebug1 . IsDisposed )
{
NESDebug1 = new NESDebugger ( ) ;
NESDebug1 . Show ( ) ;
}
else
NESDebug1 . Focus ( ) ;
}
2012-03-12 05:19:59 +00:00
public void LoadPCEBGViewer ( )
{
if ( ! PCEBGViewer1 . IsHandleCreated | | PCEBGViewer1 . IsDisposed )
{
PCEBGViewer1 = new PCEBGViewer ( ) ;
PCEBGViewer1 . Show ( ) ;
}
else
PCEBGViewer1 . Focus ( ) ;
}
2011-06-11 12:54:26 +00:00
public void LoadTI83KeyPad ( )
{
if ( ! TI83KeyPad1 . IsHandleCreated | | TI83KeyPad1 . IsDisposed )
{
TI83KeyPad1 = new TI83KeyPad ( ) ;
TI83KeyPad1 . Show ( ) ;
}
else
TI83KeyPad1 . Focus ( ) ;
}
public void LoadCheatsWindow ( )
{
if ( ! Cheats1 . IsHandleCreated | | Cheats1 . IsDisposed )
{
2011-08-06 02:34:24 +00:00
Cheats1 = new Cheats ( ) ;
2011-06-11 12:54:26 +00:00
Cheats1 . Show ( ) ;
}
else
Cheats1 . Focus ( ) ;
}
2011-03-16 03:56:22 +00:00
2011-02-20 08:40:22 +00:00
private int lastWidth = - 1 ;
private int lastHeight = - 1 ;
private void Render ( )
{
var video = Global . Emulator . VideoProvider ;
if ( video . BufferHeight ! = lastHeight | | video . BufferWidth ! = lastWidth )
{
lastWidth = video . BufferWidth ;
lastHeight = video . BufferHeight ;
FrameBufferResized ( ) ;
}
Global . RenderPanel . Render ( Global . Emulator . VideoProvider ) ;
}
private void FrameBufferResized ( )
{
var video = Global . Emulator . VideoProvider ;
int zoom = Global . Config . TargetZoomFactor ;
var area = Screen . FromControl ( this ) . WorkingArea ;
int borderWidth = Size . Width - renderTarget . Size . Width ;
int borderHeight = Size . Height - renderTarget . Size . Height ;
// start at target zoom and work way down until we find acceptable zoom
for ( ; zoom > = 1 ; zoom - - )
{
if ( ( ( ( video . BufferWidth * zoom ) + borderWidth ) < area . Width ) & & ( ( ( video . BufferHeight * zoom ) + borderHeight ) < area . Height ) )
break ;
}
// Change size
Size = new Size ( ( video . BufferWidth * zoom ) + borderWidth , ( video . BufferHeight * zoom + borderHeight ) ) ;
PerformLayout ( ) ;
Global . RenderPanel . Resized = true ;
// Is window off the screen at this size?
if ( area . Contains ( Bounds ) = = false )
{
if ( Bounds . Right > area . Right ) // Window is off the right edge
Location = new Point ( area . Right - Size . Width , Location . Y ) ;
if ( Bounds . Bottom > area . Bottom ) // Window is off the bottom edge
Location = new Point ( Location . X , area . Bottom - Size . Height ) ;
}
}
private bool InFullscreen = false ;
private Point WindowedLocation ;
public void ToggleFullscreen ( )
{
if ( InFullscreen = = false )
{
WindowedLocation = Location ;
FormBorderStyle = FormBorderStyle . None ;
WindowState = FormWindowState . Maximized ;
2011-09-24 23:00:59 +00:00
if ( Global . Config . ShowMenuInFullscreen )
MainMenuStrip . Visible = true ;
else
MainMenuStrip . Visible = false ;
2011-07-01 01:28:25 +00:00
StatusSlot0 . Visible = false ;
2011-02-20 08:40:22 +00:00
PerformLayout ( ) ;
Global . RenderPanel . Resized = true ;
InFullscreen = true ;
}
else
{
FormBorderStyle = FormBorderStyle . FixedSingle ;
WindowState = FormWindowState . Normal ;
MainMenuStrip . Visible = true ;
2011-07-01 01:28:25 +00:00
StatusSlot0 . Visible = Global . Config . DisplayStatusBar ;
2011-02-20 08:40:22 +00:00
Location = WindowedLocation ;
PerformLayout ( ) ;
FrameBufferResized ( ) ;
InFullscreen = false ;
}
}
2011-07-10 19:50:59 +00:00
//--alt key hacks
protected override void WndProc ( ref Message m )
{
//this is necessary to trap plain alt keypresses so that only our hotkey system gets them
if ( m . Msg = = 0x0112 ) //WM_SYSCOMMAND
if ( m . WParam . ToInt32 ( ) = = 0xF100 ) //SC_KEYMENU
return ;
base . WndProc ( ref m ) ;
}
protected override bool ProcessDialogChar ( char charCode )
{
//this is necessary to trap alt+char combinations so that only our hotkey system gets them
if ( ( Control . ModifierKeys & Keys . Alt ) ! = 0 )
return true ;
else return base . ProcessDialogChar ( charCode ) ;
}
//sends a simulation of a plain alt key keystroke
void SendPlainAltKey ( int lparam )
{
Message m = new Message ( ) ;
m . WParam = new IntPtr ( 0xF100 ) ; //SC_KEYMENU
m . LParam = new IntPtr ( lparam ) ;
m . Msg = 0x0112 ; //WM_SYSCOMMAND
m . HWnd = Handle ;
base . WndProc ( ref m ) ;
}
//sends an alt+mnemonic combination
void SendAltKeyChar ( char c )
{
typeof ( ToolStrip ) . InvokeMember ( "ProcessMnemonicInternal" , System . Reflection . BindingFlags . NonPublic | System . Reflection . BindingFlags . InvokeMethod | System . Reflection . BindingFlags . Instance , null , menuStrip1 , new object [ ] { c } ) ;
}
2011-07-24 06:45:05 +00:00
string FormatFilter ( params string [ ] args )
{
var sb = new StringBuilder ( ) ;
if ( args . Length % 2 ! = 0 ) throw new ArgumentException ( ) ;
int num = args . Length / 2 ;
for ( int i = 0 ; i < num ; i + + )
{
sb . AppendFormat ( "{0} ({1})|{1}" , args [ i * 2 ] , args [ i * 2 + 1 ] ) ;
if ( i ! = num - 1 ) sb . Append ( '|' ) ;
}
string str = sb . ToString ( ) . Replace ( "%ARCH%" , "*.zip;*.rar;*.7z" ) ;
str = str . Replace ( ";" , "; " ) ;
return str ;
}
2011-06-11 12:54:26 +00:00
private void OpenROM ( )
{
var ofd = new OpenFileDialog ( ) ;
ofd . InitialDirectory = PathManager . GetRomsPath ( Global . Emulator . SystemId ) ;
2011-07-24 06:45:05 +00:00
//"Rom Files|*.NES;*.SMS;*.GG;*.SG;*.PCE;*.SGX;*.GB;*.BIN;*.SMD;*.ROM;*.ZIP;*.7z|NES (*.NES)|*.NES|Master System|*.SMS;*.GG;*.SG;*.ZIP;*.7z|PC Engine|*.PCE;*.SGX;*.ZIP;*.7z|Gameboy|*.GB;*.ZIP;*.7z|TI-83|*.rom|Archive Files|*.zip;*.7z|Savestate|*.state|All Files|*.*";
2012-03-18 00:00:47 +00:00
//adelikat: ugly design for this, I know
if ( INTERIM )
{
ofd . Filter = FormatFilter (
2012-03-18 00:05:35 +00:00
"Rom Files" , "*.nes;*.sms;*.gg;*.sg;*.pce;*.sgx;*.bin;*.smd;*.rom;*.a26;*.cue;*.exe;*.gg;*.gen;%ARCH%" ,
2012-03-18 00:00:47 +00:00
"Disc Images" , "*.cue" ,
"NES" , "*.nes;%ARCH%" ,
"Master System" , "*.sms;*.gg;*.sg;%ARCH%" ,
"PC Engine" , "*.pce;*.sgx;*.cue;%ARCH%" ,
"TI-83" , "*.rom;%ARCH%" ,
"Archive Files" , "%ARCH%" ,
"Savestate" , "*.state" ,
2012-03-18 00:05:35 +00:00
"Atari 2600 (experimental)" , "*.a26;*.bin;%ARCH%" ,
2012-03-18 00:00:47 +00:00
"Genesis (experimental)" , "*.gen;*.smd;*.bin;*.cue;%ARCH%" ,
"Gameboy (experimental)" , "*.gb;%ARCH%" ,
2012-03-18 00:05:35 +00:00
"PSX Executables (experimental)" , "*.exe" ,
2012-03-18 00:00:47 +00:00
"All Files" , "*.*" ) ;
}
else
{
ofd . Filter = FormatFilter (
2012-03-18 00:05:35 +00:00
"Rom Files" , "*.nes;*.sms;*.gg;*.sg;*.pce;*.sgx;*.bin;*.smd;*.rom;*.cue;%ARCH%" ,
2012-03-18 00:00:47 +00:00
"Disc Images" , "*.cue" ,
"NES" , "*.nes;%ARCH%" ,
"Master System" , "*.sms;*.gg;*.sg;%ARCH%" ,
"PC Engine" , "*.pce;*.sgx;*.cue;%ARCH%" ,
"TI-83" , "*.rom;%ARCH%" ,
"Archive Files" , "%ARCH%" ,
"Savestate" , "*.state" ,
"Genesis (experimental)" , "*.gen;*.smd;*.bin;*.cue;%ARCH%" ,
"All Files" , "*.*" ) ;
}
2011-06-11 12:54:26 +00:00
ofd . RestoreDirectory = false ;
Global . Sound . StopSound ( ) ;
var result = ofd . ShowDialog ( ) ;
Global . Sound . StartSound ( ) ;
if ( result ! = DialogResult . OK )
return ;
var file = new FileInfo ( ofd . FileName ) ;
Global . Config . LastRomPath = file . DirectoryName ;
LoadRom ( file . FullName ) ;
}
2012-01-22 22:42:40 +00:00
public void CloseROM ( )
2011-06-11 12:54:26 +00:00
{
2011-08-09 00:51:46 +00:00
CloseGame ( ) ;
2011-06-11 12:54:26 +00:00
Global . Emulator = new NullEmulator ( ) ;
2011-09-24 16:19:38 +00:00
Global . Game = GameInfo . GetNullGame ( ) ;
2011-08-09 00:51:46 +00:00
MemoryPulse . Clear ( ) ;
2011-06-11 12:54:26 +00:00
RamSearch1 . Restart ( ) ;
RamWatch1 . Restart ( ) ;
HexEditor1 . Restart ( ) ;
NESPPU1 . Restart ( ) ;
NESNameTableViewer1 . Restart ( ) ;
NESDebug1 . Restart ( ) ;
2012-03-12 05:19:59 +00:00
PCEBGViewer1 . Restart ( ) ;
2011-06-11 12:54:26 +00:00
TI83KeyPad1 . Restart ( ) ;
Cheats1 . Restart ( ) ;
2012-01-10 02:11:17 +00:00
ToolBox1 . Restart ( ) ;
2012-03-12 04:44:34 +00:00
#if WINDOWS
2012-01-21 20:05:53 +00:00
LuaConsole1 . Restart ( ) ;
2012-03-12 04:44:34 +00:00
#endif
2011-09-11 00:11:46 +00:00
Text = "BizHawk" + ( INTERIM ? " (interim) " : "" ) ;
2011-06-11 12:54:26 +00:00
HandlePlatformMenus ( ) ;
2011-07-31 23:25:00 +00:00
StateSlots . Clear ( ) ;
2011-07-10 15:36:41 +00:00
UpdateDumpIcon ( ) ;
2011-06-11 12:54:26 +00:00
}
2011-04-16 19:35:37 +00:00
2011-06-11 12:54:26 +00:00
private void SaveConfig ( )
{
if ( Global . Config . SaveWindowPosition )
{
Global . Config . MainWndx = this . Location . X ;
Global . Config . MainWndy = this . Location . Y ;
}
else
{
Global . Config . MainWndx = - 1 ;
Global . Config . MainWndy = - 1 ;
}
2012-03-09 20:10:01 +00:00
CloseForm ( RamWatch1 ) ;
CloseForm ( RamSearch1 ) ;
CloseForm ( HexEditor1 ) ;
CloseForm ( NESNameTableViewer1 ) ;
CloseForm ( NESPPU1 ) ;
CloseForm ( NESDebug1 ) ;
2012-03-12 05:19:59 +00:00
CloseForm ( PCEBGViewer1 ) ;
2012-03-09 20:10:01 +00:00
CloseForm ( Cheats1 ) ;
CloseForm ( TI83KeyPad1 ) ;
CloseForm ( TAStudio1 ) ;
2012-03-12 04:44:34 +00:00
#if WINDOWS
2012-03-09 20:12:57 +00:00
CloseForm ( LuaConsole1 ) ;
2012-03-12 04:44:34 +00:00
#endif
2012-03-09 21:20:02 +00:00
if ( Global . Config . ShowLogWindow ) LogConsole . SaveConfigSettings ( ) ;
2011-06-11 22:15:08 +00:00
ConfigService . Save ( PathManager . DefaultIniPath , Global . Config ) ;
2011-06-11 12:54:26 +00:00
}
2012-03-09 20:10:01 +00:00
private void CloseForm ( Form form )
{
if ( form . IsHandleCreated ) form . Close ( ) ;
}
2011-06-11 12:54:26 +00:00
private void PreviousSlot ( )
{
2011-09-24 16:19:38 +00:00
if ( Global . Config . SaveSlot = = 0 )
2011-09-17 00:04:50 +00:00
Global . Config . SaveSlot = 9 ; //Wrap to end of slot list
else if ( Global . Config . SaveSlot > 9 )
Global . Config . SaveSlot = 9 ; //Meh, just in case
else Global . Config . SaveSlot - - ;
2011-06-11 12:54:26 +00:00
SaveSlotSelectedMessage ( ) ;
2011-07-17 13:33:09 +00:00
UpdateStatusSlots ( ) ;
2011-06-11 12:54:26 +00:00
}
private void NextSlot ( )
{
2011-09-17 00:04:50 +00:00
if ( Global . Config . SaveSlot > = 9 )
Global . Config . SaveSlot = 0 ; //Wrap to beginning of slot list
else if ( Global . Config . SaveSlot < 0 )
Global . Config . SaveSlot = 0 ; //Meh, just in case
else Global . Config . SaveSlot + + ;
2011-06-11 12:54:26 +00:00
SaveSlotSelectedMessage ( ) ;
2011-07-17 13:33:09 +00:00
UpdateStatusSlots ( ) ;
2011-06-11 12:54:26 +00:00
}
private void ToggleFPS ( )
{
Global . Config . DisplayFPS ^ = true ;
}
private void ToggleFrameCounter ( )
{
Global . Config . DisplayFrameCounter ^ = true ;
}
private void ToggleLagCounter ( )
{
Global . Config . DisplayLagCounter ^ = true ;
}
private void ToggleInputDisplay ( )
{
Global . Config . DisplayInput ^ = true ;
}
public void ToggleReadOnly ( )
{
2011-09-03 18:07:30 +00:00
if ( Global . MovieSession . Movie . Mode > MOVIEMODE . INACTIVE )
2011-08-17 02:06:50 +00:00
{
ReadOnly ^ = true ;
if ( ReadOnly )
Global . RenderPanel . AddMessage ( "Movie read-only mode" ) ;
else
Global . RenderPanel . AddMessage ( "Movie read+write mode" ) ;
}
2011-06-11 12:54:26 +00:00
else
2011-08-17 02:06:50 +00:00
{
Global . RenderPanel . AddMessage ( "No movie active" ) ;
}
2011-06-11 23:54:35 +00:00
}
public void SetReadOnly ( bool read_only )
{
ReadOnly = read_only ;
if ( ReadOnly )
Global . RenderPanel . AddMessage ( "Movie read-only mode" ) ;
else
Global . RenderPanel . AddMessage ( "Movie read+write mode" ) ;
2011-06-11 12:54:26 +00:00
}
public void LoadRamWatch ( )
{
if ( ! RamWatch1 . IsHandleCreated | | RamWatch1 . IsDisposed )
{
RamWatch1 = new RamWatch ( ) ;
if ( Global . Config . AutoLoadRamWatch & & Global . Config . RecentWatches . Length ( ) > 0 )
RamWatch1 . LoadWatchFromRecent ( Global . Config . RecentWatches . GetRecentFileByPosition ( 0 ) ) ;
RamWatch1 . Show ( ) ;
}
else
RamWatch1 . Focus ( ) ;
}
public void LoadTAStudio ( )
{
if ( ! TAStudio1 . IsHandleCreated | | TAStudio1 . IsDisposed )
{
TAStudio1 = new TAStudio ( ) ;
TAStudio1 . Show ( ) ;
}
else
TAStudio1 . Focus ( ) ;
}
private void VolumeUp ( )
{
Global . Config . SoundVolume + = 10 ;
if ( Global . Config . SoundVolume > 100 )
Global . Config . SoundVolume = 100 ;
Global . Sound . ChangeVolume ( Global . Config . SoundVolume ) ;
Global . RenderPanel . AddMessage ( "Volume " + Global . Config . SoundVolume . ToString ( ) ) ;
}
private void VolumeDown ( )
{
Global . Config . SoundVolume - = 10 ;
if ( Global . Config . SoundVolume < 0 )
Global . Config . SoundVolume = 0 ;
Global . Sound . ChangeVolume ( Global . Config . SoundVolume ) ;
Global . RenderPanel . AddMessage ( "Volume " + Global . Config . SoundVolume . ToString ( ) ) ;
2011-06-18 18:27:51 +00:00
}
2011-06-26 21:11:12 +00:00
2011-06-30 02:22:12 +00:00
private void SoftReset ( )
{
2011-07-24 20:37:10 +00:00
//is it enough to run this for one frame? maybe..
2011-06-30 02:22:12 +00:00
if ( Global . Emulator . ControllerDefinition . BoolButtons . Contains ( "Reset" ) )
2011-08-19 01:05:30 +00:00
{
2011-07-24 20:37:10 +00:00
Global . ClickyVirtualPadController . Click ( "Reset" ) ;
2011-10-15 23:17:15 +00:00
if ( Global . MovieSession . Movie . Mode = = MOVIEMODE . INACTIVE & & Global . Emulator is NES )
2011-08-19 01:05:30 +00:00
Global . Emulator . ResetFrameCounter ( ) ;
}
2011-06-30 02:22:12 +00:00
}
2011-07-01 01:28:25 +00:00
public void UpdateStatusSlots ( )
{
StateSlots . Update ( ) ;
StatusSlot1 . Enabled = StateSlots . HasSlot ( 1 ) ;
StatusSlot2 . Enabled = StateSlots . HasSlot ( 2 ) ;
StatusSlot3 . Enabled = StateSlots . HasSlot ( 3 ) ;
StatusSlot4 . Enabled = StateSlots . HasSlot ( 4 ) ;
StatusSlot5 . Enabled = StateSlots . HasSlot ( 5 ) ;
StatusSlot6 . Enabled = StateSlots . HasSlot ( 6 ) ;
StatusSlot7 . Enabled = StateSlots . HasSlot ( 7 ) ;
StatusSlot8 . Enabled = StateSlots . HasSlot ( 8 ) ;
StatusSlot9 . Enabled = StateSlots . HasSlot ( 9 ) ;
StatusSlot10 . Enabled = StateSlots . HasSlot ( 0 ) ;
StatusSlot1 . BackColor = SystemColors . Control ;
StatusSlot2 . BackColor = SystemColors . Control ;
StatusSlot3 . BackColor = SystemColors . Control ;
StatusSlot4 . BackColor = SystemColors . Control ;
StatusSlot5 . BackColor = SystemColors . Control ;
StatusSlot6 . BackColor = SystemColors . Control ;
StatusSlot7 . BackColor = SystemColors . Control ;
StatusSlot8 . BackColor = SystemColors . Control ;
StatusSlot9 . BackColor = SystemColors . Control ;
StatusSlot10 . BackColor = SystemColors . Control ;
2011-09-17 00:04:50 +00:00
if ( Global . Config . SaveSlot = = 0 ) StatusSlot10 . BackColor = SystemColors . ControlLightLight ;
if ( Global . Config . SaveSlot = = 1 ) StatusSlot1 . BackColor = SystemColors . ControlLightLight ;
if ( Global . Config . SaveSlot = = 2 ) StatusSlot2 . BackColor = SystemColors . ControlLightLight ;
if ( Global . Config . SaveSlot = = 3 ) StatusSlot3 . BackColor = SystemColors . ControlLightLight ;
if ( Global . Config . SaveSlot = = 4 ) StatusSlot4 . BackColor = SystemColors . ControlLightLight ;
if ( Global . Config . SaveSlot = = 5 ) StatusSlot5 . BackColor = SystemColors . ControlLightLight ;
if ( Global . Config . SaveSlot = = 6 ) StatusSlot6 . BackColor = SystemColors . ControlLightLight ;
if ( Global . Config . SaveSlot = = 7 ) StatusSlot7 . BackColor = SystemColors . ControlLightLight ;
if ( Global . Config . SaveSlot = = 8 ) StatusSlot8 . BackColor = SystemColors . ControlLightLight ;
if ( Global . Config . SaveSlot = = 9 ) StatusSlot9 . BackColor = SystemColors . ControlLightLight ;
2011-07-01 01:28:25 +00:00
}
2011-07-11 23:26:20 +00:00
public void RecordAVI ( )
2011-07-09 21:13:18 +00:00
{
2011-07-12 00:05:14 +00:00
if ( CurrAviWriter ! = null ) return ;
2011-07-11 23:26:20 +00:00
var sfd = new SaveFileDialog ( ) ;
if ( ! ( Global . Emulator is NullEmulator ) )
{
2011-08-04 03:20:54 +00:00
sfd . FileName = PathManager . FilesystemSafeName ( Global . Game ) ;
2011-07-11 23:26:20 +00:00
sfd . InitialDirectory = PathManager . MakeAbsolutePath ( Global . Config . AVIPath , "" ) ;
}
else
{
sfd . FileName = "NULL" ;
sfd . InitialDirectory = PathManager . MakeAbsolutePath ( Global . Config . AVIPath , "" ) ;
}
sfd . Filter = "AVI (*.avi)|*.avi|All Files|*.*" ;
Global . Sound . StopSound ( ) ;
var result = sfd . ShowDialog ( ) ;
Global . Sound . StartSound ( ) ;
if ( result = = DialogResult . Cancel )
return ;
2011-08-09 00:51:46 +00:00
2011-07-11 23:26:20 +00:00
//TODO - cores should be able to specify exact values for these instead of relying on this to calculate them
int fps = ( int ) ( Global . Emulator . CoreOutputComm . VsyncRate * 0x01000000 ) ;
AviWriter aw = new AviWriter ( ) ;
try
{
aw . SetMovieParameters ( fps , 0x01000000 ) ;
aw . SetVideoParameters ( Global . Emulator . VideoProvider . BufferWidth , Global . Emulator . VideoProvider . BufferHeight ) ;
aw . SetAudioParameters ( 44100 , 2 , 16 ) ;
2011-07-13 04:04:58 +00:00
var token = AviWriter . AcquireVideoCodecToken ( Global . MainForm . Handle , null ) ;
2011-07-11 23:26:20 +00:00
aw . SetVideoCodecToken ( token ) ;
2011-07-13 04:04:58 +00:00
aw . OpenFile ( sfd . FileName ) ;
2011-07-11 23:26:20 +00:00
//commit the avi writing last, in case there were any errors earlier
CurrAviWriter = aw ;
Global . RenderPanel . AddMessage ( "AVI capture started" ) ;
2011-07-12 00:37:24 +00:00
AVIStatusLabel . Image = BizHawk . MultiClient . Properties . Resources . AVI ;
AVIStatusLabel . ToolTipText = "AVI capture in progress" ;
2011-07-11 23:26:20 +00:00
}
catch
{
Global . RenderPanel . AddMessage ( "AVI capture failed!" ) ;
aw . Dispose ( ) ;
throw ;
}
2011-07-09 21:13:18 +00:00
}
2011-07-10 00:04:33 +00:00
2011-07-11 23:26:20 +00:00
public void StopAVI ( )
2011-07-10 00:04:33 +00:00
{
2011-07-12 00:05:14 +00:00
if ( CurrAviWriter = = null ) return ;
2011-07-11 23:26:20 +00:00
CurrAviWriter . CloseFile ( ) ;
CurrAviWriter = null ;
Global . RenderPanel . AddMessage ( "AVI capture stopped" ) ;
2011-07-12 00:37:24 +00:00
AVIStatusLabel . Image = BizHawk . MultiClient . Properties . Resources . Blank ;
AVIStatusLabel . ToolTipText = "" ;
2011-07-10 00:04:33 +00:00
}
2011-07-31 22:29:56 +00:00
private void SwapBackupSavestate ( string path )
{
//Takes the .state and .bak files and swaps them
var state = new FileInfo ( path ) ;
var backup = new FileInfo ( path + ".bak" ) ;
var temp = new FileInfo ( path + ".bak.tmp" ) ;
if ( state . Exists = = false ) return ;
if ( backup . Exists = = false ) return ;
if ( temp . Exists = = true ) temp . Delete ( ) ;
backup . CopyTo ( path + ".bak.tmp" ) ;
backup . Delete ( ) ;
state . CopyTo ( path + ".bak" ) ;
state . Delete ( ) ;
temp . CopyTo ( path ) ;
temp . Delete ( ) ;
2011-07-31 23:25:00 +00:00
2011-09-17 00:04:50 +00:00
StateSlots . ToggleRedo ( Global . Config . SaveSlot ) ;
2011-07-31 22:29:56 +00:00
}
2011-09-24 23:12:43 +00:00
private void ShowHideMenu ( )
{
MainMenuStrip . Visible ^ = true ;
}
2012-01-10 01:30:17 +00:00
public void OpenLuaConsole ( )
{
2012-03-12 04:44:34 +00:00
#if WINDOWS
2012-01-21 20:05:53 +00:00
if ( ! LuaConsole1 . IsHandleCreated | | LuaConsole1 . IsDisposed )
{
LuaConsole1 = new LuaConsole ( ) ;
LuaConsole1 . Show ( ) ;
}
else
LuaConsole1 . Focus ( ) ;
2012-03-12 04:44:34 +00:00
#else
MessageBox . Show ( "Sorry, Lua is not supported on this platform." , "Lua not supported" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
#endif
2012-01-10 01:30:17 +00:00
}
2012-01-10 02:02:11 +00:00
public void OpenGameboyDebugger ( )
{
if ( Global . Emulator is Gameboy )
{
Debugger gbDebugger = new Debugger ( Global . Emulator as Gameboy ) ;
gbDebugger . Show ( ) ;
}
}
2012-01-22 22:42:40 +00:00
public void LoadRamPoke ( )
{
RamPoke r = new RamPoke ( ) ;
r . Show ( ) ;
}
2012-03-03 20:14:20 +00:00
private void importMovieToolStripMenuItem_Click ( object sender , EventArgs e )
{
var ofd = new OpenFileDialog ( ) ;
ofd . InitialDirectory = PathManager . GetRomsPath ( Global . Emulator . SystemId ) ;
ofd . Multiselect = true ;
ofd . Filter = FormatFilter (
2012-03-14 20:46:59 +00:00
"Movie Files" , "*.fm2;*.mc2;*.mcm;*.mmv;*.fcm;*.fmv;*.vmv;*.nmv;*.gmv;*.vbm;" ,
2012-03-03 20:14:20 +00:00
"FCEUX" , "*.fm2" ,
2012-03-09 16:31:14 +00:00
"PCEjin/Mednafen" , "*.mc2;*.mcm" ,
2012-03-09 12:10:41 +00:00
"Dega" , "*.mmv" ,
"FCEU" , "*.fcm" ,
"Famtasia" , "*.fmv" ,
2012-03-14 20:46:59 +00:00
"VirtuaNES" , "*.vmv" ,
"Nintendulator" , "*.nmv" ,
2012-03-09 12:10:41 +00:00
"Gens" , "*.gmv" ,
2012-03-14 20:46:59 +00:00
"Visual Boy Advance" , "*.vbm" ,
2012-03-03 20:14:20 +00:00
"All Files" , "*.*" ) ;
ofd . RestoreDirectory = false ;
Global . Sound . StopSound ( ) ;
var result = ofd . ShowDialog ( ) ;
Global . Sound . StartSound ( ) ;
if ( result ! = DialogResult . OK )
return ;
2012-03-30 12:26:36 +00:00
2012-03-03 20:14:20 +00:00
foreach ( string fn in ofd . FileNames )
{
var file = new FileInfo ( fn ) ;
string errorMsg = "" ;
string warningMsg = "" ;
Movie m = MovieImport . ImportFile ( fn , out errorMsg , out warningMsg ) ;
if ( errorMsg . Length > 0 )
MessageBox . Show ( errorMsg , "Conversion error" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
if ( warningMsg . Length > 0 )
Global . RenderPanel . AddMessage ( warningMsg ) ;
else
2012-03-31 00:38:39 +00:00
Global . RenderPanel . AddMessage ( Path . GetFileName ( fn ) + " imported as ." + Global . Config . MovieExtension ) ;
2012-03-03 20:14:20 +00:00
}
}
2012-03-03 20:49:44 +00:00
2012-03-04 19:02:28 +00:00
#region Animaged Gifs
/// <summary>
/// Creates Animated Gifs
/// </summary>
/// <param name="num_images">Total number of frames in the gif</param>
/// <param name="frameskip">How many frames to skip per screenshot in the image.
/// A value of 5 means that frame 1002 will be an image and 1007 will be an image in the gif
/// A value of 1 means that frame 1001 will be an image and 1002 will be an image in the gif</param>
/// <param name="gifSpeed">How quickly the animated gif will run. A value of 1 or -1 = normal emulator speed.
/// A value of 2 will double the speed of the gif.
/// Input a negative value to slow down the speed of the gif.
/// A value of -2 will be half speed</param>
/// <param name="reversable">Flag for making the gif loop back and forth</param>
/// <param name="filename">location to save the file</param>
/// <returns>false if the parameters are incorrect, true if it completes</returns>
2012-03-04 20:37:49 +00:00
public bool AnimatedGif ( int num_images , int frameskip , int gifSpeed , bool reversable , String filename )
2012-03-04 19:02:28 +00:00
{
if ( num_images < 1 | | frameskip < 1 | | gifSpeed = = 0 ) return false ; //Exits if settings are bad
#region declare / insantiate variables
List < Image > images = new List < Image > ( ) ; //Variable for holding all images for the gif animation
Image tempImage ; //Holding the image in case it doesn't end up being added to the animation
// Such a scenario could be a frameskip setting of 2 and a gifSpeed setting of 3
// This would result in 1 of every 3 images being requested getting skipped.
// My math might be wrong at this hour, but you get the point!
int speedTracker = 0 ; // To keep track of when to add another image to the list
bool status = PressFrameAdvance ;
PressFrameAdvance = true ;
#endregion
#region Get the Images for the File
int totalFrames = ( gifSpeed > 0 ? num_images : ( num_images * ( gifSpeed * - 1 ) ) ) ;
images . Add ( MakeScreenshotImage ( ) ) ;
2012-03-30 12:26:36 +00:00
while ( images . Count < totalFrames )
2012-03-04 19:02:28 +00:00
{
tempImage = MakeScreenshotImage ( ) ;
2012-03-30 12:26:36 +00:00
if ( gifSpeed < 0 )
2012-03-04 19:02:28 +00:00
for ( speedTracker = 0 ; speedTracker > gifSpeed ; speedTracker - - )
images . Add ( tempImage ) ; //If the speed of the animation is to be slowed down, then add that many copies
2012-03-30 12:26:36 +00:00
//of the image to the list
2012-03-04 19:02:28 +00:00
for ( int j = 0 ; j < frameskip ; j + + )
{
StepRunLoop_Core ( ) ;
Global . Emulator . FrameAdvance ( true ) ; //Frame advance
Global . RenderPanel . Render ( Global . Emulator . VideoProvider ) ;
if ( gifSpeed > 0 )
{
speedTracker + + ; //Advance the frame counter for adding to the List of Images
2012-03-30 12:26:36 +00:00
if ( speedTracker = = Math . Max ( gifSpeed , frameskip ) )
2012-03-04 19:02:28 +00:00
{
images . Add ( tempImage ) ;
speedTracker = 0 ;
}
}
}
}
#endregion
PressFrameAdvance = status ;
/ *
* The following code was obtained from here :
* http : //social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/0c4252c8-8274-449c-ad9b-e4f07a8f8cdd/
* Modified to work with the BizHawk Project
* /
#region make gif file
2012-03-30 12:26:36 +00:00
byte [ ] GifAnimation = { 33 , 255 , 11 , 78 , 69 , 84 , 83 , 67 , 65 , 80 , 69 , 50 , 46 , 48 , 3 , 1 , 0 , 0 , 0 } ;
2012-03-04 19:02:28 +00:00
MemoryStream MS = new MemoryStream ( ) ;
BinaryReader BR = new BinaryReader ( MS ) ;
2012-03-04 19:07:52 +00:00
var fi = new FileInfo ( filename ) ;
if ( fi . Directory . Exists = = false )
fi . Directory . Create ( ) ;
2012-03-04 19:02:28 +00:00
BinaryWriter BW = new BinaryWriter ( new FileStream ( filename , FileMode . Create ) ) ;
2012-03-30 12:26:36 +00:00
images [ 0 ] . Save ( MS , ImageFormat . Gif ) ;
2012-03-04 19:02:28 +00:00
byte [ ] B = MS . ToArray ( ) ;
B [ 10 ] = ( byte ) ( B [ 10 ] & 0X78 ) ; //No global color table.
BW . Write ( B , 0 , 13 ) ;
BW . Write ( GifAnimation ) ;
WriteGifImg ( B , BW ) ;
for ( int I = 1 ; I < images . Count ; I + + )
{
MS . SetLength ( 0 ) ;
images [ I ] . Save ( MS , ImageFormat . Gif ) ;
B = MS . ToArray ( ) ;
WriteGifImg ( B , BW ) ;
}
if ( reversable )
{
for ( int I = images . Count - 2 ; I > = 0 ; I - - ) //Start at (count - 2) because last image is already in place
{
MS . SetLength ( 0 ) ;
images [ I ] . Save ( MS , ImageFormat . Gif ) ;
B = MS . ToArray ( ) ;
WriteGifImg ( B , BW ) ;
}
}
BW . Write ( B [ B . Length - 1 ] ) ;
BW . Close ( ) ;
MS . Dispose ( ) ;
#endregion
return true ;
}
public void WriteGifImg ( byte [ ] B , BinaryWriter BW )
{
2012-03-30 12:26:36 +00:00
byte [ ] Delay = { 0 , 0 } ;
2012-03-04 19:02:28 +00:00
B [ 785 ] = Delay [ 0 ] ;
B [ 786 ] = Delay [ 1 ] ;
B [ 798 ] = ( byte ) ( B [ 798 ] | 0X87 ) ;
BW . Write ( B , 781 , 18 ) ;
BW . Write ( B , 13 , 768 ) ;
BW . Write ( B , 799 , B . Length - 800 ) ;
}
#endregion
2012-03-04 19:24:10 +00:00
private void animatedGIFConfigToolStripMenuItem_Click ( object sender , EventArgs e )
{
GifAnimator g = new GifAnimator ( ) ;
g . Show ( ) ;
}
2012-03-04 20:37:49 +00:00
private void makeAnimatedGIFToolStripMenuItem_Click ( object sender , EventArgs e )
{
makeAnimatedGif ( ) ;
}
private void makeAnimatedGif ( )
{
string path = String . Format ( PathManager . ScreenshotPrefix ( Global . Game ) + "AGIF.{0:yyyy-MM-dd HH.mm.ss}.gif" , DateTime . Now ) ;
AnimatedGif ( Global . Config . GifAnimatorNumFrames , Global . Config . GifAnimatorFrameSkip , Global . Config . GifAnimatorSpeed , Global . Config . GifAnimatorReversable , path ) ;
}
private void makeAnimatedGif ( string path )
{
AnimatedGif ( Global . Config . GifAnimatorNumFrames , Global . Config . GifAnimatorFrameSkip , Global . Config . GifAnimatorSpeed , Global . Config . GifAnimatorReversable , path ) ;
}
private void makeAnimatedGifAsToolStripMenuItem_Click ( object sender , EventArgs e )
{
string path = String . Format ( PathManager . ScreenshotPrefix ( Global . Game ) + "AGIF.{0:yyyy-MM-dd HH.mm.ss}.gif" , DateTime . Now ) ;
SaveFileDialog sfd = new SaveFileDialog ( ) ;
sfd . InitialDirectory = Path . GetDirectoryName ( path ) ;
sfd . FileName = Path . GetFileName ( path ) ;
sfd . Filter = "GIF File (*.gif)|*.gif" ;
Global . Sound . StopSound ( ) ;
var result = sfd . ShowDialog ( ) ;
Global . Sound . StartSound ( ) ;
if ( result ! = DialogResult . OK )
return ;
makeAnimatedGif ( sfd . FileName ) ;
}
2012-03-07 03:58:54 +00:00
2012-03-30 12:26:36 +00:00
private void frameAdvanceSkipLagFramesToolStripMenuItem_Click ( object sender , EventArgs e )
{
Global . Config . SkipLagFrame ^ = true ;
}
2012-03-09 21:36:55 +00:00
private void ShowConsole ( )
{
LogConsole . ShowConsole ( ) ;
logWindowAsConsoleToolStripMenuItem . Enabled = false ;
}
private void HideConsole ( )
{
LogConsole . HideConsole ( ) ;
logWindowAsConsoleToolStripMenuItem . Enabled = true ;
}
2012-03-09 21:20:02 +00:00
public void notifyLogWindowClosing ( )
{
displayLogWindowToolStripMenuItem . Checked = false ;
2012-03-09 21:36:55 +00:00
logWindowAsConsoleToolStripMenuItem . Enabled = true ;
2012-03-09 21:20:02 +00:00
}
2012-03-18 04:08:05 +00:00
2012-03-24 12:20:21 +00:00
private void MainForm_Load ( object sender , EventArgs e )
{
Text = "BizHawk" + ( INTERIM ? " (interim) " : "" ) ;
}
2012-03-28 02:32:05 +00:00
private void IncreaseWindowSize ( )
{
switch ( Global . Config . TargetZoomFactor )
{
case 1 :
Global . Config . TargetZoomFactor = 2 ;
break ;
case 2 :
Global . Config . TargetZoomFactor = 3 ;
break ;
case 3 :
Global . Config . TargetZoomFactor = 4 ;
break ;
case 4 :
Global . Config . TargetZoomFactor = 5 ;
break ;
case 5 :
Global . Config . TargetZoomFactor = 10 ;
break ;
case 10 :
return ;
}
FrameBufferResized ( ) ;
}
private void DecreaseWIndowSize ( )
{
switch ( Global . Config . TargetZoomFactor )
{
case 1 :
return ;
case 2 :
Global . Config . TargetZoomFactor = 1 ;
break ;
case 3 :
Global . Config . TargetZoomFactor = 2 ;
break ;
case 4 :
Global . Config . TargetZoomFactor = 3 ;
break ;
case 5 :
Global . Config . TargetZoomFactor = 4 ;
break ;
case 10 :
Global . Config . TargetZoomFactor = 5 ;
return ;
}
FrameBufferResized ( ) ;
}
2011-02-20 08:40:22 +00:00
}
2012-03-09 12:10:41 +00:00
}