Skip to content

Blueprint menus and an observable HUD ​

The standalone example defaults to WBP_AshenMainMenu, WBP_AshenPause, WBP_AshenRTSHUD, WBP_AshenSettings, WBP_AshenControls and WBP_ForgeConfirmation. These are ordinary saved Widget Blueprints using public InterfaceForge APIs. The earlier native menu/HUD classes are retained as development references. Game Master's visual design stays exclusive to Game Master; these sample trees and presentation are independently authored.

The main and pause Designer trees contain InterfaceForge Surface, IFText and WBP_ForgeActionButton widgets. Event On Initialized → Set Initial Focus selects their primary button. Each button uses On Button Base Clicked.

OperationActual public nodesExpected result
BeginRequest UI Action, Action Name = BeginExpeditionAdapter enters gameplay and pushes its HUD
SettingsMain: Get Root Layout → Push Screen Async, Layer = Menu, soft class = WBP_AshenSettings; Pause: Push ScreenSettings enters the stack; Cancel rolls back its preview and restores the opener
JournalGet Root Layout → Push Screen, Class = WBP_FieldJournal, Data = Screen DataSame adapter supplies the journal's observable models
ResumeDeactivate WidgetPause closes; adapter sees the HUD on top and resumes its small demo
Quit/ReturnConstruct Object from Class: IFDialogData; set labels; Bind Event to On Completed; Get Root Layout → Push DialogModal asks the player; Confirmed requests the relevant adapter action

The Blueprint On Handle Back Action override returns true. Main calls its OpenExitConfirmation custom event; Pause calls Deactivate Widget. This keeps main visible when Back opens a dialog. The Confirmed callback calls Request UI Action with QuitGame or ReturnToMainMenu. Cancelled performs no game action. These action names are example-adapter contracts, not built-in InterfaceForge commands.

The Outpost backend implements IFDataSource, validates the current flow/state and owns the demo actions. InterfaceForge simply forwards requests. Replacing it requires an object implementing Get UI Model and Request UI Action; the plugin needs no reference to Outpost or the example controller. A missing source returns None/false.

The main screen's Initialize Screen graph calls its parent and the editable Refresh Menu Presentation event. Read Menu Text uses public Get UI Model and IFPresentationData Title/Detail, with explicit fallbacks for missing/empty models. Emberwatch supplies identity, Begin/Resume and confirmation wording; Outpost retains its Ashen Reach/expedition defaults through the same classes. Every reinitialization resets missing fields instead of retaining the previous source's text. Actual nodes, optional model names and live refresh.

The current Designer keeps MenuPublisher and the bounded MenuTitleFit outside MenuActions. Main's introduction has its own MenuReading Scroll Box. Only the action column scrolls when necessary. This prevents identity or long prose from consuming all navigation space. The current main menu includes Begin, Settings, Visit the other world and Quit. At enlarged settings the bounded action column may scroll; focusing Quit scrolls it fully into view. Keep the existing PrimaryChoice/SettingsChoice/JournalChoice/ExitChoice widgets when reflowing so their saved click graphs and Initial Focus remain connected. Exact dimensions and customization choices.

flowchart TD
    C[Canvas: stretch slot, margin 24] --> F[Scale Box: Down Only]
    F --> B[Size Box: preferred card bounds]
    B --> S[InterfaceForge Surface]
    S --> V[Vertical Box: MenuColumn]
    V --> P[MenuPublisher: semantic accent]
    V --> T[MenuTitleBounds → Scale Box → MainTitle or PauseTitle]
    V --> R[Main only: MenuDetailBounds → MenuReading → MainDetail]
    V --> A[Fill: MenuActions → MenuChoices → public buttons]

Current UE5.6 source and packaged interaction results, visual review, failures and scope are recorded in menu presentation evidence. Arrow navigation is synthetic Slate input; it does not certify physical controllers or touch. Game Master's layouts, style, artwork and animations remain excluded.

Composing HUD elements ​

