fix(ui): restore retail magic shortcut bar
Port the retail horizontal ItemList empty-slot padding and share UIItem shortcut-number graphics with the status toolbar. Preserve all authored face children on compound DAT buttons so the three-piece Cast control reflows and renders as one complete button. Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
parent
0527325b25
commit
e3605672bb
12 changed files with 466 additions and 62 deletions
|
|
@ -167,6 +167,7 @@ public sealed class RetailUiRuntime : IDisposable
|
|||
private GameplayConfirmationController? _gameplayConfirmationController;
|
||||
private RetailItemConfirmationController? _itemConfirmationController;
|
||||
private RetailSkillTrainingConfirmationController? _skillTrainingConfirmationController;
|
||||
private UiShortcutSlotGraphics? _shortcutSlotGraphics;
|
||||
private bool _disposed;
|
||||
|
||||
private RetailUiRuntime(RetailUiRuntimeBindings bindings)
|
||||
|
|
@ -558,11 +559,13 @@ public sealed class RetailUiRuntime : IDisposable
|
|||
return;
|
||||
}
|
||||
|
||||
var (regular, ghosted, empty) = LoadToolbarDigits();
|
||||
UiShortcutSlotGraphics shortcutGraphics = LoadShortcutSlotGraphics();
|
||||
ToolbarRuntimeBindings b = _bindings.Toolbar;
|
||||
ToolbarController = Layout.ToolbarController.Bind(
|
||||
layout, b.Objects, b.Shortcuts, b.ResolveIcon, b.UseItem, b.Combat,
|
||||
regular, ghosted, empty, b.ItemInteraction, b.SendAddShortcut, b.SendRemoveShortcut,
|
||||
shortcutGraphics.RegularDigits, shortcutGraphics.GhostedDigits,
|
||||
shortcutGraphics.EmptyDigits, b.ItemInteraction,
|
||||
b.SendAddShortcut, b.SendRemoveShortcut,
|
||||
toggleCombat: b.ToggleCombat,
|
||||
selectItem: guid => b.Selection.Select(guid, SelectionChangeSource.Toolbar),
|
||||
selectedObjectId: () => b.Selection.SelectedObjectId ?? 0u,
|
||||
|
|
@ -671,7 +674,8 @@ public sealed class RetailUiRuntime : IDisposable
|
|||
_bindings.Magic.UseItem,
|
||||
_bindings.Magic.Selection,
|
||||
_bindings.Magic.AddFavorite,
|
||||
_bindings.Magic.RemoveFavorite);
|
||||
_bindings.Magic.RemoveFavorite,
|
||||
LoadShortcutSlotGraphics());
|
||||
if (spellcasting is null)
|
||||
Console.WriteLine("[M3] spellcasting: required controls missing in LayoutDesc 0x21000073.");
|
||||
|
||||
|
|
@ -1012,9 +1016,13 @@ public sealed class RetailUiRuntime : IDisposable
|
|||
$"[UI] retail DialogFactory from LayoutDesc 0x{layoutId:X8}; confirmation root 0x15.");
|
||||
}
|
||||
|
||||
private (uint[] Regular, uint[] Ghosted, uint[]? Empty) LoadToolbarDigits()
|
||||
private UiShortcutSlotGraphics LoadShortcutSlotGraphics()
|
||||
{
|
||||
if (_shortcutSlotGraphics is not null)
|
||||
return _shortcutSlotGraphics;
|
||||
|
||||
uint[]? regular = null, ghosted = null, empty = null;
|
||||
uint emptySprite = 0u;
|
||||
lock (_bindings.Assets.DatLock)
|
||||
{
|
||||
var layout = _bindings.Assets.Dats.Get<DatReaderWriter.DBObjs.LayoutDesc>(0x21000037u);
|
||||
|
|
@ -1031,6 +1039,10 @@ public sealed class RetailUiRuntime : IDisposable
|
|||
&& emptyComposite.Children.TryGetValue(0x1000034Au, out var emptyNumber)
|
||||
&& emptyNumber.StateDesc?.Properties is { } emptyProps)
|
||||
empty = ReadDataIds(emptyProps, 0x1000005Eu);
|
||||
emptySprite = ItemListCellTemplate.ResolveEmptySprite(
|
||||
_bindings.Assets.Dats,
|
||||
CombatUiController.LayoutId,
|
||||
SpellcastingUiController.FavoriteListId);
|
||||
}
|
||||
|
||||
regular ??=
|
||||
|
|
@ -1043,8 +1055,13 @@ public sealed class RetailUiRuntime : IDisposable
|
|||
0x06001ACCu, 0x06001ACDu, 0x06001ACEu, 0x06001ACFu, 0x06001AD0u,
|
||||
0x06001AD1u, 0x06001AD2u, 0x06001AD3u, 0x06001AD4u,
|
||||
];
|
||||
Console.WriteLine($"[D.5.1] toolbar digit arrays ready: regular={regular.Length}, ghosted={ghosted.Length}, empty={empty?.Length ?? 0} entries.");
|
||||
return (regular, ghosted, empty);
|
||||
_shortcutSlotGraphics = new UiShortcutSlotGraphics(
|
||||
regular, ghosted, empty, emptySprite);
|
||||
Console.WriteLine(
|
||||
$"[D.5.1] shared shortcut graphics ready: regular={regular.Length}, " +
|
||||
$"ghosted={ghosted.Length}, empty={empty?.Length ?? 0}, " +
|
||||
$"slot=0x{emptySprite:X8}.");
|
||||
return _shortcutSlotGraphics;
|
||||
}
|
||||
|
||||
private static uint[]? ReadDataIds(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue