namespace CMSGame { public class Goal where TContext : IGoalContext { public string Name = string.Empty; public int BasePriority; public List> ValidityModifiers = new(); public List> PriorityModifiers = new(); public bool IsValid() { return ValidityModifiers.All(modifier => modifier.Execute()); } public int Priority() { return BasePriority + PriorityModifiers.Sum(modifier => modifier.Execute()); } } public interface IGoalContext { IList ListActions(); } public abstract class GoalModifier { public string Name = string.Empty; public TContext Context; protected GoalModifier(TContext context) { Context = context; } } public abstract class GoalValidityModifier : GoalModifier { protected GoalValidityModifier(TContext context) : base(context) { } public abstract bool Execute(); } public abstract class GoalPriorityModifier : GoalModifier { protected GoalPriorityModifier(TContext context) : base(context) { } public abstract int Execute(); } }