using RobotAndDonkey.Game.Board; using RobotAndDonkey.Game.Cards; using RobotAndDonkey.Game.Data; using RobotAndDonkey.Game.Execution; using RobotAndDonkey.Game.Execution.Results; using RobotAndDonkey.Game.GameState; using RobotAndDonkey.Game.Intents; namespace RobotAndDonkey.Game.Modifiers; public record UnreliableCardModifier(EModifierDuration Duration) : UnreliableModifierBase(EModifierKind.Card, Duration) { protected override UnreliableCardModifier CreateInstance() => new(Duration); public override string ToolTip => $"Has a {Balancing.Instance.UnreliableChance * 100:N0}% chance of doing nothing"; } public record UnreliableCellModifier(EModifierDuration Duration) : UnreliableModifierBase(EModifierKind.Cell, Duration) { protected override UnreliableCellModifier CreateInstance() => new(Duration); public override string ToolTip => $"While in this area, instructions have a {Balancing.Instance.UnreliableChance * 100:N0}% chance of doing nothing"; } public abstract record UnreliableModifierBase(EModifierKind Kind, EModifierDuration Duration) : Modifier(Kind, EModifierId.Unreliable, Duration) { public override void Before(Guid requestId, ReadOnlySpan intents, CoreLoop coreLoop, Entity owner, List newIntents, List results) { if (coreLoop.RunPhase != ERunPhase.ExecuteProgram) return; if (coreLoop.Random.NextSingle() <= Balancing.Instance.UnreliableChance) { if (owner is Card card) results.Add(new ModifyCardResult(requestId, card.DeepClone(), EModifierId.Unreliable, ECardLocation.Tape)); if (owner is Cell cell) results.Add(new ModifyCellResult(requestId, new(coreLoop.Board), EModifierId.Unreliable, cell.Hex)); foreach (var intent in intents) intent.DebuffSources.Add(this); } } public override void After(Guid requestId, ReadOnlySpan intents, CoreLoop coreLoop, Entity owner, List newIntents, List results) { foreach (var intent in intents) intent.DebuffSources.Remove(this); } }