Add quest battle preset
authorLiza Carvelli <liza@carvel.li>
Mon, 24 Feb 2025 16:50:16 +0000 (17:50 +0100)
committerLiza Carvelli <liza@carvel.li>
Mon, 24 Feb 2025 16:50:16 +0000 (17:50 +0100)
13 files changed:
QuestPaths/2.x - A Realm Reborn/Class Quests/NIN/102_My First Dagger.json
QuestPaths/2.x - A Realm Reborn/Class Quests/NIN/104_Stabbers in Yer Fambles.json
QuestPaths/2.x - A Realm Reborn/Class Quests/NIN/110_A Dainty Dilemma.json
QuestPaths/2.x - A Realm Reborn/Class Quests/NIN/126_Stray into the Shadows.json
QuestPaths/5.x - Shadowbringers/MSQ/I-5.3/3775_Faded Memories.json
QuestPaths/5.x - Shadowbringers/MSQ/J-5.4/4015_The Great Ship Vylbrand.json
QuestPaths/5.x - Shadowbringers/MSQ/L-5.55/4066_Death Unto Dawn.json
Questionable/Controller/CombatModules/BossModModule.cs
Questionable/Controller/CombatModules/BossModPreset.json [deleted file]
Questionable/Controller/CombatModules/BossModPreset_Overworld.json [new file with mode: 0644]
Questionable/Controller/CombatModules/BossModPreset_QuestBattle.json [new file with mode: 0644]
Questionable/External/BossModIpc.cs
Questionable/Questionable.csproj

index bece61c..e5ffdf9 100644 (file)
           },
           "TerritoryId": 129,
           "InteractionType": "Interact",
-          "DialogueChoices": [
-            {
-              "Type": "YesNo",
-              "Prompt": "TEXT_CLSROG011_00102_Q9_000_901",
-              "Yes": true
-            }
-          ]
+          "TargetTerritoryId": 129
         },
         {
           "DataId": 1009943,
index a87348b..e8d5203 100644 (file)
@@ -5,6 +5,26 @@
     {
       "Sequence": 0,
       "Steps": [
+        {
+          "TerritoryId": 129,
+          "InteractionType": "EquipItem",
+          "ItemId": 7952,
+          "AetheryteShortcut": "Limsa Lominsa",
+          "SkipConditions": {
+            "AetheryteShortcutIf": {
+              "InSameTerritory": true
+            },
+            "StepIf": {
+              "Item": {
+                "NotInInventory": true
+              }
+            }
+          }
+        },
+        {
+          "TerritoryId": 129,
+          "InteractionType": "EquipRecommended"
+        },
         {
           "DataId": 1009944,
           "Position": {
           },
           "TerritoryId": 129,
           "InteractionType": "Interact",
-          "AetheryteShortcut": "Limsa Lominsa",
           "TargetTerritoryId": 129,
           "AethernetShortcut": [
             "[Limsa Lominsa] Aetheryte Plaza",
             "[Limsa Lominsa] Fishermens' Guild"
           ],
           "SkipConditions": {
-            "AetheryteShortcutIf": {
-              "InSameTerritory": true
-            },
             "StepIf": {
               "ExtraCondition": "RoguesGuild"
             }
     {
       "Sequence": 1,
       "Steps": [
+        {
+          "DataId": 2004936,
+          "Position": {
+            "X": -151.90363,
+            "Y": -128.16058,
+            "Z": 256.8551
+          },
+          "TerritoryId": 129,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 129,
+          "SkipConditions": {
+            "StepIf": {
+              "InTerritory": [
+                134
+              ],
+              "ExtraCondition": "NotRoguesGuild"
+            }
+          }
+        },
         {
           "Position": {
             "X": 31.662792,
index 062d18b..deb50f3 100644 (file)
           "TerritoryId": 129,
           "InteractionType": "Interact",
           "TargetTerritoryId": 129,
-          "AethernetShortcut": [
-            "[Limsa Lominsa] Fishermens' Guild",
-            "[Limsa Lominsa] The Aftcastle"
-          ],
           "SkipConditions": {
             "StepIf": {
-              "InTerritory": [
-                128
-              ]
+              "ExtraCondition": "NotRoguesGuild"
             }
           }
         },
           },
           "TerritoryId": 128,
           "InteractionType": "Interact",
+          "AethernetShortcut": [
+            "[Limsa Lominsa] Fishermens' Guild",
+            "[Limsa Lominsa] The Aftcastle"
+          ],
           "DialogueChoices": [
             {
               "Type": "List",
index bf69b45..a1b089d 100644 (file)
             "Z": 239.30713
           },
           "TerritoryId": 129,
-          "InteractionType": "SinglePlayerDuty"
+          "InteractionType": "SinglePlayerDuty",
+          "SinglePlayerDutyOptions": {
+            "Enabled": false,
+            "TestedBossModVersion": 292,
+            "Notes": [
+              "(phase 1) AI doesn't move or pick up the stolen firearms",
+              "(phase 1 + 2) AI automatically removes Hidden status",
+              "(phase 2) AI only moves while targeted enemies are in range + gets stuck on corners while trying to get to irrelevant enemies",
+              "(phase 2) AI doesn't even attempt to navigate to the end of the quest"
+            ]
+          }
         }
       ]
     },
index 9bd0522..43ab7e5 100644 (file)
           },
           "TerritoryId": 918,
           "InteractionType": "SinglePlayerDuty",
+          "SinglePlayerDutyOptions": {
+            "Enabled": false,
+            "TestedBossModVersion": 292,
+            "Notes": [
+              "(phase 2) AI doesn't target Ardbert to start combat",
+              "(phase 2) VBM module: Elidibus' line cleave only covers half the length of the actual line (survivable)"
+            ]
+          },
           "Comment": "Fight NPCs, then Elidibus",
           "DialogueChoices": [
             {
index a906fe1..7b05070 100644 (file)
           },
           "TerritoryId": 180,
           "InteractionType": "SinglePlayerDuty",
-          "Comment": "Great Ship Vylbrand"
+          "SinglePlayerDutyOptions": {
+            "Enabled": true,
+            "TestedBossModVersion": 292
+          }
         }
       ]
     },
index 2e79679..ea79f06 100644 (file)
           "StopDistance": 7,
           "TerritoryId": 132,
           "InteractionType": "SinglePlayerDuty",
+          "SinglePlayerDutyOptions": {
+            "Enabled": false,
+            "TestedBossModVersion": 293,
+            "Notes": [
+              "(Lunar Odin) AI doesn't pull Odin to start combat",
+              "(Lunar Ravana) AI doesn't pull Ravana to start combat",
+              "(Lunar Ravana) AI doesn't move out of directional parry directions"
+            ]
+          },
           "Comment": "Death Unto Dawn"
         }
       ]