WBP_HUDReadout and WBP_ProductionReadout derive from IFEntryWidget. They are reusable outside lists too. The HUD Designer places them inside original themed panels, beside custom action buttons and an IFActionPrompt.

flowchart LR
    A[Event Initialize Screen] --> B[Parent: Initialize Screen]
    B --> C[Get UI Model: Resources / Selected / Objective / Queue / Notice]
    C --> D[Initialize Entry on the matching Designer widget]
    D --> E[Entry: On Entry Refreshed]
    E --> F[Cast Entry Data: IFPresentationData]
    F --> G[Set Text: Title and Detail]
    F --> H[Queue: Set Fraction]
    I[Backend edits stable model] --> J[Notify Data Changed]
    J --> E

Initialize each entry when screen data changes. The entry base replaces old subscriptions, reads the initial model, listens for Notify Data Changed and unbinds on release. The Blueprint readout handles visuals. It does not search the world or poll the entity population. The queue uses a theme-aware Forge Progress in Linear mode; Use Theme Colors chooses Accent/Outline. Custom colors remain available by disabling that option.

After setting Detail, Text Is Empty → Branch → Set Visibility collapses an empty detail and restores Self Hit Test Invisible for nonempty text. This avoids empty caption spacing without losing later updates. On Entry Released clears both text fields, collapses Detail and resets queue fraction to zero before another model reuses the entry. These are ordinary Blueprint nodes, not example-only runtime helpers.

HUD command entries forward SelectNext, ToggleGroup, Patrol, Rally and Recruit to the same adapter. They consume separate stable command models for labels, availability and reasons; Blueprint RTS commands documents their actual graphs, group selection and nested navigation. Pause forwards PauseExpedition. The example backend responds with changed status/resources/queue/objective values. The IFActionPrompt resolves IFExampleInteract from Enhanced Input, including applied remaps. Game and UI input policy preserves gameplay routing when no menu/modal is active.

To customize: edit either readout's Designer tree/On Entry Refreshed graph; change panel anchors/classes in WBP_AshenRTSHUD; replace the command mapping, data object, theme or action button class. Keep model objects stable and broadcast after edits. Essential presentation stays in the Blueprint assets/public plugin features; scene/demo behavior stays in the example project.

The current HUD's cards share viewport-relative header/bottom docks and Fill-weighted columns. This prevents the previous fixed-width cards from overlapping at enlarged scale. Standard Scroll Boxes keep longer contexts and orders reachable; Instant Scroll and centered navigation reveal the focused command. Docs/RESPONSIVE_LAYOUTS.md gives the exact Designer arrangement. No action/data graphs changed during this layout upgrade.

Verification boundary ​

The saved custom button/entry workflow also supports contextual descriptions through Blueprint tooltips. WBP_OutpostCommand and WBP_EmberAction bind their existing models with Set Tooltip Data after availability and clear it on release. WBP_ForgeTooltip provides theme-aware content through public entry events. Evidence/TOOLTIP_RUNTIME.md records source/cooked normal/enlarged, live updates, synthetic switching, focus/modal/world-pause checks and the latest cooked RTS regression. Physical devices and complete UI polish remain open.

Main and Pause UE5.6.1 DX11 live automated mouse/keyboard checks passed: main Back prompt/cancel, Begin through adapter, Pause Back/resume, return confirmation binding and settings push/Back/focus restoration. The first authoring run failed on an unallocated Back return pin; creation now uses the inherited function signature and the rerun compiled with 0 errors/warnings. The Blueprint HUD populated all five models, dispatched patrol with visible movement/objective/+40 supplies, and spent 60 supplies on training with advancing progress and scout count increasing from six to seven. Runtime wrapping/empty-caption gaps were repaired through Blueprint and visually retested; resource values now fit one line and captions collapse. Keyboard Pause/resume restored the HUD's Patrol focus. Physical controller/touch, performance, additional resolutions, replacing the backend entirely in Blueprint and packaging this newer revision remain open.

UIForge v0.1.0 · Blueprint and C++ development documentation.

Enlarged documentation image

Enlarged documentation image