-As frames and subtitles actually occur more than once, I put them on the top of the big if / else if block for ImportText so that it doesn't have to do unnecessary ToLower() and StartsWith("name") calls.
-Put frames and subtitles into functions because vec\ gives good advice.
This commit is contained in:
parent
c06a44c495
commit
5ce6050cb4
|
@ -85,6 +85,112 @@ namespace BizHawk.MultiClient
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Import a frame from a text-based format.
|
||||||
|
private static Movie ImportTextFrame(string line, int lineNum, Movie m, string path, ref string warningMsg)
|
||||||
|
{
|
||||||
|
string[] buttons = new string[] { };
|
||||||
|
string controller = "";
|
||||||
|
switch (Path.GetExtension(path).ToUpper())
|
||||||
|
{
|
||||||
|
case ".FM2":
|
||||||
|
buttons = new string[8] { "Right", "Left", "Down", "Up", "Start", "Select", "B", "A" };
|
||||||
|
controller = "NES Controller";
|
||||||
|
break;
|
||||||
|
case ".MC2":
|
||||||
|
buttons = new string[8] { "Up", "Down", "Left", "Right", "B1", "B2", "Run", "Select" };
|
||||||
|
controller = "PC Engine Controller";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
SimpleController controllers = new SimpleController();
|
||||||
|
controllers.Type = new ControllerDefinition();
|
||||||
|
controllers.Type.Name = controller;
|
||||||
|
MnemonicsGenerator mg = new MnemonicsGenerator();
|
||||||
|
// Split up the sections of the frame.
|
||||||
|
string[] sections = line.Split('|');
|
||||||
|
if (Path.GetExtension(path).ToUpper() == ".FM2" && sections[1].Length != 0)
|
||||||
|
{
|
||||||
|
controllers["Reset"] = (sections[1][0] == '1');
|
||||||
|
// Get the first invalid command warning message that arises.
|
||||||
|
if (warningMsg == "")
|
||||||
|
{
|
||||||
|
switch (sections[1][0])
|
||||||
|
{
|
||||||
|
case '0':
|
||||||
|
break;
|
||||||
|
case '1':
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
if (m.LogLength() != 0)
|
||||||
|
warningMsg = "hard reset";
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
warningMsg = "FDS Insert";
|
||||||
|
break;
|
||||||
|
case '8':
|
||||||
|
warningMsg = "FDS Select Side";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
warningMsg = "unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (warningMsg != "")
|
||||||
|
warningMsg = "Unable to import " + warningMsg + " command on line " + lineNum + ".";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Skip the first two sections of the split, which consist of everything before the starting | and the
|
||||||
|
command. Do not use the section after the last |. In other words, get the sections for the players.
|
||||||
|
*/
|
||||||
|
for (int section = 2; section < sections.Length - 1; section++)
|
||||||
|
{
|
||||||
|
// The player number is one less than the section number for the reasons explained above.
|
||||||
|
int player = section - 1;
|
||||||
|
// Only count lines with that have the right number of buttons and are for valid players.
|
||||||
|
if (
|
||||||
|
sections[section].Length == buttons.Length &&
|
||||||
|
player <= Global.PLAYERS[controllers.Type.Name]
|
||||||
|
)
|
||||||
|
for (int button = 0; button < buttons.Length; button++)
|
||||||
|
// Consider the button pressed so long as its spot is not occupied by a ".".
|
||||||
|
controllers["P" + (player).ToString() + " " + buttons[button]] = (
|
||||||
|
sections[section][button] != '.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Convert the data for the controllers to a mnemonic and add it as a frame.
|
||||||
|
mg.SetSource(controllers);
|
||||||
|
m.AppendFrame(mg.GetControllersAsMnemonic());
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Import a subtitle from a text-based format.
|
||||||
|
private static Movie ImportTextSubtitle(string line, Movie m)
|
||||||
|
{
|
||||||
|
Subtitle s = new Subtitle();
|
||||||
|
// Reduce all whitespace to single spaces.
|
||||||
|
line = line.Replace("\t", " ");
|
||||||
|
line = line.Replace("\n", " ");
|
||||||
|
line = line.Replace("\r", " ");
|
||||||
|
line = line.Replace("\r\n", " ");
|
||||||
|
string prev;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
prev = line;
|
||||||
|
line = line.Replace(" ", " ");
|
||||||
|
}
|
||||||
|
while (prev != line);
|
||||||
|
// The header name, frame, and message are separated by whitespace.
|
||||||
|
int first = line.IndexOf(' ');
|
||||||
|
int second = line.IndexOf(' ', first + 1);
|
||||||
|
if (first != -1 && second != -1)
|
||||||
|
{
|
||||||
|
// Concatenate the frame and message with default values for the additional fields.
|
||||||
|
string frame = line.Substring(first + 1, second - first - 1);
|
||||||
|
string message = line.Substring(second + 1).Trim();
|
||||||
|
m.Subtitles.AddSubtitle("subtitle " + frame + " 0 0 200 FFFFFFFF " + message);
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
// Import a text-based movie format. This works for .FM2 and .MC2.
|
// Import a text-based movie format. This works for .FM2 and .MC2.
|
||||||
private static Movie ImportText(string path, out string errorMsg, out string warningMsg)
|
private static Movie ImportText(string path, out string errorMsg, out string warningMsg)
|
||||||
{
|
{
|
||||||
|
@ -93,30 +199,20 @@ namespace BizHawk.MultiClient
|
||||||
Movie m = new Movie(path + "." + Global.Config.MovieExtension, MOVIEMODE.PLAY);
|
Movie m = new Movie(path + "." + Global.Config.MovieExtension, MOVIEMODE.PLAY);
|
||||||
FileInfo file = new FileInfo(path);
|
FileInfo file = new FileInfo(path);
|
||||||
StreamReader sr = file.OpenText();
|
StreamReader sr = file.OpenText();
|
||||||
string[] buttons = new string[] { };
|
|
||||||
string controller = "";
|
|
||||||
string emulator = "";
|
string emulator = "";
|
||||||
string platform = "";
|
string platform = "";
|
||||||
switch (Path.GetExtension(path).ToUpper())
|
switch (Path.GetExtension(path).ToUpper())
|
||||||
{
|
{
|
||||||
case ".FM2":
|
case ".FM2":
|
||||||
buttons = new string[8] { "Right", "Left", "Down", "Up", "Start", "Select", "B", "A" };
|
|
||||||
controller = "NES Controller";
|
|
||||||
emulator = "FCEUX";
|
emulator = "FCEUX";
|
||||||
platform = "NES";
|
platform = "NES";
|
||||||
break;
|
break;
|
||||||
case ".MC2":
|
case ".MC2":
|
||||||
buttons = new string[8] { "Up", "Down", "Left", "Right", "B1", "B2", "Run", "Select" };
|
|
||||||
controller = "PC Engine Controller";
|
|
||||||
emulator = "Mednafen/PCEjin";
|
emulator = "Mednafen/PCEjin";
|
||||||
platform = "PCE";
|
platform = "PCE";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
m.Header.SetHeaderLine(MovieHeader.PLATFORM, platform);
|
m.Header.SetHeaderLine(MovieHeader.PLATFORM, platform);
|
||||||
SimpleController controllers = new SimpleController();
|
|
||||||
controllers.Type = new ControllerDefinition();
|
|
||||||
controllers.Type.Name = controller;
|
|
||||||
MnemonicsGenerator mg = new MnemonicsGenerator();
|
|
||||||
int lineNum = 0;
|
int lineNum = 0;
|
||||||
string line = "";
|
string line = "";
|
||||||
while ((line = sr.ReadLine()) != null)
|
while ((line = sr.ReadLine()) != null)
|
||||||
|
@ -124,7 +220,11 @@ namespace BizHawk.MultiClient
|
||||||
lineNum++;
|
lineNum++;
|
||||||
if (line == "")
|
if (line == "")
|
||||||
continue;
|
continue;
|
||||||
if (line.ToLower().StartsWith("emuversion"))
|
else if (line[0] == '|')
|
||||||
|
m = ImportTextFrame(line, lineNum, m, path, ref warningMsg);
|
||||||
|
else if (line.ToLower().StartsWith("sub"))
|
||||||
|
m = ImportTextSubtitle(line, m);
|
||||||
|
else if (line.ToLower().StartsWith("emuversion"))
|
||||||
m.Header.Comments.Add(EMULATIONORIGIN + " " + emulator + " version " + ParseHeader(line, "emuVersion"));
|
m.Header.Comments.Add(EMULATIONORIGIN + " " + emulator + " version " + ParseHeader(line, "emuVersion"));
|
||||||
else if (line.ToLower().StartsWith("version"))
|
else if (line.ToLower().StartsWith("version"))
|
||||||
{
|
{
|
||||||
|
@ -132,7 +232,7 @@ namespace BizHawk.MultiClient
|
||||||
m.Header.Comments.Add(
|
m.Header.Comments.Add(
|
||||||
MOVIEORIGIN + " " + Path.GetExtension(path) + " version " + version
|
MOVIEORIGIN + " " + Path.GetExtension(path) + " version " + version
|
||||||
);
|
);
|
||||||
if (platform == "NES" && version != "3")
|
if (Path.GetExtension(path).ToUpper() == ".FM2" && version != "3")
|
||||||
{
|
{
|
||||||
errorMsg = ".FM2 movie version must always be 3.";
|
errorMsg = ".FM2 movie version must always be 3.";
|
||||||
sr.Close();
|
sr.Close();
|
||||||
|
@ -188,89 +288,6 @@ namespace BizHawk.MultiClient
|
||||||
bool fourscore = (ParseHeader(line, "fourscore") == "1");
|
bool fourscore = (ParseHeader(line, "fourscore") == "1");
|
||||||
m.Header.SetHeaderLine(MovieHeader.FOURSCORE, fourscore.ToString());
|
m.Header.SetHeaderLine(MovieHeader.FOURSCORE, fourscore.ToString());
|
||||||
}
|
}
|
||||||
else if (line.ToLower().StartsWith("sub"))
|
|
||||||
{
|
|
||||||
Subtitle s = new Subtitle();
|
|
||||||
// Reduce all whitespace to single spaces.
|
|
||||||
line = line.Replace("\t", " ");
|
|
||||||
line = line.Replace("\n", " ");
|
|
||||||
line = line.Replace("\r", " ");
|
|
||||||
line = line.Replace("\r\n", " ");
|
|
||||||
string prev;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
prev = line;
|
|
||||||
line = line.Replace(" ", " ");
|
|
||||||
}
|
|
||||||
while (prev != line);
|
|
||||||
// The header name, frame, and message are separated by whitespace.
|
|
||||||
int first = line.IndexOf(' ');
|
|
||||||
int second = line.IndexOf(' ', first + 1);
|
|
||||||
if (first != -1 && second != -1)
|
|
||||||
{
|
|
||||||
// Concatenate the frame and message with default values for the additional fields.
|
|
||||||
string frame = line.Substring(first + 1, second - first - 1);
|
|
||||||
string message = line.Substring(second + 1).Trim();
|
|
||||||
m.Subtitles.AddSubtitle("subtitle " + frame + " 0 0 200 FFFFFFFF " + message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (line[0] == '|')
|
|
||||||
{
|
|
||||||
// Split up the sections of the frame.
|
|
||||||
string[] sections = line.Split('|');
|
|
||||||
if (Path.GetExtension(path).ToUpper() == ".FM2" && sections[1].Length != 0)
|
|
||||||
{
|
|
||||||
controllers["Reset"] = (sections[1][0] == '1');
|
|
||||||
// Get the first invalid command warning message that arises.
|
|
||||||
if (warningMsg == "")
|
|
||||||
{
|
|
||||||
switch (sections[1][0])
|
|
||||||
{
|
|
||||||
case '0':
|
|
||||||
break;
|
|
||||||
case '1':
|
|
||||||
break;
|
|
||||||
case '2':
|
|
||||||
if (m.LogLength() != 0)
|
|
||||||
warningMsg = "hard reset";
|
|
||||||
break;
|
|
||||||
case '4':
|
|
||||||
warningMsg = "FDS Insert";
|
|
||||||
break;
|
|
||||||
case '8':
|
|
||||||
warningMsg = "FDS Select Side";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
warningMsg = "unknown";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (warningMsg != "")
|
|
||||||
warningMsg = "Unable to import " + warningMsg + " command on line " + lineNum + ".";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
Skip the first two sections of the split, which consist of everything before the starting | and the
|
|
||||||
command. Do not use the section after the last |. In other words, get the sections for the players.
|
|
||||||
*/
|
|
||||||
for (int section = 2; section < sections.Length - 1; section++)
|
|
||||||
{
|
|
||||||
// The player number is one less than the section number for the reasons explained above.
|
|
||||||
int player = section - 1;
|
|
||||||
// Only count lines with that have the right number of buttons and are for valid players.
|
|
||||||
if (
|
|
||||||
sections[section].Length == buttons.Length &&
|
|
||||||
player <= Global.PLAYERS[controllers.Type.Name]
|
|
||||||
)
|
|
||||||
for (int button = 0; button < buttons.Length; button++)
|
|
||||||
// Consider the button pressed so long as its spot is not occupied by a ".".
|
|
||||||
controllers["P" + (player).ToString() + " " + buttons[button]] = (
|
|
||||||
sections[section][button] != '.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// Convert the data for the controllers to a mnemonic and add it as a frame.
|
|
||||||
mg.SetSource(controllers);
|
|
||||||
m.AppendFrame(mg.GetControllersAsMnemonic());
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
// Everything not explicitly defined is treated as a comment.
|
// Everything not explicitly defined is treated as a comment.
|
||||||
m.Header.Comments.Add(line);
|
m.Header.Comments.Add(line);
|
||||||
|
|
Loading…
Reference in New Issue