index a69237f..da951b1 100644 (file)
@@ -1,14 +1,7 @@
 using Dalamud.Game.ClientState.Objects.Types;
-using Dalamud.Plugin;
-using Dalamud.Plugin.Ipc;
 using Dalamud.Plugin.Ipc.Exceptions;
-using Dalamud.Plugin.Services;
-using Json.Schema;
 using Microsoft.Extensions.Logging;
-using Questionable.Model;
 using System;
-using System.IO;
-using System.Numerics;
 using Questionable.External;
 
 namespace Questionable.Controller.CombatModules;
@@ -19,8 +12,6 @@ internal sealed class BossModModule : ICombatModule, IDisposable
     private readonly BossModIpc _bossModIpc;
     private readonly Configuration _configuration;
 
-    private static Stream Preset => typeof(BossModModule).Assembly.GetManifestResourceStream("Questionable.Controller.CombatModules.BossModPreset")!;
-
     public BossModModule(
         ILogger<BossModModule> logger,
         BossModIpc bossModIpc,
@@ -43,12 +34,7 @@ internal sealed class BossModModule : ICombatModule, IDisposable
     {
         try
         {
-            if (_bossModIpc.GetPreset("Questionable") == null)
-            {
-                using var reader = new StreamReader(Preset);
-                _logger.LogInformation("Loading Questionable BossMod Preset: {LoadedState}", _bossModIpc.CreatePreset(reader.ReadToEnd(), true));
-            }
-            _bossModIpc.SetPreset("Questionable");
+            _bossModIpc.SetPreset(BossModIpc.EPreset.Overworld);
             return true;
         }
         catch (IpcError e)
diff --git a/Questionable/Controller/CombatModules/BossModPreset.json b/Questionable/Controller/CombatModules/BossModPreset.json
deleted file mode 100644 (file)
index 26e7070..0000000
+++ /dev/null
@@ -1,308 +0,0 @@
-{
-  "Name": "Questionable",
-  "Modules": {
-    "BossMod.Autorotation.MiscAI.AutoFarm": [],
-    "BossMod.Autorotation.MiscAI.AutoPull": [
-      {
-        "Track": "Automatically attack hunt marks once they are below 95% HP",
-        "Option": "Disabled"
-      },
-      {
-        "Track": "Automatically attack deep dungeon bosses when solo",
-        "Option": "Disabled"
-      },
-      {
-        "Track": "Automatically attack all targets if the Epic Echo status is present (i.e. when unsynced)",
-        "Option": "Disabled"
-      }
-    ],
-    "BossMod.Autorotation.xan.DNC": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.MCH": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.MNK": [
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.PCT": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      },
-      {
-        "Track": "Motifs",
-        "Option": "Downtime"
-      }
-    ],
-    "BossMod.Autorotation.xan.PLD": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.SAM": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.SGE": [
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.VPR": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.NIN": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.GNB": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.SMN": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.DRK": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.RPR": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.WHM": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.AST": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.BRD": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.SCH": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.BLM": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.RDM": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.xan.DRG": [
-      {
-        "Track": "Buffs",
-        "Option": "Auto"
-      },
-      {
-        "Track": "AOE",
-        "Option": "AOE"
-      },
-      {
-        "Track": "Targeting",
-        "Option": "Manual"
-      }
-    ],
-    "BossMod.Autorotation.VeynWAR": [
-      {
-        "Track": "AOE",
-        "Option": "AutoFinishCombo"
-      }
-    ],
-    "BossMod.Autorotation.MiscAI.NormalMovement": [
-      {
-        "Track": "Destination",
-        "Option": "Pathfind"
-      }
-    ]
-  }
-}
diff --git a/Questionable/Controller/CombatModules/BossModPreset_Overworld.json b/Questionable/Controller/CombatModules/BossModPreset_Overworld.json
new file mode 100644 (file)
index 0000000..a1e0328
--- /dev/null
@@ -0,0 +1,293 @@
+{
+  "Name": "Questionable",
+  "Modules": {
+    "BossMod.Autorotation.xan.DNC": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.MCH": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.MNK": [
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.PCT": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      },
+      {
+        "Track": "Motifs",
+        "Option": "Downtime"
+      }
+    ],
+    "BossMod.Autorotation.xan.PLD": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.SAM": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.SGE": [
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.VPR": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.NIN": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.GNB": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.SMN": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.DRK": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.RPR": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.WHM": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.AST": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.BRD": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.SCH": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.BLM": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.RDM": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.DRG": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.VeynWAR": [
+      {
+        "Track": "AOE",
+        "Option": "AutoFinishCombo"
+      }
+    ],
+    "BossMod.Autorotation.MiscAI.NormalMovement": [
+      {
+        "Track": "Destination",
+        "Option": "Pathfind"
+      }
+    ]
+  }
+}
diff --git a/Questionable/Controller/CombatModules/BossModPreset_QuestBattle.json b/Questionable/Controller/CombatModules/BossModPreset_QuestBattle.json
new file mode 100644 (file)
index 0000000..1e93d98
--- /dev/null
@@ -0,0 +1,308 @@
+{
+  "Name": "Questionable - Quest Battles",
+  "Modules": {
+    "BossMod.Autorotation.MiscAI.AutoFarm": [],
+    "BossMod.Autorotation.MiscAI.AutoPull": [
+      {
+        "Track": "Automatically attack hunt marks once they are below 95% HP",
+        "Option": "Disabled"
+      },
+      {
+        "Track": "Automatically attack deep dungeon bosses when solo",
+        "Option": "Disabled"
+      },
+      {
+        "Track": "Automatically attack all targets if the Epic Echo status is present (i.e. when unsynced)",
+        "Option": "Disabled"
+      }
+    ],
+    "BossMod.Autorotation.xan.DNC": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.MCH": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.MNK": [
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.PCT": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      },
+      {
+        "Track": "Motifs",
+        "Option": "Downtime"
+      }
+    ],
+    "BossMod.Autorotation.xan.PLD": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.SAM": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.SGE": [
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.VPR": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.NIN": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.GNB": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.SMN": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.DRK": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.RPR": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.WHM": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.AST": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.BRD": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.SCH": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.BLM": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.RDM": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.xan.DRG": [
+      {
+        "Track": "Buffs",
+        "Option": "Auto"
+      },
+      {
+        "Track": "AOE",
+        "Option": "AOE"
+      },
+      {
+        "Track": "Targeting",
+        "Option": "Manual"
+      }
+    ],
+    "BossMod.Autorotation.VeynWAR": [
+      {
+        "Track": "AOE",
+        "Option": "AutoFinishCombo"
+      }
+    ],
+    "BossMod.Autorotation.MiscAI.NormalMovement": [
+      {
+        "Track": "Destination",
+        "Option": "Pathfind"
+      }
+    ]
+  }
+}
index d157622..ca73210 100644 (file)
@@ -1,3 +1,7 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
 using Dalamud.Plugin;
 using Dalamud.Plugin.Ipc;
 using Dalamud.Plugin.Ipc.Exceptions;
@@ -9,7 +13,13 @@ namespace Questionable.External;
 
 internal sealed class BossModIpc
 {
-    private const string Name = "BossMod";
+    private const string PluginName = "BossMod";
+
+    private static readonly ReadOnlyDictionary<EPreset, PresetDefinition> PresetDefinitions = new Dictionary<EPreset, PresetDefinition>
+        {
+            { EPreset.Overworld, new PresetDefinition("Questionable", "Overworld") },
+            { EPreset.QuestBattle, new PresetDefinition("Questionable - Quest Battles", "QuestBattle") },
+        }.AsReadOnly();
 
     private readonly Configuration _configuration;
     private readonly ICommandManager _commandManager;
@@ -29,10 +39,10 @@ internal sealed class BossModIpc
         _commandManager = commandManager;
         _territoryData = territoryData;
 
-        _getPreset = pluginInterface.GetIpcSubscriber<string, string?>($"{Name}.Presets.Get");
-        _createPreset = pluginInterface.GetIpcSubscriber<string, bool, bool>($"{Name}.Presets.Create");
-        _setPreset = pluginInterface.GetIpcSubscriber<string, bool>($"{Name}.Presets.SetActive");
-        _clearPreset = pluginInterface.GetIpcSubscriber<bool>($"{Name}.Presets.ClearActive");
+        _getPreset = pluginInterface.GetIpcSubscriber<string, string?>($"{PluginName}.Presets.Get");
+        _createPreset = pluginInterface.GetIpcSubscriber<string, bool, bool>($"{PluginName}.Presets.Create");
+        _setPreset = pluginInterface.GetIpcSubscriber<string, bool>($"{PluginName}.Presets.SetActive");
+        _clearPreset = pluginInterface.GetIpcSubscriber<bool>($"{PluginName}.Presets.ClearActive");
     }
 
     public bool IsSupported()
@@ -47,19 +57,13 @@ internal sealed class BossModIpc
         }
     }
 
-    public string? GetPreset(string name)
-    {
-        return _getPreset.InvokeFunc(name);
-    }
-
-    public bool CreatePreset(string name, bool overwrite)
+    public void SetPreset(EPreset preset)
     {
-        return _createPreset.InvokeFunc(name, overwrite);
-    }
+        var definition = PresetDefinitions[preset];
+        if (_getPreset.InvokeFunc(definition.Name) == null)
+            _createPreset.InvokeFunc(definition.Content, true);
 
-    public void SetPreset(string name)
-    {
-        _setPreset.InvokeFunc(name);
+        _setPreset.InvokeFunc(definition.Name);
     }
 
     public void ClearPreset()
@@ -68,11 +72,11 @@ internal sealed class BossModIpc
     }
 
     // TODO this should use your actual rotation plugin, not always vbm
