diff --git a/MultiversalDiplomacy/Script/GameScriptHandler.cs b/MultiversalDiplomacy/Script/GameScriptHandler.cs index 7db394c..79c86fc 100644 --- a/MultiversalDiplomacy/Script/GameScriptHandler.cs +++ b/MultiversalDiplomacy/Script/GameScriptHandler.cs @@ -1,10 +1,13 @@ +using System.Text.RegularExpressions; + using MultiversalDiplomacy.Model; +using MultiversalDiplomacy.Orders; namespace MultiversalDiplomacy.Script; public class GameScriptHandler(World world, bool strict = false) : IScriptHandler { - public string Prompt => "game> "; + public string Prompt => "orders> "; public World World { get; private set; } = world; @@ -22,7 +25,7 @@ public class GameScriptHandler(World world, bool strict = false) : IScriptHandle return this; } - // --- submits the orders for validation to allow for assertions about it + // "---" submits the orders for validation to allow for assertions about it if (input == "---") { // TODO submit orders // TODO return a new handler that handles asserts @@ -34,10 +37,41 @@ public class GameScriptHandler(World world, bool strict = false) : IScriptHandle return this; } - // TODO parse order, including "{power} {order}" for one-offs + if (TryParseOrder(input, out Order? order)) { + Console.WriteLine($"Parsed order \"{input}\" but doing anything with it isn't implemented yet"); + } else if (Strict) { + return null; + } Console.WriteLine($"{CurrentPower}: {input}"); return this; } + + private bool TryParseOrder(string input, out Order? order) { + order = null; + OrderRegex re = new(World); + Match match; + if ((match = re.Hold.Match(input)).Success) { + var hold = OrderRegex.ParseHold(match); + string power = hold.power.Length > 0 ? hold.power : CurrentPower ?? hold.power; + Unit unit = World.Units.First(unit + => World.Map.GetLocation(unit.Location).ProvinceName == hold.province + && unit.Season.Timeline == (hold.timeline.Length > 0 ? hold.timeline : "a") + && unit.Season.Turn.ToString() == (hold.turn.Length > 0 ? hold.turn : "0")); + order = new HoldOrder(power, unit); + return true; + } else if ((match = re.Move.Match(input)).Success) { + var move = OrderRegex.ParseMove(match); + Unit unit = World.Units.First(unit + => World.Map.GetLocation(unit.Location).ProvinceName == move.province + && unit.Season.Timeline == (move.timeline.Length > 0 ? move.timeline : "a") + && unit.Season.Turn.ToString() == (move.turn.Length > 0 ? move.turn : "0")); + order = new MoveOrder(move.power, unit, Season.First, "l"); + return true; + } + + Console.WriteLine($"Failed to parse \"{input}\""); + return false; + } }