using System; using System.Collections.Generic; using System.Linq; using RobotAndDonkey.Game.Cards; using RobotAndDonkey.Game.Execution.Results; using RobotAndDonkey.Game.GameState; using RobotAndDonkey.Game.Modifiers; namespace RobotAndDonkey.Game.Intents; public class ModifyCard(Card card, EModifierId modifierId, EModifierDuration duration, ECardLocation location) : CardIntent(card) { public override void Run(Guid requestId, CoreLoop coreLoop, List newIntents, List results) { Card.AddModifier(Create(ModifierId, Duration), newIntents); results.Add(new ModifyCardResult(requestId, Card.DeepClone(), ModifierId, location)); base.Run(requestId, coreLoop, newIntents, results); } public override bool IsValid(CoreLoop coreLoop) { return base.IsValid(coreLoop) && ModifierId is EModifierId.Corrupt or EModifierId.Unreliable or EModifierId.RaceCondition or EModifierId.Throttled or EModifierId.Effective or EModifierId.Optimized or EModifierId.Efficient or EModifierId.Persistent && Card.Modifiers.All(m => m.Id != ModifierId); } public static Modifier Create(EModifierId id, EModifierDuration duration) { return id switch { EModifierId.Corrupt => new CorruptCardModifier(duration), EModifierId.Unreliable => new UnreliableCardModifier(duration), EModifierId.RaceCondition => new RaceConditionModifier(duration), EModifierId.Throttled => new ThrottledModifier(duration), EModifierId.Effective => new EffectiveModifier(duration), EModifierId.Optimized => new OptimizedModifier(duration), EModifierId.Efficient => new EfficientModifier(duration), EModifierId.Persistent => new PersistentModifier(duration), _ => throw new ArgumentOutOfRangeException() }; } public EModifierId ModifierId { get; set;} = modifierId; public EModifierDuration Duration { get; set;} = duration; public override string ToString() => $"Modify {Card.Name} with {ModifierId}, {Duration}, " + base.ToString(); }