using RobotAndDonkey.Game.Execution.Results; using RobotAndDonkey.Game.GameState; using RobotAndDonkey.Game.Intents; namespace RobotAndDonkey.Game.Modifiers; public abstract record Modifier(EModifierKind Kind, EModifierId Id, EModifierDuration Duration) { public Modifier DeepClone() { var result = CreateInstance(); foreach (var debuffSource in DebuffSources) result.DebuffSources.Add(debuffSource); return result; } protected abstract Modifier CreateInstance(); public virtual void OnAdded(Entity owner, List newIntents) { } public virtual void Before(Guid requestId, ReadOnlySpan intents, CoreLoop coreLoop, Entity owner, List newIntents, List results) { } public virtual void After(Guid requestId, ReadOnlySpan intents, CoreLoop coreLoop, Entity owner, List newIntents, List results) { } public virtual void OnRemoved(Entity owner, List newIntents) { } public override string ToString() { return "<" + $"{Id}, {Duration}" + (DebuffSources.Count > 0 ? ", debuffed" : "") + ">"; } public HashSet DebuffSources { get; } = []; public abstract string ToolTip { get; } }