Move decision classes out of the movement adjudicator
This commit is contained in:
parent
d2ec79647a
commit
36ea621782
|
@ -0,0 +1,12 @@
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Base class for adjudication decisions. The decision-based adjudication algorithm is based
|
||||||
|
/// on DATC section 5 and "The Math of Adjudication" by Lucas Kruijswijk, respectively found at
|
||||||
|
/// http://web.inter.nl.net/users/L.B.Kruijswijk/#5 and
|
||||||
|
/// http://uk.diplom.org/pouch/Zine/S2009M/Kruijswijk/DipMath_Chp1.htm
|
||||||
|
/// </summary>
|
||||||
|
public abstract class AdjudicationDecision
|
||||||
|
{
|
||||||
|
public abstract bool Resolved { get; }
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
using MultiversalDiplomacy.Orders;
|
||||||
|
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
public class AttackStrength : NumericAdjudicationDecision
|
||||||
|
{
|
||||||
|
public MoveOrder Order { get; }
|
||||||
|
public List<SupportMoveOrder> Supports { get; }
|
||||||
|
public MoveOrder? OpposingMove { get; }
|
||||||
|
|
||||||
|
public AttackStrength(MoveOrder order, IEnumerable<SupportMoveOrder> supports, MoveOrder? opposingMove = null)
|
||||||
|
{
|
||||||
|
this.Order = order;
|
||||||
|
this.Supports = supports.ToList();
|
||||||
|
this.OpposingMove = opposingMove;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
public abstract class BinaryAdjudicationDecision : AdjudicationDecision
|
||||||
|
{
|
||||||
|
public bool? Outcome { get; private set; } = null;
|
||||||
|
|
||||||
|
public override bool Resolved => this.Outcome != null;
|
||||||
|
|
||||||
|
public bool Update(bool outcome)
|
||||||
|
{
|
||||||
|
if (this.Outcome == null)
|
||||||
|
{
|
||||||
|
this.Outcome = outcome;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (this.Outcome != outcome)
|
||||||
|
{
|
||||||
|
string name = this.GetType().Name;
|
||||||
|
throw new ArgumentException(
|
||||||
|
$"Cannot reverse adjudication of {name} from {this.Outcome} to {outcome}");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
using MultiversalDiplomacy.Orders;
|
||||||
|
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
public class DefendStrength : NumericAdjudicationDecision
|
||||||
|
{
|
||||||
|
public MoveOrder Order { get; }
|
||||||
|
public List<SupportMoveOrder> Supports { get; }
|
||||||
|
|
||||||
|
public DefendStrength(MoveOrder order, IEnumerable<SupportMoveOrder> supports)
|
||||||
|
{
|
||||||
|
this.Order = order;
|
||||||
|
this.Supports = supports.ToList();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
using MultiversalDiplomacy.Orders;
|
||||||
|
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
public class DoesMove : BinaryAdjudicationDecision
|
||||||
|
{
|
||||||
|
public MoveOrder Order { get; }
|
||||||
|
public MoveOrder? OpposingMove { get; }
|
||||||
|
public List<MoveOrder> Competing { get; }
|
||||||
|
|
||||||
|
public DoesMove(MoveOrder order, MoveOrder? opposingMove, IEnumerable<MoveOrder> competing)
|
||||||
|
{
|
||||||
|
this.Order = order;
|
||||||
|
this.OpposingMove = opposingMove;
|
||||||
|
this.Competing = competing.ToList();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
using MultiversalDiplomacy.Orders;
|
||||||
|
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
public class GivesSupport : BinaryAdjudicationDecision
|
||||||
|
{
|
||||||
|
public SupportOrder Order { get; }
|
||||||
|
public List<MoveOrder> Cuts { get; }
|
||||||
|
|
||||||
|
public GivesSupport(SupportOrder order, IEnumerable<MoveOrder> cuts)
|
||||||
|
{
|
||||||
|
this.Order = order;
|
||||||
|
this.Cuts = cuts.ToList();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
using MultiversalDiplomacy.Orders;
|
||||||
|
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
public class HasPath : BinaryAdjudicationDecision
|
||||||
|
{
|
||||||
|
public MoveOrder Order { get; }
|
||||||
|
|
||||||
|
public HasPath(MoveOrder order)
|
||||||
|
{
|
||||||
|
this.Order = order;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
using MultiversalDiplomacy.Model;
|
||||||
|
using MultiversalDiplomacy.Orders;
|
||||||
|
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
public class HoldStrength : NumericAdjudicationDecision
|
||||||
|
{
|
||||||
|
public Province Province { get; }
|
||||||
|
public UnitOrder? Order { get; }
|
||||||
|
public List<SupportHoldOrder> Supports { get; }
|
||||||
|
|
||||||
|
public HoldStrength(Province province, UnitOrder? order = null)
|
||||||
|
{
|
||||||
|
this.Province = province;
|
||||||
|
this.Order = order;
|
||||||
|
this.Supports = new();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
using MultiversalDiplomacy.Orders;
|
||||||
|
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
public class IsDislodged : BinaryAdjudicationDecision
|
||||||
|
{
|
||||||
|
public UnitOrder Order { get; }
|
||||||
|
public List<MoveOrder> Incoming { get; }
|
||||||
|
|
||||||
|
public IsDislodged(UnitOrder order, IEnumerable<MoveOrder> incoming)
|
||||||
|
{
|
||||||
|
this.Order = order;
|
||||||
|
this.Incoming = incoming.ToList();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
public abstract class NumericAdjudicationDecision : AdjudicationDecision
|
||||||
|
{
|
||||||
|
public int MinValue { get; private set; } = 0;
|
||||||
|
public int MaxValue { get; private set; } = 99;
|
||||||
|
|
||||||
|
public override bool Resolved => this.MinValue == this.MaxValue;
|
||||||
|
|
||||||
|
public bool Update(int min, int max)
|
||||||
|
{
|
||||||
|
if (min < this.MinValue || max > this.MaxValue)
|
||||||
|
{
|
||||||
|
string name = this.GetType().Name;
|
||||||
|
throw new ArgumentException(
|
||||||
|
$"Cannot reverse adjudication of {name} from ({this.MinValue},{this.MaxValue})"
|
||||||
|
+ $" to ({min},{max})");
|
||||||
|
}
|
||||||
|
bool updated = this.MinValue != min || this.MaxValue != max;
|
||||||
|
this.MinValue = min;
|
||||||
|
this.MaxValue = max;
|
||||||
|
return updated;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
using MultiversalDiplomacy.Orders;
|
||||||
|
|
||||||
|
namespace MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
|
|
||||||
|
public class PreventStrength : NumericAdjudicationDecision
|
||||||
|
{
|
||||||
|
public MoveOrder Order { get; }
|
||||||
|
public List<SupportMoveOrder> Supports { get; }
|
||||||
|
public MoveOrder? OpposingMove { get; }
|
||||||
|
|
||||||
|
public PreventStrength(MoveOrder order, IEnumerable<SupportMoveOrder> supports, MoveOrder? opposingMove = null)
|
||||||
|
{
|
||||||
|
this.Order = order;
|
||||||
|
this.Supports = supports.ToList();
|
||||||
|
this.OpposingMove = opposingMove;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,4 @@
|
||||||
|
using MultiversalDiplomacy.Adjudicate.Decision;
|
||||||
using MultiversalDiplomacy.Model;
|
using MultiversalDiplomacy.Model;
|
||||||
using MultiversalDiplomacy.Orders;
|
using MultiversalDiplomacy.Orders;
|
||||||
|
|
||||||
|
@ -8,165 +9,6 @@ namespace MultiversalDiplomacy.Adjudicate;
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MovementPhaseAdjudicator : IPhaseAdjudicator
|
public class MovementPhaseAdjudicator : IPhaseAdjudicator
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// Base class for adjudication decisions. The decision-based adjudication algorithm is based
|
|
||||||
/// on DATC section 5 and "The Math of Adjudication" by Lucas Kruijswijk, respectively found at
|
|
||||||
/// http://web.inter.nl.net/users/L.B.Kruijswijk/#5 and
|
|
||||||
/// http://uk.diplom.org/pouch/Zine/S2009M/Kruijswijk/DipMath_Chp1.htm
|
|
||||||
/// </summary>
|
|
||||||
private abstract class AdjudicationDecision
|
|
||||||
{
|
|
||||||
public abstract bool Resolved { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private abstract class BinaryAdjudicationDecision : AdjudicationDecision
|
|
||||||
{
|
|
||||||
public bool? Outcome { get; private set; } = null;
|
|
||||||
|
|
||||||
public override bool Resolved => this.Outcome != null;
|
|
||||||
|
|
||||||
public bool Update(bool outcome)
|
|
||||||
{
|
|
||||||
if (this.Outcome == null)
|
|
||||||
{
|
|
||||||
this.Outcome = outcome;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (this.Outcome != outcome)
|
|
||||||
{
|
|
||||||
string name = this.GetType().Name;
|
|
||||||
throw new ArgumentException(
|
|
||||||
$"Cannot reverse adjudication of {name} from {this.Outcome} to {outcome}");
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private abstract class NumericAdjudicationDecision : AdjudicationDecision
|
|
||||||
{
|
|
||||||
public int MinValue { get; private set; } = 0;
|
|
||||||
public int MaxValue { get; private set; } = 99;
|
|
||||||
|
|
||||||
public override bool Resolved => this.MinValue == this.MaxValue;
|
|
||||||
|
|
||||||
public bool Update(int min, int max)
|
|
||||||
{
|
|
||||||
if (min < this.MinValue || max > this.MaxValue)
|
|
||||||
{
|
|
||||||
string name = this.GetType().Name;
|
|
||||||
throw new ArgumentException(
|
|
||||||
$"Cannot reverse adjudication of {name} from ({this.MinValue},{this.MaxValue})"
|
|
||||||
+ $" to ({min},{max})");
|
|
||||||
}
|
|
||||||
bool updated = this.MinValue != min || this.MaxValue != max;
|
|
||||||
this.MinValue = min;
|
|
||||||
this.MaxValue = max;
|
|
||||||
return updated;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class IsDislodged : BinaryAdjudicationDecision
|
|
||||||
{
|
|
||||||
public UnitOrder Order { get; }
|
|
||||||
public List<MoveOrder> Incoming { get; }
|
|
||||||
|
|
||||||
public IsDislodged(UnitOrder order, IEnumerable<MoveOrder> incoming)
|
|
||||||
{
|
|
||||||
this.Order = order;
|
|
||||||
this.Incoming = incoming.ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class HasPath : BinaryAdjudicationDecision
|
|
||||||
{
|
|
||||||
public MoveOrder Order { get; }
|
|
||||||
|
|
||||||
public HasPath(MoveOrder order)
|
|
||||||
{
|
|
||||||
this.Order = order;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class GivesSupport : BinaryAdjudicationDecision
|
|
||||||
{
|
|
||||||
public SupportOrder Order { get; }
|
|
||||||
public List<MoveOrder> Cuts { get; }
|
|
||||||
|
|
||||||
public GivesSupport(SupportOrder order, IEnumerable<MoveOrder> cuts)
|
|
||||||
{
|
|
||||||
this.Order = order;
|
|
||||||
this.Cuts = cuts.ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class HoldStrength : NumericAdjudicationDecision
|
|
||||||
{
|
|
||||||
public Province Province { get; }
|
|
||||||
public UnitOrder? Order { get; }
|
|
||||||
public List<SupportHoldOrder> Supports { get; }
|
|
||||||
|
|
||||||
public HoldStrength(Province province, UnitOrder? order = null)
|
|
||||||
{
|
|
||||||
this.Province = province;
|
|
||||||
this.Order = order;
|
|
||||||
this.Supports = new();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class AttackStrength : NumericAdjudicationDecision
|
|
||||||
{
|
|
||||||
public MoveOrder Order { get; }
|
|
||||||
public List<SupportMoveOrder> Supports { get; }
|
|
||||||
public MoveOrder? OpposingMove { get; }
|
|
||||||
|
|
||||||
public AttackStrength(MoveOrder order, IEnumerable<SupportMoveOrder> supports, MoveOrder? opposingMove = null)
|
|
||||||
{
|
|
||||||
this.Order = order;
|
|
||||||
this.Supports = supports.ToList();
|
|
||||||
this.OpposingMove = opposingMove;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DefendStrength : NumericAdjudicationDecision
|
|
||||||
{
|
|
||||||
public MoveOrder Order { get; }
|
|
||||||
public List<SupportMoveOrder> Supports { get; }
|
|
||||||
|
|
||||||
public DefendStrength(MoveOrder order, IEnumerable<SupportMoveOrder> supports)
|
|
||||||
{
|
|
||||||
this.Order = order;
|
|
||||||
this.Supports = supports.ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class PreventStrength : NumericAdjudicationDecision
|
|
||||||
{
|
|
||||||
public MoveOrder Order { get; }
|
|
||||||
public List<SupportMoveOrder> Supports { get; }
|
|
||||||
public MoveOrder? OpposingMove { get; }
|
|
||||||
|
|
||||||
public PreventStrength(MoveOrder order, IEnumerable<SupportMoveOrder> supports, MoveOrder? opposingMove = null)
|
|
||||||
{
|
|
||||||
this.Order = order;
|
|
||||||
this.Supports = supports.ToList();
|
|
||||||
this.OpposingMove = opposingMove;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DoesMove : BinaryAdjudicationDecision
|
|
||||||
{
|
|
||||||
public MoveOrder Order { get; }
|
|
||||||
public MoveOrder? OpposingMove { get; }
|
|
||||||
public List<MoveOrder> Competing { get; }
|
|
||||||
|
|
||||||
public DoesMove(MoveOrder order, MoveOrder? opposingMove, IEnumerable<MoveOrder> competing)
|
|
||||||
{
|
|
||||||
this.Order = order;
|
|
||||||
this.OpposingMove = opposingMove;
|
|
||||||
this.Competing = competing.ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Decisions
|
private class Decisions
|
||||||
{
|
{
|
||||||
public Dictionary<Unit, IsDislodged> IsDislodged { get; }
|
public Dictionary<Unit, IsDislodged> IsDislodged { get; }
|
||||||
|
|
Loading…
Reference in New Issue