using System; using Questionable.Controller.Steps.Common; using Questionable.Functions; using Questionable.Model; using Questionable.Model.Questing; namespace Questionable.Controller.Steps.Interactions; internal static class StatusOff { internal sealed class Factory : SimpleTaskFactory { public override ITask? CreateTask(Quest quest, QuestSequence sequence, QuestStep step) { if (step.InteractionType != EInteractionType.StatusOff) { return null; } ArgumentNullException.ThrowIfNull(step.Status, "step.Status"); return new Task(step.Status.Value); } } internal sealed record Task(EStatus Status) : ITask { public bool ShouldRedoOnInterrupt() { return true; } public override string ToString() { return $"StatusOff({Status})"; } } internal sealed class DoStatusOff(GameFunctions gameFunctions) : AbstractDelayedTaskExecutor() { protected override bool StartInternal() { if (gameFunctions.HasStatus(base.Task.Status)) { return GameFunctions.RemoveStatus(base.Task.Status); } return false; } public override ETaskResult Update() { if (!gameFunctions.HasStatus(base.Task.Status)) { return ETaskResult.TaskComplete; } return ETaskResult.StillRunning; } public override bool ShouldInterruptOnDamage() { return false; } } }