Fix 'Finding Ulaa'
authorLiza Carvelli <liza@carvel.li>
Sat, 28 Jun 2025 12:18:19 +0000 (14:18 +0200)
committerLiza Carvelli <liza@carvel.li>
Sat, 28 Jun 2025 13:02:25 +0000 (15:02 +0200)
QuestPaths/3.x - Heavensward/Side Stories/Scholasticate Quests/2210_Finding Ulaa.json
Questionable/QuestionablePlugin.cs
Questionable/Validation/EIssueType.cs
Questionable/Validation/Validators/SayValidator.cs [new file with mode: 0644]

index 8eeb0ff..715b280 100644 (file)
                     "TerritoryId": 155,
                     "InteractionType": "Say",
                     "ChatMessage": {
-                        "Key": "TEXT_CHREND204_02210_SYSTEM_000_023"
+                        "Key": "TEXT_CHREND204_02210_SYSTEM_000_030"
                     }
                 }
             ]
             ]
         }
     ]
-}
\ No newline at end of file
+}
index df3229d..e54a500 100644 (file)
@@ -321,6 +321,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
         serviceCollection.AddSingleton<IQuestValidator, ClassQuestShouldHaveShortcutValidator>();
         serviceCollection.AddSingleton<IQuestValidator, SinglePlayerInstanceValidator>();
         serviceCollection.AddSingleton<IQuestValidator, UniqueSinglePlayerInstanceValidator>();
+        serviceCollection.AddSingleton<IQuestValidator, SayValidator>();
         serviceCollection.AddSingleton<JsonSchemaValidator>();
         serviceCollection.AddSingleton<IQuestValidator>(sp => sp.GetRequiredService<JsonSchemaValidator>());
     }
index 3f72573..fc75d99 100644 (file)
@@ -20,4 +20,5 @@ public enum EIssueType
     ClassQuestWithoutAetheryteShortcut,
     DuplicateSinglePlayerInstance,
     UnusedSinglePlayerInstance,
+    InvalidChatMessage,
 }
diff --git a/Questionable/Validation/Validators/SayValidator.cs b/Questionable/Validation/Validators/SayValidator.cs
new file mode 100644 (file)
index 0000000..9425488
--- /dev/null
@@ -0,0 +1,46 @@
+using System.Collections.Generic;
+using System.Linq;
+using Lumina.Text.ReadOnly;
+using Questionable.Functions;
+using Questionable.Model;
+using Questionable.Model.Questing;
+
+namespace Questionable.Validation.Validators;
+
+internal sealed class SayValidator : IQuestValidator
+{
+    private readonly ExcelFunctions _excelFunctions;
+
+    public SayValidator(ExcelFunctions excelFunctions)
+    {
+        _excelFunctions = excelFunctions;
+    }
+
+    public IEnumerable<ValidationIssue> Validate(Quest quest)
+    {
+        foreach (var data in quest.AllSteps().Where(x => x.Step.InteractionType == EInteractionType.Say))
+        {
+            var chatMessage = data.Step.ChatMessage;
+            if (chatMessage == null)
+                continue;
+
+            ReadOnlySeString? excelString = _excelFunctions
+                .GetRawDialogueText(quest, chatMessage.ExcelSheet, chatMessage.Key);
+            if (excelString == null)
+                continue;
+
+            if (excelString.Value.PayloadCount != 1)
+            {
+                yield return new ValidationIssue
+                {
+                    ElementId = quest.Id,
+                    Sequence = (byte)data.Sequence.Sequence,
+                    Step = data.StepId,
+                    Type = EIssueType.InvalidChatMessage,
+                    Severity = EIssueSeverity.Error,
+                    Description = $"Invalid chat message: {excelString.Value}",
+                };
+            }
+        }
+    }
+}