From bf4fc7864f134e9759f1109b97628a70882927d7 Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Sat, 20 Sep 2025 00:33:23 +0200 Subject: [PATCH] Handle multiple col- entries in Completion.LookupTable --- .../Game/Text/Evaluator/SeStringEvaluator.cs | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/Dalamud/Game/Text/Evaluator/SeStringEvaluator.cs b/Dalamud/Game/Text/Evaluator/SeStringEvaluator.cs index 8b6a2bed8..cd981ae75 100644 --- a/Dalamud/Game/Text/Evaluator/SeStringEvaluator.cs +++ b/Dalamud/Game/Text/Evaluator/SeStringEvaluator.cs @@ -1629,7 +1629,9 @@ internal class SeStringEvaluator : IServiceType, ISeStringEvaluator return true; var isNoun = false; - var col = 0; + + Span cols = stackalloc int[2]; + cols.Clear(); if (ranges.StartsWith("noun")) { @@ -1637,11 +1639,24 @@ internal class SeStringEvaluator : IServiceType, ISeStringEvaluator } else if (ranges.StartsWith("col")) { - var colRangeEnd = ranges.IndexOf(','); - if (colRangeEnd == -1) - colRangeEnd = ranges.Length; + var i = 0; + while (i < cols.Length && ranges.StartsWith("col-", StringComparison.Ordinal)) + { + // find the end of the current "col-#" token + var colRangeEnd = ranges.IndexOf(','); + if (colRangeEnd == -1) + colRangeEnd = ranges.Length; - col = int.Parse(ranges[4..colRangeEnd]); + // parse the column index + cols[i++] = int.Parse(ranges.AsSpan(4, colRangeEnd - 4)); + + // if it's the end of the string, we're done + if (colRangeEnd == ranges.Length) + break; + + // move to the next entry + ranges = ranges[(colRangeEnd + 1)..].TrimStart(); + } } else if (ranges.StartsWith("tail")) { @@ -1663,7 +1678,17 @@ internal class SeStringEvaluator : IServiceType, ISeStringEvaluator } else if (this.dataManager.GetExcelSheet(context.Language, sheetName).TryGetRow(rowId, out var row)) { - context.Builder.Append(row.ReadStringColumn(col)); + // the game uses a priority system for columns here. + // if the first column is empty (for example MainCommand.Alias), then the next one is used (MainCommand.Command) + for (var i = 0; i < cols.Length; i++) + { + var text = row.ReadStringColumn(cols[i]); + if (!text.IsEmpty) + { + context.Builder.Append(text); + break; + } + } } return true;