-    public void EnableAi(string presetName = "VBM Default")
+    public void EnableAi()
     {
         _commandManager.ProcessCommand("/vbmai on");
         _commandManager.ProcessCommand("/vbm cfg ZoneModuleConfig EnableQuestBattles true");
-        SetPreset(presetName);
+        SetPreset(EPreset.QuestBattle);
     }
 
     public void DisableAi()
@@ -94,12 +98,36 @@ internal sealed class BossModIpc
         if (!_territoryData.TryGetContentFinderConditionForSoloInstance(questId, dutyOptions.Index, out var cfcData))
             return false;
 
-        if (_configuration.SinglePlayerDuties.BlacklistedSinglePlayerDutyCfcIds.Contains(cfcData.ContentFinderConditionId))
+        if (_configuration.SinglePlayerDuties.BlacklistedSinglePlayerDutyCfcIds.Contains(cfcData
+                .ContentFinderConditionId))
             return false;
 
-        if (_configuration.SinglePlayerDuties.WhitelistedSinglePlayerDutyCfcIds.Contains(cfcData.ContentFinderConditionId))
+        if (_configuration.SinglePlayerDuties.WhitelistedSinglePlayerDutyCfcIds.Contains(cfcData
+                .ContentFinderConditionId))
             return true;
 
         return dutyOptions.Enabled;
     }
