Skip to content

One menu Blueprint, different game flows ​

WBP_AshenMainMenu and WBP_AshenPause are shared by the original Outpost and Emberwatch examples. Their labels and confirmation copy consume optional IFDataSource models through ordinary Blueprint graphs. There is no native game-specific menu subclass or additional core dependency. Game Master's design remains exclusive; these trees and assets are independently authored.

Supply your game's wording ​

  1. On your adapter Blueprint, implement IFDataSource → Get UI Model.
  2. Use Construct Object from Class: IFPresentationData for a named model, set its Title and/or Detail, and retain it in your adapter. Return that object for the agreed Model Name.
  3. Pass the adapter as Data to Push Screen or Push Screen Async. The screen calls parent Initialize Screen, then its editable Refresh Menu Presentation custom event.

For the shared sample menus, these optional names are agreed with their adapters:

Model NameFieldConsumerEmberwatch example
FrontEndTitle / DetailMainTitle / MainDetailEMBER + line break + WATCH / introduction
FrontEndBeginTitleMain PrimaryChoice labelBegin journey
FrontEndResumeTitlePause PrimaryChoice labelResume journey
PauseIdentityTitle / DetailPause publisher / headingJOURNEY AT REST / Paused
ReturnPromptTitle / DetailReturn dialog title / messageEnd this journey? / current journey will be reset
ReturnActionTitleReturn dialog confirmation labelEnd journey
QuitPromptTitle / DetailMain quit dialog title / messageLeave Emberwatch? / default close-game message
QuitActionTitleMain quit confirmation labelOptional; default Quit

These names belong to the sample's editable Blueprint contract, not a required InterfaceForge schema. Outpost supplies no optional menu models and uses the saved Ashen Reach/expedition fallbacks. You can choose different names and your own UObject models by editing the helper graph. Gameplay action names remain a separate adapter contract: changing “Begin journey” does not rename or bypass BeginExpedition validation.

Actual saved helper graph ​

Open either menu's Read Menu Text function, category Menu Presentation. Inputs are Model Name, Fallback Text, Read Detail; output is Return Value. It uses public Get UI Model, Cast To IFPresentationData, Select Text, Text Is Empty, Branch and normal return nodes.

flowchart TD
    E[Read Menu Text: Model Name, Fallback Text, Read Detail] --> M[Get UI Model → Cast To IFPresentationData]
    M -->|Cast Failed| F[Return Fallback Text]
    M -->|Success| S[Select Text: Detail when Read Detail; otherwise Title]
    S --> B[Text Is Empty → Branch]
    B -->|True| F
    B -->|False| R[Return selected model field]

The main Refresh Menu Presentation event calls this helper for FrontEnd Title/Detail and FrontEndBegin Title, then Set Text or Set Label on the existing named widgets. Pause does the same for PauseIdentity and FrontEndResume. Every initialization resolves every field, including fallbacks, so a previously reused Emberwatch menu cannot leave journey text behind when its new source is missing or unrelated.

Fallback Text is an ordinary editable input value on each helper call. Edit those pins when changing defaults; update the corresponding Designer labels for an accurate editor preview. They are saved values, not automatically read from the live widget's previous label. Using a previous runtime label as a fallback would reintroduce stale context. You can replace these literals with your own Blueprint variables or localization data.

Menus do not subscribe automatically to every optional model. These are normally flow identity/configuration values. After an intentional live edit, call Refresh Menu Presentation on the existing screen. It rereads the models without replacing the screen, moving focus or restarting transitions. For continuously changing gameplay displays, use the documented observable IFEntry workflow instead of polling menu fields.

Confirmation text and behavior ​

Open Exit Confirmation constructs a fresh IFDialogData. Before each Set Title, Set Message and Set Confirm Label, it calls Read Menu Text for QuitPrompt/QuitAction or ReturnPrompt/ReturnAction. Missing models or empty fields keep the saved fallback. Bind Event to On Completed → Push Dialog remains unchanged. Confirmed requests QuitGame or ReturnToMainMenu; Cancelled changes no gameplay state. The helper reads current copy when opening, rather than retaining a previous dialog's data or callbacks.

Expected: Emberwatch uses journey text through the same classes that Outpost uses for expedition text. Settings, journal, Return to main menu, initial/restored focus and semantic theme/input behavior retain their existing contracts. Only the adapter decides what an accepted action does.

Verification scope ​

Menu-binding runtime record records exact versions, failures, default/enlarged source/package flows, same-instance source reset, missing/unrelated/empty source handling and a live label refresh retaining Settings focus. Synthetic Slate input and programmatic source changes are explicit. Physical-device tests, arbitrary translations and full release polish remain open.

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

Enlarged documentation image

Enlarged documentation image