Add adjudicate command and implement AdjudicateOrders
This commit is contained in:
parent
c5bd74ae1e
commit
fa04aab6c6
|
@ -8,6 +8,18 @@ namespace MultiversalDiplomacy.Adjudicate;
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IPhaseAdjudicator
|
public interface IPhaseAdjudicator
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Given a list of order sets, determine which entries are comprehensible as orders.
|
||||||
|
/// An order set entry may comprehensible as an order but not valid for the current
|
||||||
|
/// phase; these orders will be rejected by <see cref="ValidateOrders"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="world">The global game state.</param>
|
||||||
|
/// <param name="orderSets">The order sets to adjudicate.</param>
|
||||||
|
/// <returns>
|
||||||
|
/// A list of <see cref="Order"/> objects representing the orders parsed.
|
||||||
|
/// </returns>
|
||||||
|
public List<Order> ParseOrderSets(World world, List<OrderSet> orderSets);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Given a list of orders, determine which orders are valid for this adjudicator and
|
/// Given a list of orders, determine which orders are valid for this adjudicator and
|
||||||
/// which should be rejected before adjudication. Adjudication should be performed on
|
/// which should be rejected before adjudication. Adjudication should be performed on
|
||||||
|
|
|
@ -19,6 +19,11 @@ public class MovementPhaseAdjudicator : IPhaseAdjudicator
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Order> ParseOrderSets(World world, List<OrderSet> orderSets)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
public List<OrderValidation> ValidateOrders(World world, List<Order> orders)
|
public List<OrderValidation> ValidateOrders(World world, List<Order> orders)
|
||||||
{
|
{
|
||||||
// The basic workflow of this function will be to look for invalid orders, remove these
|
// The basic workflow of this function will be to look for invalid orders, remove these
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
|
using MultiversalDiplomacy.Adjudicate;
|
||||||
using MultiversalDiplomacy.Model;
|
using MultiversalDiplomacy.Model;
|
||||||
|
using MultiversalDiplomacy.Orders;
|
||||||
|
|
||||||
namespace MultiversalDiplomacy;
|
namespace MultiversalDiplomacy;
|
||||||
|
|
||||||
|
@ -21,9 +23,28 @@ public static class GameController
|
||||||
|
|
||||||
public static World AdjudicateOrders(World world)
|
public static World AdjudicateOrders(World world)
|
||||||
{
|
{
|
||||||
// TODO: Parse the order sets into orders
|
// Determine which phase the game is in, which determines how orders should be interpreted and adjudicated.
|
||||||
// TODO: Execute the correct adjudicator for the current world state
|
PhaseType phaseType = world.GetNextPhaseType();
|
||||||
// TODO: Update the world
|
|
||||||
return world;
|
IPhaseAdjudicator adjudicator = phaseType switch {
|
||||||
|
PhaseType.Movement => MovementPhaseAdjudicator.Instance,
|
||||||
|
PhaseType.Retreat => throw new NotImplementedException(),
|
||||||
|
PhaseType.Build => throw new NotImplementedException(),
|
||||||
|
PhaseType.Sustain => throw new NotImplementedException(),
|
||||||
|
_ => throw new InvalidOperationException(phaseType.ToString()),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Parse the order sets into actual orders.
|
||||||
|
List<Order> parsedOrders = adjudicator.ParseOrderSets(world, world.OrderSets.ToList());
|
||||||
|
|
||||||
|
// Validate the orders.
|
||||||
|
var orderValidations = adjudicator.ValidateOrders(world, parsedOrders);
|
||||||
|
|
||||||
|
// Adjudicate the orders.
|
||||||
|
var validOrders = orderValidations.Where(v => v.Valid).Select(v => v.Order).ToList();
|
||||||
|
var results = adjudicator.AdjudicateOrders(world, validOrders);
|
||||||
|
|
||||||
|
// Update the world.
|
||||||
|
return adjudicator.UpdateWorld(world, results);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
namespace MultiversalDiplomacy.Model;
|
||||||
|
|
||||||
|
public enum PhaseType
|
||||||
|
{
|
||||||
|
Movement = 1,
|
||||||
|
Retreat = 2,
|
||||||
|
Build = 3,
|
||||||
|
Sustain = 4,
|
||||||
|
}
|
|
@ -309,6 +309,17 @@ public class World
|
||||||
return foundUnit;
|
return foundUnit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PhaseType GetNextPhaseType()
|
||||||
|
{
|
||||||
|
// TODO: Figure how to order build and sustain phases in a staggered multiverse
|
||||||
|
if (RetreatingUnits.Any())
|
||||||
|
{
|
||||||
|
return PhaseType.Retreat;
|
||||||
|
}
|
||||||
|
|
||||||
|
return PhaseType.Movement;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The standard Diplomacy provinces.
|
/// The standard Diplomacy provinces.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -30,11 +30,16 @@ public class GameScriptHandler : IScriptHandler
|
||||||
case "help":
|
case "help":
|
||||||
case "?":
|
case "?":
|
||||||
Console.WriteLine("commands:");
|
Console.WriteLine("commands:");
|
||||||
|
Console.WriteLine(" adjudicate: adjudicate the current orders");
|
||||||
Console.WriteLine(" list: list things in a game category");
|
Console.WriteLine(" list: list things in a game category");
|
||||||
Console.WriteLine(" orders: submit order sets");
|
Console.WriteLine(" orders: submit order sets");
|
||||||
Console.WriteLine(" status: overview of the state of the game");
|
Console.WriteLine(" status: overview of the state of the game");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "adjudicate":
|
||||||
|
World = GameController.AdjudicateOrders(World);
|
||||||
|
break;
|
||||||
|
|
||||||
case "list" when args.Length == 1:
|
case "list" when args.Length == 1:
|
||||||
Console.WriteLine("usage:");
|
Console.WriteLine("usage:");
|
||||||
Console.WriteLine(" list ordersets: unadjudicated order sets");
|
Console.WriteLine(" list ordersets: unadjudicated order sets");
|
||||||
|
|
Loading…
Reference in New Issue