+
+    public enum EPreset
+    {
+        Overworld,
+        QuestBattle,
+    }
+
+    private sealed class PresetDefinition(string name, string fileName)
+    {
+        public string Name { get; } = name;
+        public string Content { get; } = LoadPreset(fileName);
+
+        private static string LoadPreset(string name)
+        {
+            Stream stream =
+                typeof(BossModIpc).Assembly.GetManifestResourceStream(
+                    $"Questionable.Controller.CombatModules.BossModPreset.{name}") ??
+                throw new InvalidOperationException($"Preset {name} was not found");
+            using var reader = new StreamReader(stream);
+            return reader.ReadToEnd();
+        }
+    }
 }
index 544ba74..c909549 100644 (file)
 
     <ItemGroup>
         <PackageReference Include="Dalamud.Extensions.MicrosoftLogging" Version="4.0.1"/>
-        <PackageReference Include="JetBrains.Annotations" Version="2024.2.0" ExcludeAssets="runtime" />
-        <PackageReference Include="JsonSchema.Net" Version="7.1.2" />
+        <PackageReference Include="JetBrains.Annotations" Version="2024.2.0" ExcludeAssets="runtime"/>
+        <PackageReference Include="JsonSchema.Net" Version="7.1.2"/>
         <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0"/>
-        <PackageReference Include="System.Text.Json" Version="8.0.5" />
+        <PackageReference Include="System.Text.Json" Version="8.0.5"/>
     </ItemGroup>
 
     <ItemGroup>
