2011-07-22 01:14:13 +00:00
using System ;
using System.IO ;
2013-10-25 00:57:23 +00:00
using BizHawk.Client.Common ;
2014-04-22 01:16:11 +00:00
using BizHawk.Emulation.Common ;
using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES ;
2014-05-18 16:28:56 +00:00
using BizHawk.Emulation.Cores.Nintendo.NES ;
2014-05-18 15:54:56 +00:00
2013-11-03 03:54:37 +00:00
namespace BizHawk.Client.EmuHawk
2011-07-22 01:14:13 +00:00
{
partial class MainForm
{
2014-07-07 19:48:58 +00:00
public void StartNewMovie ( IMovie movie , bool record )
2011-07-22 01:14:13 +00:00
{
2014-07-13 20:33:20 +00:00
if ( ! record ) // The semantics of record is that we are starting a new movie, and even wiping a pre-existing movie with the same path, but non-record means we are loading an existing movie into playback mode
{
movie . Load ( ) ;
}
2014-07-04 13:07:21 +00:00
if ( movie . SystemID ! = Global . Emulator . SystemId )
{
GlobalWin . OSD . AddMessage ( "Movie does not match the currently loaded system, unable to load" ) ;
return ;
}
2012-09-22 20:04:37 +00:00
//If a movie is already loaded, save it before starting a new movie
2014-07-08 13:46:59 +00:00
if ( Global . MovieSession . Movie . IsActive & & ! string . IsNullOrEmpty ( Global . MovieSession . Movie . Filename ) )
2012-09-22 20:04:37 +00:00
{
2013-11-23 18:18:58 +00:00
Global . MovieSession . Movie . Save ( ) ;
2012-09-22 20:04:37 +00:00
}
2012-10-13 21:30:19 +00:00
2013-11-01 18:52:26 +00:00
Global . MovieSession = new MovieSession
{
2013-12-04 15:17:02 +00:00
Movie = movie ,
2014-06-19 01:47:22 +00:00
MovieControllerAdapter = movie . LogGeneratorInstance ( ) . MovieControllerAdapter ,
2013-11-03 16:07:58 +00:00
MessageCallback = GlobalWin . OSD . AddMessage ,
2013-11-01 18:52:26 +00:00
AskYesNoCallback = StateErrorAskUser
} ;
2013-12-24 21:59:41 +00:00
InputManager . RewireInputChain ( ) ;
2011-07-22 01:14:13 +00:00
2011-09-04 19:04:00 +00:00
if ( ! record )
2012-09-03 19:42:53 +00:00
{
2014-07-08 15:18:17 +00:00
Global . MovieSession . MovieLoad ( ) ; // TODO this loads it a 2nd time, ugh
2012-09-03 19:42:53 +00:00
}
2013-12-24 23:32:43 +00:00
try
{
2014-05-18 16:28:56 +00:00
var quicknesName = ( ( CoreAttributes ) Attribute . GetCustomAttribute ( typeof ( QuickNES ) , typeof ( CoreAttributes ) ) ) . CoreName ;
2014-05-29 12:25:42 +00:00
var neshawkName = ( ( CoreAttributes ) Attribute . GetCustomAttribute ( typeof ( NES ) , typeof ( CoreAttributes ) ) ) . CoreName ;
2014-05-18 16:28:56 +00:00
if ( ! record & & Global . Emulator . SystemId = = "NES" ) // For NES we need special logic since the movie will drive which core to load
2013-12-24 23:32:43 +00:00
{
2014-05-29 12:25:42 +00:00
// If either is specified use that, else use whatever is currently set
2014-06-12 23:22:15 +00:00
if ( Global . MovieSession . Movie . Core = = quicknesName )
2014-04-22 01:16:11 +00:00
{
Global . Config . NES_InQuickNES = true ;
}
2014-06-12 23:22:15 +00:00
else if ( Global . MovieSession . Movie . Core = = neshawkName )
2014-04-22 01:16:11 +00:00
{
2014-05-18 16:28:56 +00:00
Global . Config . NES_InQuickNES = false ;
2014-04-22 01:16:11 +00:00
}
2014-01-01 03:03:10 +00:00
}
2014-06-01 00:40:13 +00:00
2014-06-29 02:12:23 +00:00
var s = Global . MovieSession . Movie . SyncSettingsJson ;
2014-05-18 17:15:51 +00:00
if ( ! string . IsNullOrWhiteSpace ( s ) )
{
2014-05-18 17:19:38 +00:00
_syncSettingsHack = ConfigService . LoadWithType ( s ) ;
2014-05-18 17:15:51 +00:00
}
2014-05-24 22:06:08 +00:00
2014-07-04 13:07:21 +00:00
if ( record ) // This is a hack really, we need to set the movie to its propert state so that it will be considered active later
{
Global . MovieSession . Movie . SwitchToRecord ( ) ;
}
else
2014-05-24 22:06:08 +00:00
{
Global . MovieSession . Movie . SwitchToRecord ( ) ;
}
LoadRom ( GlobalWin . MainForm . CurrentlyOpenRom ) ;
2013-12-24 23:32:43 +00:00
}
finally
{
// ensure subsequent calls to LoadRom won't get the settings object created here
2013-12-29 23:35:42 +00:00
this . _syncSettingsHack = null ;
2013-12-24 23:32:43 +00:00
}
2012-11-22 03:47:18 +00:00
2014-07-07 19:48:58 +00:00
Global . Config . RecentMovies . Add ( movie . Filename ) ;
2013-12-14 06:58:09 +00:00
2014-06-11 01:41:41 +00:00
if ( Global . MovieSession . Movie . StartsFromSavestate )
2011-07-30 20:49:36 +00:00
{
2014-06-20 00:39:46 +00:00
if ( Global . MovieSession . Movie . TextSavestate ! = null )
Global . Emulator . LoadStateText ( new StringReader ( Global . MovieSession . Movie . TextSavestate ) ) ;
else
Global . Emulator . LoadStateBinary ( new BinaryReader ( new MemoryStream ( Global . MovieSession . Movie . BinarySavestate , false ) ) ) ;
2011-07-30 20:49:36 +00:00
}
2013-12-03 18:08:45 +00:00
2014-07-07 19:48:58 +00:00
if ( record )
2011-07-22 01:14:13 +00:00
{
2014-07-07 19:48:58 +00:00
Global . MovieSession . Movie . StartNewRecording ( ) ;
Global . MovieSession . ReadOnly = false ;
2011-07-22 01:14:13 +00:00
}
2014-07-07 19:48:58 +00:00
else
2013-12-14 06:58:09 +00:00
{
2014-07-07 19:48:58 +00:00
Global . MovieSession . Movie . StartNewPlayback ( ) ;
2013-12-14 06:58:09 +00:00
}
2014-07-07 19:48:58 +00:00
SetMainformMovieInfo ( ) ;
2014-06-22 13:57:23 +00:00
GlobalWin . Tools . Restart < VirtualpadTool > ( ) ;
2013-11-03 16:07:58 +00:00
GlobalWin . DisplayManager . NeedsToPaint = true ;
2011-07-22 01:14:13 +00:00
}
public void SetMainformMovieInfo ( )
{
2013-10-24 22:26:28 +00:00
if ( Global . MovieSession . Movie . IsPlaying )
2011-07-22 01:14:13 +00:00
{
2014-05-23 16:22:24 +00:00
Text = DisplayNameForSystem ( Global . Game . System ) + " - " + Global . Game . Name + " - " + Path . GetFileName ( Global . MovieSession . Movie . Filename ) ;
2013-10-27 15:53:37 +00:00
PlayRecordStatusButton . Image = Properties . Resources . Play ;
PlayRecordStatusButton . ToolTipText = "Movie is in playback mode" ;
PlayRecordStatusButton . Visible = true ;
2011-07-22 01:14:13 +00:00
}
2013-10-24 22:26:28 +00:00
else if ( Global . MovieSession . Movie . IsRecording )
2011-07-22 01:14:13 +00:00
{
2014-05-23 16:22:24 +00:00
Text = DisplayNameForSystem ( Global . Game . System ) + " - " + Global . Game . Name + " - " + Path . GetFileName ( Global . MovieSession . Movie . Filename ) ;
2013-10-27 15:53:37 +00:00
PlayRecordStatusButton . Image = Properties . Resources . RecordHS ;
PlayRecordStatusButton . ToolTipText = "Movie is in record mode" ;
PlayRecordStatusButton . Visible = true ;
2011-07-22 01:14:13 +00:00
}
2013-10-24 22:26:28 +00:00
else if ( ! Global . MovieSession . Movie . IsActive )
2011-07-22 01:14:13 +00:00
{
2014-05-23 16:22:24 +00:00
Text = DisplayNameForSystem ( Global . Game . System ) + " - " + Global . Game . Name ;
2013-10-27 15:53:37 +00:00
PlayRecordStatusButton . Image = Properties . Resources . Blank ;
PlayRecordStatusButton . ToolTipText = "No movie is active" ;
PlayRecordStatusButton . Visible = false ;
2011-07-22 01:14:13 +00:00
}
}
2013-11-01 18:52:26 +00:00
public void RestartMovie ( )
2011-07-22 01:14:13 +00:00
{
2013-10-24 22:26:28 +00:00
if ( Global . MovieSession . Movie . IsActive )
2011-07-22 01:14:13 +00:00
{
2014-05-24 22:06:08 +00:00
LoadRom ( CurrentlyOpenRom ) ;
2014-06-11 01:41:41 +00:00
if ( Global . MovieSession . Movie . StartsFromSavestate )
2011-09-04 19:06:18 +00:00
{
2014-06-20 00:39:46 +00:00
// TODO: why does this code exist twice??
if ( Global . MovieSession . Movie . TextSavestate ! = null )
{
Global . Emulator . LoadStateText ( new StringReader ( Global . MovieSession . Movie . TextSavestate ) ) ;
}
else
{
Global . Emulator . LoadStateBinary ( new BinaryReader ( new MemoryStream ( Global . MovieSession . Movie . BinarySavestate , false ) ) ) ;
}
//var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob);
//Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state)));
2013-11-03 16:29:51 +00:00
Global . Emulator . ResetCounters ( ) ;
2011-09-04 19:06:18 +00:00
}
2013-12-03 18:08:45 +00:00
2013-11-29 19:55:05 +00:00
Global . MovieSession . Movie . StartNewPlayback ( ) ;
2011-07-22 01:14:13 +00:00
SetMainformMovieInfo ( ) ;
2013-11-03 16:07:58 +00:00
GlobalWin . OSD . AddMessage ( "Replaying movie file in read-only mode" ) ;
2013-12-03 18:08:45 +00:00
Global . MovieSession . ReadOnly = true ;
2011-07-22 01:14:13 +00:00
}
}
2011-07-22 01:34:21 +00:00
2013-11-23 18:18:58 +00:00
public void StopMovie ( bool saveChanges = true )
2011-07-22 01:34:21 +00:00
{
2014-07-10 19:51:36 +00:00
if ( IsSlave & & _master . WantsToCOntrolStopMovie )
{
_master . StopMovie ( ) ;
}
else
{
Global . MovieSession . StopMovie ( saveChanges ) ;
SetMainformMovieInfo ( ) ;
}
2013-10-25 00:57:23 +00:00
}
2011-07-22 01:14:13 +00:00
}
}