Movies - Added "Full Movie Loadstates" option, when checked it will do VBA-style movie loadstates where the entire state-movie is put into the movie, and then the movie is truncated on the next emulated frame rather than immediately

This commit is contained in:
adelikat 2013-03-09 19:54:50 +00:00
parent 0eeacb57ce
commit d308f76d2c
5 changed files with 346 additions and 326 deletions

View File

@ -579,6 +579,7 @@ namespace BizHawk.MultiClient
public string DefaultAuthor = "default user";
public bool UseDefaultAuthor = true;
public bool DisplaySubtitles = true;
public bool VBAStyleMovieLoadState = false;
//Play Movie Dialog
public bool PlayMovie_IncludeSubdir = true;

File diff suppressed because it is too large Load Diff

View File

@ -1269,6 +1269,15 @@ namespace BizHawk.MultiClient
private void movieToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
{
if (Global.MovieSession.MultiTrack.IsActive)
{
fullMovieLoadstatesToolStripMenuItem.Enabled = false;
}
else
{
fullMovieLoadstatesToolStripMenuItem.Enabled = true;
}
if (Global.MovieSession.Movie.IsActive)
{
stopMovieToolStripMenuItem.Enabled = true;
@ -1292,6 +1301,7 @@ namespace BizHawk.MultiClient
stopMovieToolStripMenuItem.ShortcutKeyDisplayString = Global.Config.StopMovieBinding;
playFromBeginningToolStripMenuItem.ShortcutKeyDisplayString = Global.Config.PlayBeginningBinding;
saveMovieToolStripMenuItem.ShortcutKeyDisplayString = Global.Config.SaveMovieBinding;
fullMovieLoadstatesToolStripMenuItem.Checked = Global.Config.VBAStyleMovieLoadState;
}
private void saveConfigToolStripMenuItem_Click(object sender, EventArgs e)

View File

@ -2755,16 +2755,26 @@ namespace BizHawk.MultiClient
{
if (Global.MovieSession.Movie.IsActive)
{
Global.MovieSession.MultiTrack.IsActive = !Global.MovieSession.MultiTrack.IsActive;
if (Global.MovieSession.MultiTrack.IsActive)
if (Global.Config.VBAStyleMovieLoadState)
{
Global.OSD.AddMessage("MultiTrack Enabled");
Global.OSD.MT = "Recording None";
Global.OSD.AddMessage("Multi-track can not be used in Full Movie Loadstates mode");
}
else
Global.OSD.AddMessage("MultiTrack Disabled");
Global.MovieSession.MultiTrack.RecordAll = false;
Global.MovieSession.MultiTrack.CurrentPlayer = 0;
{
Global.MovieSession.MultiTrack.IsActive = !Global.MovieSession.MultiTrack.IsActive;
if (Global.MovieSession.MultiTrack.IsActive)
{
Global.OSD.AddMessage("MultiTrack Enabled");
Global.OSD.MT = "Recording None";
}
else
{
Global.OSD.AddMessage("MultiTrack Disabled");
}
Global.MovieSession.MultiTrack.RecordAll = false;
Global.MovieSession.MultiTrack.CurrentPlayer = 0;
}
}
else
{
@ -5059,6 +5069,9 @@ namespace BizHawk.MultiClient
}
}
private void fullMovieLoadstatesToolStripMenuItem_Click(object sender, EventArgs e)
{
Global.Config.VBAStyleMovieLoadState ^= true;
}
}
}

View File

@ -68,10 +68,7 @@ namespace BizHawk.MultiClient
public int Rerecords
{
get
{
return rerecords;
}
get { return rerecords; }
set
{
rerecords = value;
@ -81,26 +78,17 @@ namespace BizHawk.MultiClient
public string SysID
{
get
{
return Header.GetHeaderLine(MovieHeader.PLATFORM);
}
get { return Header.GetHeaderLine(MovieHeader.PLATFORM); }
}
public string GUID
{
get
{
return Header.GetHeaderLine(MovieHeader.GUID);
}
get { return Header.GetHeaderLine(MovieHeader.GUID); }
}
public string GameName
{
get
{
return Header.GetHeaderLine(MovieHeader.GAMENAME);
}
get { return Header.GetHeaderLine(MovieHeader.GAMENAME); }
}
public int Frames
@ -127,10 +115,7 @@ namespace BizHawk.MultiClient
public bool StartsFromSavestate
{
get
{
return startsfromsavestate;
}
get { return startsfromsavestate; }
set
{
startsfromsavestate = value;
@ -147,26 +132,17 @@ namespace BizHawk.MultiClient
public int StateFirstIndex
{
get
{
return Log.StateFirstIndex;
}
get { return Log.StateFirstIndex; }
}
public int StateLastIndex
{
get
{
return Log.StateLastIndex;
}
get { return Log.StateLastIndex; }
}
public bool StateCapturing
{
get
{
return statecapturing;
}
get { return statecapturing; }
set
{
statecapturing = value;
@ -525,6 +501,7 @@ namespace BizHawk.MultiClient
public void TruncateMovie(int frame)
{
Log.TruncateMovie(frame);
Log.TruncateStates(frame);
}
#endregion
@ -602,14 +579,17 @@ namespace BizHawk.MultiClient
public void CommitFrame(int frameNum, IController source)
{
//if (Global.Emulator.Frame < Log.Length())
//{
// Log.Truncate(Global.Emulator.Frame);
//}
//Note: Truncation here instead of loadstate will make VBA style loadstates
//(Where an entire movie is loaded then truncated on the next frame
//this allows users to restore a movie with any savestate from that "timeline"
if (Global.Config.VBAStyleMovieLoadState)
{
if (Global.Emulator.Frame < Log.Length)
{
Log.TruncateMovie(Global.Emulator.Frame);
Log .TruncateStates(Global.Emulator.Frame);
}
}
MnemonicsGenerator mg = new MnemonicsGenerator();
mg.SetSource(source);
@ -709,13 +689,19 @@ namespace BizHawk.MultiClient
}
if (stateFrame > 0 && stateFrame < Log.Length)
{
Log.TruncateStates(stateFrame);
Log.TruncateMovie(stateFrame);
if (!Global.Config.VBAStyleMovieLoadState)
{
Log.TruncateStates(stateFrame);
Log.TruncateMovie(stateFrame);
}
}
else if (stateFrame > Log.Length) //Post movie savestate
{
Log.TruncateStates(Log.Length);
Log.TruncateMovie(Log.Length);
if (!Global.Config.VBAStyleMovieLoadState)
{
Log.TruncateStates(Log.Length);
Log.TruncateMovie(Log.Length);
}
Mode = MOVIEMODE.FINISHED;
}
if (IsCountingRerecords)