Update collectable logic for items above your level/low collectability increase
authorLiza Carvelli <liza@carvel.li>
Sat, 17 Aug 2024 22:41:58 +0000 (00:41 +0200)
committerLiza Carvelli <liza@carvel.li>
Sat, 17 Aug 2024 22:41:58 +0000 (00:41 +0200)
Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs

index 10fb9faa2cebcf0ae6950ffc5f0be65ff7e4fc21..3c6f776d6c25d1aa945ba7be1cceb380f502a483 100644 (file)
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
 using Dalamud.Game.Text;
 using Dalamud.Plugin.Services;
@@ -25,7 +26,10 @@ internal sealed class DoGatherCollectable(
     private bool _revisitTriggered;
     private Queue<EAction>? _actionQueue;
 
-    public ITask With(GatheringController.GatheringRequest currentRequest, GatheringNode currentNode, bool revisitRequired)
+    private bool? _expectedScrutiny;
+
+    public ITask With(GatheringController.GatheringRequest currentRequest, GatheringNode currentNode,
+        bool revisitRequired)
     {
         _currentRequest = currentRequest;
         _currentNode = currentNode;
@@ -71,10 +75,27 @@ internal sealed class DoGatherCollectable(
         if (nodeCondition == null)
             return ETaskResult.TaskComplete;
 
+        if (_expectedScrutiny != null)
+        {
+            if (nodeCondition.ScrutinyActive != _expectedScrutiny)
+                return ETaskResult.StillRunning;
+
+            // continue on next frame
+            _expectedScrutiny = null;
+            return ETaskResult.StillRunning;
+        }
+
         if (_actionQueue != null && _actionQueue.TryPeek(out EAction nextAction))
         {
             if (gameFunctions.UseAction(nextAction))
             {
+                _expectedScrutiny = nextAction switch
+                {
+                    EAction.ScrutinyMiner or EAction.ScrutinyBotanist => true,
+                    EAction.ScourMiner or EAction.ScourBotanist or EAction.MeticulousMiner
+                        or EAction.MeticulousBotanist => false,
+                    _ => null
+                };
                 logger.LogInformation("Used action {Action} on node", nextAction);
                 _actionQueue.Dequeue();
             }
@@ -108,7 +129,7 @@ internal sealed class DoGatherCollectable(
                 MaxCollectability: atkValues[14].UInt,
                 CurrentIntegrity: atkValues[62].UInt,
                 MaxIntegrity: atkValues[63].UInt,
-                ScrutinyActive: atkValues[80].Bool,
+                ScrutinyActive: atkValues[54].Bool,
                 CollectabilityFromScour: atkValues[48].UInt,
                 CollectabilityFromMeticulous: atkValues[51].UInt
             );
@@ -120,17 +141,25 @@ internal sealed class DoGatherCollectable(
     private Queue<EAction> GetNextActions(NodeCondition nodeCondition)
     {
         uint gp = clientState.LocalPlayer!.CurrentGp;
+        logger.LogTrace(
+            "Getting next actions (with {GP} GP, {MeticulousCollectability}~ meticulous, {ScourCollectability}~ scour)",
+            gp, nodeCondition.CollectabilityFromMeticulous, nodeCondition.CollectabilityFromScour);
+
         Queue<EAction> actions = new();
 
         uint neededCollectability = nodeCondition.CollectabilityToGoal(_currentRequest.Collectability);
         if (neededCollectability <= nodeCondition.CollectabilityFromMeticulous)
         {
+            logger.LogTrace("Can get all needed {NeededCollectability} from {Collectability}~ meticulous",
+                neededCollectability, nodeCondition.CollectabilityFromMeticulous);
             actions.Enqueue(PickAction(EAction.MeticulousMiner, EAction.MeticulousBotanist));
             return actions;
         }
 
         if (neededCollectability <= nodeCondition.CollectabilityFromScour)
         {
+            logger.LogTrace("Can get all needed {NeededCollectability} from {Collectability}~ scour",
+                neededCollectability, nodeCondition.CollectabilityFromScour);
             actions.Enqueue(PickAction(EAction.ScourMiner, EAction.ScourBotanist));
             return actions;
         }
@@ -138,17 +167,23 @@ internal sealed class DoGatherCollectable(
         // neither action directly solves our problem
         if (!nodeCondition.ScrutinyActive && gp >= 200)
         {
+            logger.LogTrace("Still missing {NeededCollectability} collectability, scrutiny inactive",
+                neededCollectability);
             actions.Enqueue(PickAction(EAction.ScrutinyMiner, EAction.ScrutinyBotanist));
             return actions;
         }
 
         if (nodeCondition.ScrutinyActive)
         {
+            logger.LogTrace("Scrutiny active, need {NeededCollectability} and we expect {Collectability}~ meticulous",
+                neededCollectability, nodeCondition.CollectabilityFromMeticulous);
             actions.Enqueue(PickAction(EAction.MeticulousMiner, EAction.MeticulousBotanist));
             return actions;
         }
         else
         {
+            logger.LogTrace("Scrutiny active, need {NeededCollectability} and we expect {Collectability}~ scour",
+                neededCollectability, nodeCondition.CollectabilityFromScour);
             actions.Enqueue(PickAction(EAction.ScourMiner, EAction.ScourBotanist));
             return actions;
         }
@@ -168,7 +203,7 @@ internal sealed class DoGatherCollectable(
     }
 
     public override string ToString() =>
-        $"DoGatherCollectable({SeIconChar.Collectible.ToIconString()} {_currentRequest.Collectability}){(_revisitRequired ? " if revist" : "")}";
+        $"DoGatherCollectable({SeIconChar.Collectible.ToIconString()}/{_expectedScrutiny} {_currentRequest.Collectability}){(_revisitRequired ? " if revist" : "")}";
 
     [SuppressMessage("ReSharper", "NotAccessedPositionalProperty.Local")]
     private sealed record NodeCondition(