private NPCSegment ParseSegment(NPCPage page, IEnumerable<string> scriptLines)
{
List<string>
checks = new List<string>(),
acts = new List<string>(),
say = new List<string>(),
buttons = new List<string>(),
elseSay = new List<string>(),
elseActs = new List<string>(),
elseButtons = new List<string>(),
gotoButtons = new List<string>();
List<string> lines = scriptLines.ToList();
List<string> currentSay = say, currentButtons = buttons;
Regex regex = new Regex(@"<.*?/(\@.*?)>");
for (int i = 0; i < lines.Count; i++)
{
if (string.IsNullOrEmpty(lines[i])) continue;
if (lines[i].StartsWith(";")) continue;
if (lines[i].StartsWith("#"))
{
string[] action = lines[i].Remove(0, 1).ToUpper().Trim().Split(' ');
switch (action[0])
{
case "IF":
currentSay = checks;
currentButtons = null;
continue;
case "SAY":
currentSay = say;
currentButtons = buttons;
continue;
case "ACT":
currentSay = acts;
currentButtons = gotoButtons;
continue;
case "ELSESAY":
currentSay = elseSay;
currentButtons = elseButtons;
continue;
case "ELSEACT":
currentSay = elseActs;
currentButtons = gotoButtons;
continue;
default:
throw new NotImplementedException();
}
}
if (lines[i].StartsWith("[") && lines[i].EndsWith("]")) break;
if (currentButtons != null)
{
Match match = regex.Match(lines[i]);
while (match.Success)
{
string argu = match.Groups[1].Captures[0].Value;
currentButtons.Add(string.Format("[{0}]", argu));
match = match.NextMatch();
}
//Check if line has a goto command
var parts = lines[i].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Count() > 1)
switch (parts[0].ToUpper())
{
case "GOTO":
case "GROUPGOTO":
gotoButtons.Add(string.Format("[{0}]", parts[1].ToUpper()));
break;
case "TIMERECALL":
case "DELAYGOTO":
case "TIMERECALLGROUP":
if (parts.Length > 2)
gotoButtons.Add(string.Format("[{0}]", parts[2].ToUpper()));
break;
case "ROLLDIE":
case "ROLLYUT":
buttons.Add(string.Format("[{0}]", parts[1].ToUpper()));
break;
}
}
currentSay.Add(lines[i].TrimEnd());
}
NPCSegment segment = new NPCSegment(page, say, buttons, elseSay, elseButtons, gotoButtons);
for (int i = 0; i < checks.Count; i++)
segment.ParseCheck(checks[i]);
for (int i = 0; i < acts.Count; i++)
segment.ParseAct(segment.ActList, acts[i]);
for (int i = 0; i < elseActs.Count; i++)
segment.ParseAct(segment.ElseActList, elseActs[i]);
currentButtons = new List<string>();
currentButtons.AddRange(buttons);
currentButtons.AddRange(elseButtons);
currentButtons.AddRange(gotoButtons);
return segment;
}