-        <ProjectReference Include="..\GatheringPaths\GatheringPaths.csproj" />
+        <ProjectReference Include="..\GatheringPaths\GatheringPaths.csproj"/>
         <ProjectReference Include="..\LLib\LLib.csproj"/>
         <ProjectReference Include="..\Questionable.Model\Questionable.Model.csproj"/>
         <ProjectReference Include="..\QuestPaths\QuestPaths.csproj"/>
-        <ProjectReference Include="..\vendor\NotificationMasterAPI\NotificationMasterAPI\NotificationMasterAPI.csproj" />
+        <ProjectReference Include="..\vendor\NotificationMasterAPI\NotificationMasterAPI\NotificationMasterAPI.csproj"/>
     </ItemGroup>
 
-       <ItemGroup>
-               <None Remove="Controller\CombatModules\BossModPreset.json" />
-               <EmbeddedResource Include="Controller\CombatModules\BossModPreset.json">
-                       <LogicalName>Questionable.Controller.CombatModules.BossModPreset</LogicalName>
-               </EmbeddedResource>
-       </ItemGroup>
+    <ItemGroup>
+        <None Remove="Controller\CombatModules\BossModPreset_Overworld.json"/>
+        <None Remove="Controller\CombatModules\BossModPreset.QuestBattle.json"/>
+        <EmbeddedResource Include="Controller\CombatModules\BossModPreset_Overworld.json">
+            <LogicalName>Questionable.Controller.CombatModules.BossModPreset.Overworld</LogicalName>
+        </EmbeddedResource>
+        <EmbeddedResource Include="Controller\CombatModules\BossModPreset_QuestBattle.json">
+            <LogicalName>Questionable.Controller.CombatModules.BossModPreset.QuestBattle</LogicalName>
+        </EmbeddedResource>
+    </ItemGroup>
 </Project>