diff --git a/Dalamud/Game/Text/Evaluator/SeStringEvaluator.cs b/Dalamud/Game/Text/Evaluator/SeStringEvaluator.cs index 624b62253..9e2466df4 100644 --- a/Dalamud/Game/Text/Evaluator/SeStringEvaluator.cs +++ b/Dalamud/Game/Text/Evaluator/SeStringEvaluator.cs @@ -315,6 +315,9 @@ internal class SeStringEvaluator : IServiceType, ISeStringEvaluator case MacroCode.Sheet: return this.TryResolveSheet(in context, payload); + case MacroCode.SheetSub: + return this.TryResolveSheetSub(in context, payload); + case MacroCode.String: return this.TryResolveString(in context, payload); @@ -757,6 +760,65 @@ internal class SeStringEvaluator : IServiceType, ISeStringEvaluator return true; } + private bool TryResolveSheetSub(in SeStringContext context, in ReadOnlySePayloadSpan payload) + { + var enu = payload.GetEnumerator(); + + if (!enu.MoveNext() || !enu.Current.TryGetString(out var eSheetNameStr)) + return false; + + if (!enu.MoveNext() || !this.TryResolveUInt(in context, enu.Current, out var eRowIdValue)) + return false; + + if (!enu.MoveNext() || !this.TryResolveUInt(in context, enu.Current, out var eSubrowIdValue)) + return false; + + if (!enu.MoveNext() || !this.TryResolveUInt(in context, enu.Current, out var eColIndexValue)) + return false; + + var secondaryRowId = this.GetSubrowSheetIntValue(context.Language, eSheetNameStr.ExtractText(), eRowIdValue, (ushort)eSubrowIdValue, eColIndexValue); + if (secondaryRowId == -1) + return false; + + if (!enu.MoveNext() || !enu.Current.TryGetString(out var eSecondarySheetNameStr)) + return false; + + if (!enu.MoveNext() || !this.TryResolveUInt(in context, enu.Current, out var secondaryColIndex)) + return false; + + var text = this.FormatSheetValue(context.Language, eSecondarySheetNameStr.ExtractText(), (uint)secondaryRowId, secondaryColIndex, 0); + if (text.IsEmpty) + return false; + + this.CreateSheetLink(context, eSecondarySheetNameStr.ExtractText(), text, eRowIdValue, eSubrowIdValue); + + return true; + } + + private int GetSubrowSheetIntValue(ClientLanguage language, string sheetName, uint rowId, ushort subrowId, uint colIndex) + { + if (!this.dataManager.Excel.SheetNames.Contains(sheetName)) + return -1; + + if (!this.dataManager.GetSubrowExcelSheet(language, sheetName) + .TryGetSubrow(rowId, subrowId, out var row)) + return -1; + + if (colIndex >= row.Columns.Count) + return -1; + + var column = row.Columns[(int)colIndex]; + return column.Type switch + { + ExcelColumnDataType.Int8 => row.ReadInt8(column.Offset), + ExcelColumnDataType.UInt8 => row.ReadUInt8(column.Offset), + ExcelColumnDataType.Int16 => row.ReadInt16(column.Offset), + ExcelColumnDataType.UInt16 => row.ReadUInt16(column.Offset), + ExcelColumnDataType.Int32 => row.ReadInt32(column.Offset), + _ => -1, + }; + } + private ReadOnlySeString FormatSheetValue(ClientLanguage language, string sheetName, uint rowId, uint colIndex, uint colParam) { if (!this.dataManager.Excel.SheetNames.Contains(sheetName)) diff --git a/Dalamud/Interface/Internal/Windows/Data/Widgets/SeStringCreatorWidget.cs b/Dalamud/Interface/Internal/Windows/Data/Widgets/SeStringCreatorWidget.cs index 1cb91245a..d2d0cb3b2 100644 --- a/Dalamud/Interface/Internal/Windows/Data/Widgets/SeStringCreatorWidget.cs +++ b/Dalamud/Interface/Internal/Windows/Data/Widgets/SeStringCreatorWidget.cs @@ -89,6 +89,7 @@ internal class SeStringCreatorWidget : IDataWindowWidget { MacroCode.FrNoun, ["SheetName", "ArticleType", "RowId", "Amount", "Case", "UnkInt5"] }, { MacroCode.ChNoun, ["SheetName", "ArticleType", "RowId", "Amount", "Case", "UnkInt5"] }, { MacroCode.LowerHead, ["String"] }, + { MacroCode.SheetSub, ["SheetName", "RowId", "SubrowId", "ColumnIndex", "SecondarySheetName", "SecondarySheetColumnIndex"] }, { MacroCode.ColorType, ["ColorType"] }, { MacroCode.EdgeColorType, ["ColorType"] }, { MacroCode.Ruby, ["StandardText", "RubyText"] }, @@ -103,13 +104,16 @@ internal class SeStringCreatorWidget : IDataWindowWidget { LinkMacroPayloadType.Character, ["Flags", "WorldId"] }, { LinkMacroPayloadType.Item, ["ItemId", "Rarity"] }, { LinkMacroPayloadType.MapPosition, ["TerritoryType/MapId", "RawX", "RawY"] }, - { LinkMacroPayloadType.Quest, ["QuestId"] }, - { LinkMacroPayloadType.Achievement, ["AchievementId"] }, - { LinkMacroPayloadType.HowTo, ["HowToId"] }, + { LinkMacroPayloadType.Quest, ["RowId"] }, + { LinkMacroPayloadType.Achievement, ["RowId"] }, + { LinkMacroPayloadType.HowTo, ["RowId"] }, // PartyFinderNotification { LinkMacroPayloadType.Status, ["StatusId"] }, { LinkMacroPayloadType.PartyFinder, ["ListingId", string.Empty, "WorldId"] }, - { LinkMacroPayloadType.AkatsukiNote, ["AkatsukiNoteId"] }, + { LinkMacroPayloadType.AkatsukiNote, ["RowId"] }, + { LinkMacroPayloadType.Description, ["RowId"] }, + { LinkMacroPayloadType.WKSPioneeringTrail, ["RowId", "SubrowId"] }, + { LinkMacroPayloadType.MKDLore, ["RowId"] }, { DalamudLinkType, ["CommandId", "Extra1", "Extra2", "ExtraString"] }, };