2011-07-22 01:14:13 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
|
|
|
|
|
namespace BizHawk.MultiClient
|
|
|
|
|
{
|
|
|
|
|
partial class MainForm
|
|
|
|
|
{
|
|
|
|
|
public bool ReadOnly = true; //Global Movie Read only setting
|
|
|
|
|
public Movie UserMovie = new Movie();
|
|
|
|
|
|
|
|
|
|
public void StartNewMovie(Movie m, bool record)
|
|
|
|
|
{
|
2011-07-24 23:14:16 +00:00
|
|
|
|
Global.MovieSession = new MovieSession();
|
|
|
|
|
Global.MovieSession.Movie = m;
|
|
|
|
|
UserMovie = m; //TODO - maybe get rid of UserMovie?
|
|
|
|
|
RewireInputChain();
|
2011-07-22 01:14:13 +00:00
|
|
|
|
|
|
|
|
|
LoadRom(Global.MainForm.CurrentlyOpenRom);
|
|
|
|
|
UserMovie.LoadMovie();
|
|
|
|
|
Global.Config.RecentMovies.Add(m.Filename);
|
2011-07-30 20:49:36 +00:00
|
|
|
|
if (UserMovie.StartsFromSavestate)
|
|
|
|
|
{
|
|
|
|
|
LoadStateFile(m.Filename, Path.GetFileName(m.Filename));
|
|
|
|
|
Global.Emulator.ResetFrameCounter();
|
|
|
|
|
}
|
2011-07-22 01:14:13 +00:00
|
|
|
|
if (record)
|
|
|
|
|
{
|
|
|
|
|
UserMovie.StartNewRecording();
|
|
|
|
|
ReadOnly = false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
UserMovie.StartPlayback();
|
|
|
|
|
}
|
|
|
|
|
SetMainformMovieInfo();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetMainformMovieInfo()
|
|
|
|
|
{
|
|
|
|
|
if (UserMovie.Mode == MOVIEMODE.PLAY || UserMovie.Mode == MOVIEMODE.FINISHED)
|
|
|
|
|
{
|
|
|
|
|
Text = DisplayNameForSystem(Global.Game.System) + " - " + Global.Game.Name + " - " + Path.GetFileName(UserMovie.Filename);
|
|
|
|
|
PlayRecordStatus.Image = BizHawk.MultiClient.Properties.Resources.Play;
|
|
|
|
|
PlayRecordStatus.ToolTipText = "Movie is in playback mode";
|
|
|
|
|
}
|
|
|
|
|
else if (UserMovie.Mode == MOVIEMODE.RECORD)
|
|
|
|
|
{
|
|
|
|
|
Text = DisplayNameForSystem(Global.Game.System) + " - " + Global.Game.Name + " - " + Path.GetFileName(UserMovie.Filename);
|
|
|
|
|
PlayRecordStatus.Image = BizHawk.MultiClient.Properties.Resources.RecordHS;
|
|
|
|
|
PlayRecordStatus.ToolTipText = "Movie is in record mode";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Text = DisplayNameForSystem(Global.Game.System) + " - " + Global.Game.Name;
|
|
|
|
|
PlayRecordStatus.Image = BizHawk.MultiClient.Properties.Resources.Blank;
|
|
|
|
|
PlayRecordStatus.ToolTipText = "";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool MovieActive()
|
|
|
|
|
{
|
|
|
|
|
if (UserMovie.Mode != MOVIEMODE.INACTIVE)
|
|
|
|
|
return true;
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void PlayMovie()
|
|
|
|
|
{
|
|
|
|
|
PlayMovie p = new PlayMovie();
|
|
|
|
|
DialogResult d = p.ShowDialog();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void RecordMovie()
|
|
|
|
|
{
|
|
|
|
|
RecordMovie r = new RecordMovie();
|
|
|
|
|
r.ShowDialog();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void PlayMovieFromBeginning()
|
|
|
|
|
{
|
|
|
|
|
if (UserMovie.Mode != MOVIEMODE.INACTIVE)
|
|
|
|
|
{
|
|
|
|
|
LoadRom(CurrentlyOpenRom);
|
|
|
|
|
UserMovie.StartPlayback();
|
|
|
|
|
SetMainformMovieInfo();
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-07-22 01:34:21 +00:00
|
|
|
|
|
|
|
|
|
public void StopMovie()
|
|
|
|
|
{
|
|
|
|
|
string message = "Movie ";
|
|
|
|
|
if (UserMovie.Mode == MOVIEMODE.RECORD)
|
|
|
|
|
message += "recording ";
|
|
|
|
|
else if (UserMovie.Mode == MOVIEMODE.PLAY
|
|
|
|
|
|| UserMovie.Mode == MOVIEMODE.FINISHED)
|
|
|
|
|
message += "playback ";
|
|
|
|
|
message += "stopped.";
|
|
|
|
|
if (UserMovie.Mode != MOVIEMODE.INACTIVE)
|
|
|
|
|
{
|
|
|
|
|
UserMovie.StopMovie();
|
|
|
|
|
Global.RenderPanel.AddMessage(message);
|
|
|
|
|
SetMainformMovieInfo();
|
2011-08-17 23:53:05 +00:00
|
|
|
|
Global.MainForm.ReadOnly = true;
|
2011-07-22 01:34:21 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2011-07-31 01:15:14 +00:00
|
|
|
|
|
2011-08-20 19:27:00 +00:00
|
|
|
|
private bool HandleMovieLoadState(string path)
|
2011-07-31 01:15:14 +00:00
|
|
|
|
{
|
|
|
|
|
//Note, some of the situations in these IF's may be identical and could be combined but I intentionally separated it out for clarity
|
2011-07-31 16:41:27 +00:00
|
|
|
|
if (UserMovie.Mode == MOVIEMODE.INACTIVE)
|
|
|
|
|
return true;
|
|
|
|
|
|
2011-07-31 01:15:14 +00:00
|
|
|
|
if (UserMovie.Mode == MOVIEMODE.RECORD)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (ReadOnly)
|
|
|
|
|
{
|
2011-07-31 16:41:27 +00:00
|
|
|
|
|
2011-08-20 19:27:00 +00:00
|
|
|
|
if (!UserMovie.CheckTimeLines(path, false))
|
2011-07-31 16:41:27 +00:00
|
|
|
|
return false; //Timeline/GUID error
|
|
|
|
|
else
|
2011-07-31 01:15:14 +00:00
|
|
|
|
{
|
|
|
|
|
UserMovie.WriteMovie();
|
|
|
|
|
UserMovie.StartPlayback();
|
|
|
|
|
SetMainformMovieInfo();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2011-08-20 19:27:00 +00:00
|
|
|
|
if (!UserMovie.CheckTimeLines(path, true))
|
2011-07-31 17:35:02 +00:00
|
|
|
|
return false; //GUID Error
|
2011-08-20 19:27:00 +00:00
|
|
|
|
UserMovie.LoadLogFromSavestateText(path);
|
2011-07-31 01:15:14 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (UserMovie.Mode == MOVIEMODE.PLAY)
|
|
|
|
|
{
|
|
|
|
|
if (ReadOnly)
|
|
|
|
|
{
|
2011-08-20 19:27:00 +00:00
|
|
|
|
if (!UserMovie.CheckTimeLines(path, false))
|
2011-07-31 16:41:27 +00:00
|
|
|
|
return false; //Timeline/GUID error
|
|
|
|
|
//Frame loop automatically handles the rewinding effect based on Global.Emulator.Frame so nothing else is needed here
|
2011-07-31 01:15:14 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2011-08-20 19:27:00 +00:00
|
|
|
|
if (!UserMovie.CheckTimeLines(path, true))
|
2011-07-31 17:35:02 +00:00
|
|
|
|
return false; //GUID Error
|
2011-07-31 01:15:14 +00:00
|
|
|
|
UserMovie.StartNewRecording(!Global.MovieSession.MultiTrack.IsActive);
|
|
|
|
|
SetMainformMovieInfo();
|
2011-08-20 19:27:00 +00:00
|
|
|
|
UserMovie.LoadLogFromSavestateText(path);
|
2011-07-31 01:15:14 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (UserMovie.Mode == MOVIEMODE.FINISHED)
|
|
|
|
|
{
|
|
|
|
|
if (ReadOnly)
|
|
|
|
|
{
|
|
|
|
|
if (Global.Emulator.Frame > UserMovie.Length())
|
|
|
|
|
{
|
|
|
|
|
//Post movie savestate
|
|
|
|
|
//There is no movie data to load, and the movie will stay in movie finished mode
|
|
|
|
|
//So do nothing
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2011-08-20 19:27:00 +00:00
|
|
|
|
if (!UserMovie.CheckTimeLines(path, false))
|
2011-07-31 16:41:27 +00:00
|
|
|
|
return false; //Timeline/GUID error
|
2011-07-31 01:15:14 +00:00
|
|
|
|
UserMovie.StartPlayback();
|
|
|
|
|
SetMainformMovieInfo();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (Global.Emulator.Frame > UserMovie.Length())
|
|
|
|
|
{
|
|
|
|
|
//Post movie savestate
|
|
|
|
|
//There is no movie data to load, and the movie will stay in movie finished mode
|
|
|
|
|
//So do nothing
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2011-08-20 19:27:00 +00:00
|
|
|
|
if (!UserMovie.CheckTimeLines(path, true))
|
2011-07-31 17:35:02 +00:00
|
|
|
|
return false; //GUID Error
|
2011-07-31 01:15:14 +00:00
|
|
|
|
UserMovie.StartNewRecording();
|
|
|
|
|
SetMainformMovieInfo();
|
2011-08-20 19:27:00 +00:00
|
|
|
|
UserMovie.LoadLogFromSavestateText(path);
|
2011-07-31 01:15:14 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-07-31 16:41:27 +00:00
|
|
|
|
return true;
|
2011-07-31 01:15:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void HandleMovieSaveState(StreamWriter writer)
|
|
|
|
|
{
|
|
|
|
|
if (UserMovie.Mode != MOVIEMODE.INACTIVE)
|
|
|
|
|
{
|
|
|
|
|
UserMovie.DumpLogIntoSavestateText(writer);
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-07-22 01:14:13 +00:00
|
|
|
|
}
|
|
|
|
|
}
|