using MultiversalDiplomacy.Adjudicate; using MultiversalDiplomacy.Model; namespace MultiversalDiplomacy.Script; /// /// A script handler for modifying a game before it begins. /// public class SetupScriptHandler( Action WriteLine, World world, IPhaseAdjudicator adjudicator) : IScriptHandler { public string Prompt => "setup> "; public World World { get; private set; } = world; public ScriptResult HandleInput(string input) { var args = input.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (args.Length == 0 || input.StartsWith('#')) { return ScriptResult.Succeed(this); } var command = args[0]; switch (command) { case "help": case "?": WriteLine("commands:"); WriteLine(" begin: complete setup and start the game (alias: ---)"); WriteLine(" list : list things in a game category"); WriteLine(" option : set a game option"); WriteLine(" unit [location]: add a unit to the game"); WriteLine(" may be \"province/location\""); break; case "begin": case "---": WriteLine("Starting game"); WriteLine("Ready for orders"); return ScriptResult.Succeed(new GameScriptHandler(WriteLine, World, adjudicator)); case "list" when args.Length == 1: WriteLine("usage:"); WriteLine(" list powers: the powers in the game"); WriteLine(" list units: units created so far"); break; case "list" when args[1] == "powers": WriteLine("Powers:"); foreach (string powerName in World.Powers) { WriteLine($" {powerName}"); } break; case "list" when args[1] == "units": WriteLine("Units:"); foreach (Unit unit in World.Units) { WriteLine($" {unit}"); } break; case "option" when args.Length < 3: throw new NotImplementedException("There are no supported options yet"); case "unit" when args.Length < 2: WriteLine("usage: unit [power] [type] [province]"); break; case "unit": string unitSpec = input["unit ".Length..]; if (OrderParser.TryParseUnit(World, unitSpec, out Unit? newUnit)) { World = World.Update(units: World.Units.Append(newUnit)); WriteLine($"Created {newUnit}"); return ScriptResult.Succeed(this); } return ScriptResult.Fail($"Could not match unit spec \"{unitSpec}\"", this); default: ScriptResult.Fail($"Unrecognized command: \"{command}\"", this); break; } return ScriptResult.Succeed(this); } }