5dplomacy/MultiversalDiplomacy/Script/SetupScriptHandler.cs

101 lines
3.3 KiB
C#
Raw Normal View History

using MultiversalDiplomacy.Adjudicate;
2024-08-16 22:52:13 +00:00
using MultiversalDiplomacy.Model;
namespace MultiversalDiplomacy.Script;
/// <summary>
/// A script handler for modifying a game before it begins.
/// </summary>
public class SetupScriptHandler(
Action<string> WriteLine,
World world,
IPhaseAdjudicator adjudicator,
bool strict = false)
: IScriptHandler
2024-08-16 22:52:13 +00:00
{
public string Prompt => "setup> ";
2024-08-16 22:52:13 +00:00
public World World { get; private set; } = world;
2024-08-18 03:01:50 +00:00
/// <summary>
/// Whether unsuccessful commands should terminate the script.
/// </summary>
public bool Strict { get; } = strict;
2024-08-16 22:52:13 +00:00
public IScriptHandler? HandleInput(string input)
{
var args = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
2024-08-21 16:47:13 +00:00
if (args.Length == 0 || input.StartsWith('#'))
2024-08-16 22:52:13 +00:00
{
return this;
}
var command = args[0];
switch (command)
{
case "help":
case "?":
2024-08-28 21:10:41 +00:00
WriteLine("commands:");
WriteLine(" begin: complete setup and start the game (alias: ---)");
WriteLine(" list <type>: list things in a game category");
WriteLine(" option <name> <value>: set a game option");
WriteLine(" unit <power> <type> <province> [location]: add a unit to the game");
WriteLine(" <province> may be \"province/location\"");
2024-08-16 22:52:13 +00:00
break;
case "begin":
2024-08-18 04:24:59 +00:00
case "---":
2024-08-28 21:10:41 +00:00
WriteLine("Starting game");
WriteLine("Ready for orders");
return new GameScriptHandler(WriteLine, World, adjudicator, Strict);
2024-08-16 22:52:13 +00:00
case "list" when args.Length == 1:
2024-08-28 21:10:41 +00:00
WriteLine("usage:");
WriteLine(" list powers: the powers in the game");
WriteLine(" list units: units created so far");
2024-08-16 22:52:13 +00:00
break;
case "list" when args[1] == "powers":
2024-08-28 21:10:41 +00:00
WriteLine("Powers:");
2024-08-16 22:52:13 +00:00
foreach (string powerName in World.Powers)
{
2024-08-28 21:10:41 +00:00
WriteLine($" {powerName}");
2024-08-16 22:52:13 +00:00
}
break;
case "list" when args[1] == "units":
2024-08-28 21:10:41 +00:00
WriteLine("Units:");
2024-08-16 22:52:13 +00:00
foreach (Unit unit in World.Units)
{
2024-08-28 21:10:41 +00:00
WriteLine($" {unit}");
2024-08-16 22:52:13 +00:00
}
break;
case "option" when args.Length < 3:
throw new NotImplementedException("There are no supported options yet");
2024-08-16 22:52:13 +00:00
case "unit" when args.Length < 2:
2024-08-28 21:10:41 +00:00
WriteLine("usage: unit [power] [type] [province]</location>");
2024-08-16 22:52:13 +00:00
break;
case "unit":
string unitSpec = input["unit ".Length..];
2024-08-27 03:23:28 +00:00
if (OrderParser.TryParseUnit(World, unitSpec, out Unit? newUnit)) {
2024-08-16 22:52:13 +00:00
World = World.Update(units: World.Units.Append(newUnit));
2024-08-28 21:10:41 +00:00
WriteLine($"Created {newUnit}");
2024-08-25 04:26:10 +00:00
return this;
2024-08-16 22:52:13 +00:00
}
2024-08-28 21:10:41 +00:00
WriteLine($"Could not match unit spec \"{unitSpec}\"");
2024-08-25 04:26:10 +00:00
if (Strict) return null;
2024-08-16 22:52:13 +00:00
break;
default:
2024-08-28 21:10:41 +00:00
WriteLine($"Unrecognized command: \"{command}\"");
2024-08-18 03:01:50 +00:00
if (Strict) return null;
2024-08-16 22:52:13 +00:00
break;
}
return this;
}
}