2013-11-23 17:26:33 +00:00
using System.IO ;
using BizHawk.Emulation.Common ;
namespace BizHawk.Client.Common
{
2013-11-29 19:55:05 +00:00
// TODO: message callback / event handler
// TODO: consider other event handlers, switching modes?
2013-11-23 17:26:33 +00:00
public interface IMovie
{
2013-11-29 19:55:05 +00:00
#region Status
2013-11-23 17:26:33 +00:00
bool IsCountingRerecords { get ; set ; }
bool IsActive { get ; }
bool IsPlaying { get ; }
bool IsRecording { get ; }
bool IsFinished { get ; }
2013-11-23 18:18:58 +00:00
bool Changes { get ; }
bool Loaded { get ; }
2013-11-29 19:55:05 +00:00
2013-11-30 02:50:54 +00:00
#endregion
#region Properties
2013-11-30 02:20:34 +00:00
ulong Rerecords { get ; set ; }
2013-11-30 02:33:26 +00:00
IMovieHeader Header { get ; }
2013-11-29 19:55:05 +00:00
#endregion
2013-11-23 17:26:33 +00:00
2013-11-29 19:55:05 +00:00
#region File Handling API
string Filename { get ; set ; }
2013-11-23 18:18:58 +00:00
bool Load ( ) ;
void Save ( ) ;
void SaveAs ( ) ;
2013-11-30 02:50:54 +00:00
string GetInputLog ( ) ;
2013-11-29 19:55:05 +00:00
#endregion
#region Mode Handling API
/// <summary>
/// Tells the movie to start recording from the beginning.
2013-11-30 02:20:34 +00:00
/// This will clear SRAM, and the movie log
2013-11-29 19:55:05 +00:00
/// </summary>
void StartNewRecording ( ) ;
/// <summary>
/// Tells the movie to start playback from the beginning
2013-11-30 02:20:34 +00:00
/// This will clear SRAM
2013-11-29 19:55:05 +00:00
/// </summary>
void StartNewPlayback ( ) ;
/// <summary>
/// Sets the movie to inactive (note that it will still be in memory)
/// The saveChanges flag will tell the movie to save its contents to disk
/// </summary>
2013-11-30 02:20:34 +00:00
/// <param name="saveChanges">if true, will save to disk</param>
2013-11-23 18:18:58 +00:00
void Stop ( bool saveChanges = true ) ;
2013-11-23 17:26:33 +00:00
2013-11-29 19:55:05 +00:00
/// <summary>
/// Switches to record mode
2013-11-30 02:20:34 +00:00
/// Does not change the movie log or clear SRAM
2013-11-29 19:55:05 +00:00
/// </summary>
void SwitchToRecord ( ) ;
/// <summary>
/// Switches to playback mode
2013-11-30 02:20:34 +00:00
/// Does not change the movie log or clear SRAM
2013-11-29 19:55:05 +00:00
/// </summary>
void SwitchToPlay ( ) ;
#endregion
2013-11-23 17:26:33 +00:00
#region Editing API
2013-11-23 18:18:58 +00:00
2013-11-23 17:26:33 +00:00
void ClearFrame ( int frame ) ;
void ModifyFrame ( string record , int frame ) ;
void AppendFrame ( string record ) ;
void InsertFrame ( string record , int frame ) ;
void InsertBlankFrame ( int frame ) ;
void DeleteFrame ( int frame ) ;
void TruncateMovie ( int frame ) ;
2013-11-23 18:18:58 +00:00
2013-11-23 17:26:33 +00:00
#endregion
#region Dubious , should reconsider
2013-11-30 02:33:26 +00:00
2013-11-29 19:55:05 +00:00
void CommitFrame ( int frameNum , IController source ) ; // Why pass in frameNum? Calling api
void PokeFrame ( int frameNum , string input ) ; // Why does this exist as something different than Commit Frame?
LoadStateResult CheckTimeLines ( TextReader reader , bool onlyGuid , bool ignoreGuidMismatch , out string errorMessage ) ; // No need to return a status, no reason to have hacky flags, no need to pass a textreader
string GetTime ( bool preLoad ) ; // Rename to simply: Time, and make it a Timespan
2013-11-30 02:50:54 +00:00
void GetInputLog ( TextReader reader , bool isMultitracking ) ; // how about the movie know if it is multi-tracking rather than having to pass it in
2013-11-29 19:55:05 +00:00
int? Frames { get ; } // Nullable is a hack, also why does calling code need to know the number of frames, can that be minimized?
int RawFrames { get ; } // Hacky to need two different frame properties
string GetInput ( int frame ) ; // Should be a property of a Record object
2013-11-23 17:26:33 +00:00
#endregion
}
}
2013-11-29 19:55:05 +00:00
// TODO: delete this and refactor code that uses it!
2013-11-23 17:26:33 +00:00
public enum LoadStateResult { Pass , GuidMismatch , TimeLineError , FutureEventError , NotInRecording , EmptyLog , MissingFrameNumber }