Add EnemySpawnType - AfterAction
authorLiza Carvelli <liza@carvel.li>
Sun, 1 Sep 2024 12:21:26 +0000 (14:21 +0200)
committerLiza Carvelli <liza@carvel.li>
Sun, 1 Sep 2024 12:21:26 +0000 (14:21 +0200)
QuestPaths/quest-v1.json
Questionable.Model/Questing/Converter/EnemySpawnTypeConverter.cs
Questionable.Model/Questing/EEnemySpawnType.cs
Questionable/Controller/Steps/Interactions/Action.cs
Questionable/Controller/Steps/Interactions/Combat.cs

index c7ebd5fa57afc509cbb2ce51068dafd1b7e6c8c9..69b6c8548c3efd9bcebf165acdb539c929a33ba3 100644 (file)
                   "AutoOnEnterArea",
                   "AfterInteraction",
                   "AfterItemUse",
+                  "AfterAction",
                   "OverworldEnemies"
                 ]
               },
index e97faa4f7b98c0bb13eeef0007bd6f24db0e85ba..d37c5b7c270550dd8b259d1d27b14983110ab7cd 100644 (file)
@@ -9,6 +9,7 @@ public sealed class EnemySpawnTypeConverter() : EnumConverter<EEnemySpawnType>(V
     {
         { EEnemySpawnType.AfterInteraction, "AfterInteraction" },
         { EEnemySpawnType.AfterItemUse, "AfterItemUse" },
+        { EEnemySpawnType.AfterAction, "AfterAction" },
         { EEnemySpawnType.AutoOnEnterArea, "AutoOnEnterArea" },
         { EEnemySpawnType.OverworldEnemies, "OverworldEnemies" },
     };
index 3c42b9f4f077f34a4033c666fb870e9f8efc6ebd..f119ea08a368298539461ecc7545bad81d95d8c7 100644 (file)
@@ -9,6 +9,7 @@ public enum EEnemySpawnType
     None = 0,
     AfterInteraction,
     AfterItemUse,
+    AfterAction,
     AutoOnEnterArea,
     OverworldEnemies,
 }
index a91983b3166c24cfc793f49d46603c2b952cb9fb..6d4da220642e0c82cd9e818b28f8c366a02ee33d 100644 (file)
@@ -24,13 +24,18 @@ internal static class Action
 
             ArgumentNullException.ThrowIfNull(step.Action);
 
-            var task = new UseOnObject(step.DataId, step.Action.Value, gameFunctions,
-                loggerFactory.CreateLogger<UseOnObject>());
+            var task = OnObject(step.DataId, step.Action.Value);
             if (step.Action.Value.RequiresMount())
                 return [task];
             else
                 return [mountFactory.Unmount(), task];
         }
+
+        public ITask OnObject(uint? dataId, EAction action)
+        {
+            return new UseOnObject(dataId, action, gameFunctions,
+                loggerFactory.CreateLogger<UseOnObject>());
+        }
     }
 
     private sealed class UseOnObject(
index 39909c569f96a7d840c4bb4761f6da6df873741f..6657da338fbe39de533c4f9fbff5fae6f0f13543 100644 (file)
@@ -18,6 +18,7 @@ internal static class Combat
         Interact.Factory interactFactory,
         Mount.Factory mountFactory,
         UseItem.Factory useItemFactory,
+        Action.Factory actionFactory,
         QuestFunctions questFunctions) : ITaskFactory
     {
         public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
@@ -58,6 +59,19 @@ internal static class Combat
                     break;
                 }
 
+                case EEnemySpawnType.AfterAction:
+                {
+                    ArgumentNullException.ThrowIfNull(step.DataId);
+                    ArgumentNullException.ThrowIfNull(step.Action);
+
+                    if (!step.Action.Value.RequiresMount())
+                        yield return mountFactory.Unmount();
+                    yield return actionFactory.OnObject(step.DataId.Value, step.Action.Value);
+                    yield return new WaitAtEnd.WaitDelay(TimeSpan.FromSeconds(1));
+                    yield return CreateTask(quest, sequence, step);
+                    break;
+                } ;
+
                 case EEnemySpawnType.AutoOnEnterArea:
                     if (step.CombatDelaySecondsAtStart == null)
                         yield return new WaitAtEnd.WaitDelay(TimeSpan.FromSeconds(1));