BizHawk/BizHawk.Client.EmuHawk/movie/RecordMovie.cs

247 lines
7.0 KiB
C#

using System;
using System.Windows.Forms;
using System.IO;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.ColecoVision;
using BizHawk.Emulation.Cores.Sega.MasterSystem;
using BizHawk.Emulation.Cores.Nintendo.NES;
using BizHawk.Emulation.Cores.Nintendo.SNES;
using BizHawk.Emulation.Cores.Nintendo.N64;
using BizHawk.Emulation.Cores.Nintendo.Gameboy;
using BizHawk.Client.Common;
namespace BizHawk.Client.EmuHawk
{
public partial class RecordMovie : Form
{
//TODO
//Allow relative paths in record textbox
public RecordMovie()
{
InitializeComponent();
}
private string MakePath()
{
if (RecordBox.Text.Length == 0)
{
return String.Empty;
}
var path = RecordBox.Text;
if (path.LastIndexOf(Path.DirectorySeparatorChar) == -1)
{
if (path[0] != Path.DirectorySeparatorChar)
{
path = path.Insert(0, Path.DirectorySeparatorChar.ToString());
}
path = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null) + path;
if (path[path.Length - 4] != '.') //If no file extension, add movie extension
{
path += "." + Global.Config.MovieExtension;
}
return path;
}
else
{
return path;
}
}
private void OK_Click(object sender, EventArgs e)
{
var path = MakePath();
if (!String.IsNullOrWhiteSpace(path))
{
var test = new FileInfo(path);
if (test.Exists)
{
var result = MessageBox.Show(path + " already exists, overwrite?", "Confirm overwrite", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if (result == DialogResult.Cancel)
{
return;
}
}
Movie _movieToRecord;
if (StartFromCombo.SelectedItem.ToString() == "Now")
{
_movieToRecord = new Movie(path, startsFromSavestate: true);
var temppath = path;
var writer = new StreamWriter(temppath);
Global.Emulator.SaveStateText(writer);
writer.Close();
var file = new FileInfo(temppath);
using (var sr = file.OpenText())
{
string str;
while ((str = sr.ReadLine()) != null)
{
if (!String.IsNullOrWhiteSpace(str))
{
_movieToRecord.Header.Comments.Add(str);
}
}
}
}
else
{
_movieToRecord = new Movie(path);
}
//Header
_movieToRecord.Header[HeaderKeys.AUTHOR] = AuthorBox.Text;
_movieToRecord.Header[HeaderKeys.EMULATIONVERSION] = VersionInfo.GetEmuVersion();
_movieToRecord.Header[HeaderKeys.MOVIEVERSION] = HeaderKeys.MovieVersion1;
_movieToRecord.Header[HeaderKeys.PLATFORM] = Global.Game.System;
if (Global.Game != null)
{
_movieToRecord.Header[HeaderKeys.GAMENAME] = PathManager.FilesystemSafeName(Global.Game);
_movieToRecord.Header[HeaderKeys.SHA1] = Global.Game.Hash;
if (Global.Game.FirmwareHash != null)
{
_movieToRecord.Header[HeaderKeys.FIRMWARESHA1] = Global.Game.FirmwareHash;
}
}
else
{
_movieToRecord.Header[HeaderKeys.GAMENAME] = "NULL";
}
if (Global.Emulator.BoardName != null)
{
_movieToRecord.Header[HeaderKeys.BOARDNAME] = Global.Emulator.BoardName;
}
if (Global.Emulator is Gameboy)
{
_movieToRecord.Header[HeaderKeys.GB_FORCEDMG] = Global.Config.GB_ForceDMG.ToString();
_movieToRecord.Header[HeaderKeys.GB_GBA_IN_CGB] = Global.Config.GB_GBACGB.ToString();
}
if (Global.Emulator is LibsnesCore)
{
_movieToRecord.Header[HeaderKeys.SGB] = ((Global.Emulator) as LibsnesCore).IsSGB.ToString();
if ((Global.Emulator as LibsnesCore).DisplayType == DisplayType.PAL)
{
_movieToRecord.Header[HeaderKeys.PAL] = "1";
}
}
else if (Global.Emulator is SMS)
{
if ((Global.Emulator as SMS).DisplayType == DisplayType.PAL)
{
_movieToRecord.Header[HeaderKeys.PAL] = "1";
}
}
else if (Global.Emulator is NES)
{
if ((Global.Emulator as NES).DisplayType == DisplayType.PAL)
{
_movieToRecord.Header[HeaderKeys.PAL] = "1";
}
}
else if (Global.Emulator is ColecoVision)
{
_movieToRecord.Header[HeaderKeys.SKIPBIOS] = Global.Config.ColecoSkipBiosIntro.ToString();
}
else if (Global.Emulator is N64)
{
_movieToRecord.Header[HeaderKeys.VIDEOPLUGIN] = Global.Config.N64VidPlugin;
if (Global.Config.N64VidPlugin == "Rice")
{
var rice_settings = Global.Config.RicePlugin.GetPluginSettings();
foreach(var setting in rice_settings)
{
_movieToRecord.Header[setting.Key] = setting.Value.ToString();
}
}
else if (Global.Config.N64VidPlugin == "Glide64")
{
var glide_settings = Global.Config.GlidePlugin.GetPluginSettings();
foreach (var setting in glide_settings)
{
_movieToRecord.Header[setting.Key] = setting.Value.ToString();
}
}
if ((Global.Emulator as N64).DisplayType == DisplayType.PAL)
{
_movieToRecord.Header[HeaderKeys.PAL] = "1";
}
}
GlobalWin.MainForm.StartNewMovie(_movieToRecord, true);
Global.Config.UseDefaultAuthor = DefaultAuthorCheckBox.Checked;
if (DefaultAuthorCheckBox.Checked)
{
Global.Config.DefaultAuthor = AuthorBox.Text;
}
Close();
}
else
{
MessageBox.Show("Please select a movie to record", "File selection error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void Cancel_Click(object sender, EventArgs e)
{
Close();
}
private void button1_Click(object sender, EventArgs e)
{
var filename = String.Empty;
var sfd = new SaveFileDialog
{
InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null),
DefaultExt = "." + Global.Config.MovieExtension,
FileName = RecordBox.Text,
OverwritePrompt = false
};
var filter = "Movie Files (*." + Global.Config.MovieExtension + ")|*." + Global.Config.MovieExtension + "|Savestates|*.state|All Files|*.*";
sfd.Filter = filter;
var result = sfd.ShowHawkDialog();
if (result == DialogResult.OK
&& !String.IsNullOrWhiteSpace(sfd.FileName))
{
RecordBox.Text = filename;
}
}
private void RecordMovie_Load(object sender, EventArgs e)
{
var name = PathManager.FilesystemSafeName(Global.Game);
name = Path.GetFileNameWithoutExtension(name);
RecordBox.Text = name;
StartFromCombo.SelectedIndex = 0;
DefaultAuthorCheckBox.Checked = Global.Config.UseDefaultAuthor;
if (Global.Config.UseDefaultAuthor)
{
AuthorBox.Text = Global.Config.DefaultAuthor;
}
}
private void RecordBox_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None;
}
private void RecordBox_DragDrop(object sender, DragEventArgs e)
{
var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop);
RecordBox.Text = filePaths[0];
}
}
}