Skip to content

Commit 094fcc8

Browse files
Add support for SheetSub payload (#2283)
1 parent d6aa6b8 commit 094fcc8

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

Dalamud/Game/Text/Evaluator/SeStringEvaluator.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,9 @@ private bool ResolvePayload(in SeStringContext context, ReadOnlySePayloadSpan pa
315315
case MacroCode.Sheet:
316316
return this.TryResolveSheet(in context, payload);
317317

318+
case MacroCode.SheetSub:
319+
return this.TryResolveSheetSub(in context, payload);
320+
318321
case MacroCode.String:
319322
return this.TryResolveString(in context, payload);
320323

@@ -757,6 +760,65 @@ private bool TryResolveSheet(in SeStringContext context, in ReadOnlySePayloadSpa
757760
return true;
758761
}
759762

763+
private bool TryResolveSheetSub(in SeStringContext context, in ReadOnlySePayloadSpan payload)
764+
{
765+
var enu = payload.GetEnumerator();
766+
767+
if (!enu.MoveNext() || !enu.Current.TryGetString(out var eSheetNameStr))
768+
return false;
769+
770+
if (!enu.MoveNext() || !this.TryResolveUInt(in context, enu.Current, out var eRowIdValue))
771+
return false;
772+
773+
if (!enu.MoveNext() || !this.TryResolveUInt(in context, enu.Current, out var eSubrowIdValue))
774+
return false;
775+
776+
if (!enu.MoveNext() || !this.TryResolveUInt(in context, enu.Current, out var eColIndexValue))
777+
return false;
778+
779+
var secondaryRowId = this.GetSubrowSheetIntValue(context.Language, eSheetNameStr.ExtractText(), eRowIdValue, (ushort)eSubrowIdValue, eColIndexValue);
780+
if (secondaryRowId == -1)
781+
return false;
782+
783+
if (!enu.MoveNext() || !enu.Current.TryGetString(out var eSecondarySheetNameStr))
784+
return false;
785+
786+
if (!enu.MoveNext() || !this.TryResolveUInt(in context, enu.Current, out var secondaryColIndex))
787+
return false;
788+
789+
var text = this.FormatSheetValue(context.Language, eSecondarySheetNameStr.ExtractText(), (uint)secondaryRowId, secondaryColIndex, 0);
790+
if (text.IsEmpty)
791+
return false;
792+
793+
this.CreateSheetLink(context, eSecondarySheetNameStr.ExtractText(), text, eRowIdValue, eSubrowIdValue);
794+
795+
return true;
796+
}
797+
798+
private int GetSubrowSheetIntValue(ClientLanguage language, string sheetName, uint rowId, ushort subrowId, uint colIndex)
799+
{
800+
if (!this.dataManager.Excel.SheetNames.Contains(sheetName))
801+
return -1;
802+
803+
if (!this.dataManager.GetSubrowExcelSheet<RawSubrow>(language, sheetName)
804+
.TryGetSubrow(rowId, subrowId, out var row))
805+
return -1;
806+
807+
if (colIndex >= row.Columns.Count)
808+
return -1;
809+
810+
var column = row.Columns[(int)colIndex];
811+
return column.Type switch
812+
{
813+
ExcelColumnDataType.Int8 => row.ReadInt8(column.Offset),
814+
ExcelColumnDataType.UInt8 => row.ReadUInt8(column.Offset),
815+
ExcelColumnDataType.Int16 => row.ReadInt16(column.Offset),
816+
ExcelColumnDataType.UInt16 => row.ReadUInt16(column.Offset),
817+
ExcelColumnDataType.Int32 => row.ReadInt32(column.Offset),
818+
_ => -1,
819+
};
820+
}
821+
760822
private ReadOnlySeString FormatSheetValue(ClientLanguage language, string sheetName, uint rowId, uint colIndex, uint colParam)
761823
{
762824
if (!this.dataManager.Excel.SheetNames.Contains(sheetName))

Dalamud/Interface/Internal/Windows/Data/Widgets/SeStringCreatorWidget.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ internal class SeStringCreatorWidget : IDataWindowWidget
8989
{ MacroCode.FrNoun, ["SheetName", "ArticleType", "RowId", "Amount", "Case", "UnkInt5"] },
9090
{ MacroCode.ChNoun, ["SheetName", "ArticleType", "RowId", "Amount", "Case", "UnkInt5"] },
9191
{ MacroCode.LowerHead, ["String"] },
92+
{ MacroCode.SheetSub, ["SheetName", "RowId", "SubrowId", "ColumnIndex", "SecondarySheetName", "SecondarySheetColumnIndex"] },
9293
{ MacroCode.ColorType, ["ColorType"] },
9394
{ MacroCode.EdgeColorType, ["ColorType"] },
9495
{ MacroCode.Ruby, ["StandardText", "RubyText"] },
@@ -103,13 +104,16 @@ internal class SeStringCreatorWidget : IDataWindowWidget
103104
{ LinkMacroPayloadType.Character, ["Flags", "WorldId"] },
104105
{ LinkMacroPayloadType.Item, ["ItemId", "Rarity"] },
105106
{ LinkMacroPayloadType.MapPosition, ["TerritoryType/MapId", "RawX", "RawY"] },
106-
{ LinkMacroPayloadType.Quest, ["QuestId"] },
107-
{ LinkMacroPayloadType.Achievement, ["AchievementId"] },
108-
{ LinkMacroPayloadType.HowTo, ["HowToId"] },
107+
{ LinkMacroPayloadType.Quest, ["RowId"] },
108+
{ LinkMacroPayloadType.Achievement, ["RowId"] },
109+
{ LinkMacroPayloadType.HowTo, ["RowId"] },
109110
// PartyFinderNotification
110111
{ LinkMacroPayloadType.Status, ["StatusId"] },
111112
{ LinkMacroPayloadType.PartyFinder, ["ListingId", string.Empty, "WorldId"] },
112-
{ LinkMacroPayloadType.AkatsukiNote, ["AkatsukiNoteId"] },
113+
{ LinkMacroPayloadType.AkatsukiNote, ["RowId"] },
114+
{ LinkMacroPayloadType.Description, ["RowId"] },
115+
{ LinkMacroPayloadType.WKSPioneeringTrail, ["RowId", "SubrowId"] },
116+
{ LinkMacroPayloadType.MKDLore, ["RowId"] },
113117
{ DalamudLinkType, ["CommandId", "Extra1", "Extra2", "ExtraString"] },
114118
};
115119

0 commit comments

Comments
 (0)