Appearance
Emberwatch: an RPG interface through public features
Historical example recipe. The current UE5.8.3 Ironfront/Emberfall interfaces and their public Blueprint workflows are in army and RPG HUD authoring and the current gallery. Earlier paths and engine references below describe the retained earlier example.
Open /Game/Maps/ForgePilgrimage in the standalone UE5.6.1 project and Play. Begin journey → Interact → Carry the embers → Approach → Kindle completes the small scene's objective. Ward restores the two demonstration vitality displays and shows a timed status. Pause offers the same settings, journal and return confirmation used by the RTS example. The example has its own original layout, frames, vector icons and primitive scene. Game Master's bespoke visual design remains exclusive to Game Master.
The backend is AForgePilgrimage in the example project. It implements IFDataSource and owns these local demonstration actions. It is not a combat, ability, inventory or multiplayer implementation. InterfaceForge contains no reference to this actor or its controller. A project can replace it with a Blueprint object implementing Get UI Model and Request UI Action.
Compose the HUD
WBP_EmberRPGHUD, WBP_EmberAction and WBP_EmberActionButton are saved, editable Widget Blueprints under /Game/UI/Blueprint. Their graphs use public plugin and standard Unreal nodes. The authoring editor module is not required at runtime or to edit these assets.
| Model name | Presentation in this example | Updates |
|---|---|---|
| FrontEnd | Shared main menu Title/Detail | Branding supplied by this data source |
| Hero / Companion | Reused WBP_ProductionReadout | Title, vitality Detail and Fraction |
| Quest | Reused WBP_HUDReadout | Accepted, current task and completed text |
| Context / Notice | Context panel | Interaction target and action feedback |
| Status | Timed party status | Title and remaining seconds |
| Kindle / Ward / Step | WBP_EmberAction | Stable Key, Title, Fraction, Quantity, Enabled, Unavailable Reason |
Event Initialize Screen → Parent: Initialize Screen → Get UI Model → Initialize Entry binds each readout. Stable model objects broadcast Notify Data Changed; entries refresh without scanning actors. For each action entry, set Sigil Style before Initialize Entry, then assign Action Source from the screen's Data afterward. Initialize Entry first releases the previous binding, and the custom release graph clears Action Source. Assigning the source before initialization would erase it.
On Entry Refreshed → Cast to IFPresentationData drives these public nodes:
- Set Label, using Title, on AbilityChoice.
- Set Remaining Fraction, using Fraction, on CooldownTint.
- To Text (Integer) → Set Text, using Quantity, on CountdownText.
- Set Action Availability, using Enabled and Unavailable Reason, on AbilityChoice. The entry remains navigable during cooldown; the provider also rejects unavailable commands.
- Get Dynamic Material → Set Scalar Parameter Value, with Parameter Name
Sigil, using Sigil Style on SigilImage. Get Dynamic Material has execution pins; connect them. - Quantity > 0 → Branch → Set Visibility shows the tint/countdown plate during cooldown and collapses them when ready.
On Button Base Clicked → Cast Entry Data → Request UI Action (Message) sends Stable Key to Action Name and Action Source to Target. The provider validates the request. This is the same interface a developer-created Blueprint entry can call. The example rejects Approach before accepting the keeper's request and after arrival, preventing an unreachable quest and repeated teleporting. This rule belongs to the example adapter.
On Entry Released clears Action Source, label and countdown text, resets the tint fraction, collapses its layers and disables interaction. The base entry unbinds its model. Every subsequent initialization supplies new data before interaction.
The inspected cooldown behavior
The icon has a 80×80 outer frame, 9-unit interior padding, and an Overlay containing the original SigilImage, InterfaceForge Center Tint, and a countdown plate. The tint covers the interior above the icon; the frame stays clear. Its boundary meets at the center. As remaining fraction decreases, the clearer region opens clockwise from the top. This independently authored material reproduces the inspected Sakura behavior; no source icon, frame, material graph or package is redistributed.
| Public control | Meaning |
|---|---|
| Set Remaining Fraction | 1 starts covered, 0 uses passed-region opacity throughout |
| Remaining Opacity / Passed Opacity | Defaults .75 / .15, matching the inspected action-bar instance |
| Tint | Overlay color |
| Start Angle | Turns clockwise from the top; .25 starts at the right |
| Reverse | Reverse the opening direction |
| Refresh Tint | Apply changed Designer/property values to this image's own MID |
A plain Image may use /InterfaceForge/UIForge/Materials/M_IFCenterTint directly. Material parameters are Percent, PassedTimeOpacity, RemainingTimeOpacity, StartAngle, Reverse, and Color. Supply normalized remaining time through Percent; the UI material starts no timer and knows no ability system. The example provider advances one pause-aware clock, broadcasts changed fractions and ceil-rounded seconds, and freezes while a menu or modal covers the HUD.
The example-only /Game/Art/M_EmberSigil has Sigil (0 ember, 1 ward, 2 approach) and Color. On Appearance Updated → Get Dynamic Material → Set Vector Parameter Value, Parameter Name Color, applies Select Color (Theme.Accent when Enabled, Theme.Muted Text otherwise). Only the icon changes color; the tint's .75/.15 opacities remain unchanged. Replace this Image's material or brush in Blueprint to use your own artwork.
Explain unavailable actions
Set Action Availability (Available, Reason) blocks activation through CommonUI while keeping the button in keyboard/controller navigation. It does not validate gameplay rules. The example provider remains responsible for accepting or rejecting Request UI Action.
Add a Text Block named AvailabilityWidget to a custom IFButton tree to display the reason automatically. The name is an optional binding, like LabelWidget and FocusBorder. The reason is visible for every input family, needs no hover or failed click, follows the theme/text scale, and collapses when available. Custom trees may instead read Unavailable Reason or handle On Appearance Updated. That event's Enabled value now represents actual interaction availability, including CommonUI's interaction-enabled flag.
The original RPG entry reserves 168 units of minimum height for stable action targets and allows longer translated reasons to grow. Its examples show Speak with the keeper first, Recovering, and Already at the hearth. After acceptance/cooldown completion the reason clears and the icon returns to the accent color. On Entry Released → Set Action Availability(false, empty Reason) clears the previous reason before recycling. For tint-bearing buttons, keep CommonUI's Apply Alpha On Disable disabled so unavailable styling cannot silently halve your configured material opacity.
The original action-button appearance graph ends with Get Focus Border → Set Padding (Left/Right 8, Top/Bottom 4). This overrides the theme's roomy menu padding for a compact HUD control without duplicating a theme or editing the plugin. Focus Border, Label Widget, and Availability Widget are optional, read-only Blueprint component references in InterfaceForge | Designer. Check that they exist before accessing them in a different tree. The appearance event runs after the native defaults, so a custom Blueprint can apply its own component presentation there.
The action dock's Canvas slot spans anchors (0, .54) → (.65, 1) with margins (24, 0, 12, 24). This gives enlarged action cards enough vertical space for the reason. Keep both the desired card height and the available pane height in mind: focus scrolling cannot display an entire card when the card itself is taller than the pane. Use standard Designer anchors/padding, wrapping and Scroll Box settings to adapt your own HUD.
The fixed160-unit entry uses Wrap Text At144 on AvailabilityWidget alongside automatic wrapping. Source1280×720 lock/unlock/recovery/arrival interactions passed. The explicit-width repair now passes actual desired/allocated bounds at measured800×600,1280×720 and1920×1080 with150%UI/text. Source and cooked800×600 offscreen DX11 captures show the full reason. Cooked native interaction retest remains open. See Evidence/ACTION_AVAILABILITY_RUNTIME.md for exact revisions; this limited layout proof is not release readiness.
Compact passive readouts without new classes
The RPG uses the same WBP_ProductionReadout for both party members and WBP_HUDReadout for the objective. In Initialize Screen, after Parent: Initialize Screen, it gets each instance's Readout Title and Readout Detail, sets the InterfaceForge Text Base Size to12, and calls Refresh Appearance. The ordinary model initialization chain follows. These local instance changes leave the RTS and journal's typography intact; no new theme or readout subclass is needed. Later theme/text-size events use the configured Base Size.
The party and quest surfaces use bottom anchor Y=.36 with the same margins. The example adapter publishes LYRA ·72% and ORIN ·86% in Title, leaves redundant Detail empty, and supplies Fraction for the existing progress bars. The percentage and bar both change when Ward restores vitality. Your adapter can supply different names and values through the same model contract. This is presentation data, not a plugin-owned health system.
The saved header hierarchy now content-fits these surfaces inside PartyHeaderFit and QuestHeaderFit, ordinary Overlay widgets. Their Canvas slots retain the .36 bottom anchor as available space; the surface's Overlay slot has Horizontal Alignment Fill and Vertical Alignment Top. Surface padding is14. The existing clipped Scroll Box and readout column remain inside. This gives short content only the height it needs and retains bounded scrolling for longer content. It does not scale down semantic text or replace the model graphs.
You can recreate this in Designer: wrap the surface in Overlay, move its previous Canvas anchors/offsets to that Overlay, and set the surface slot to Fill/Top. Change padding or anchor bounds for your own layout. Keep Initialize Entry, On Entry Refreshed and Notify Data Changed as documented above; layout does not change the binding contract. Responsive recipe and runtime evidence contain actual measurements. Initial English party/objective content fits at both tested scales; arbitrary later-state/localized text and the lower HUD's broader polish remain open.
Maximum-scale structural checks fit both complete party rows and the initial objective at measured800×600/1280×720/1920×1080. Source and cooked800×600 DX11 captures were visually reviewed with both percentages, bars and the complete objective visible. Later quest states, longer localization and cooked interaction remain separate checks.
Customization and navigation
Change the screen's Designer anchors, entry classes, images, or On Entry Refreshed graph. Use Set Theme or a widget Theme Override for semantic colors, typography, spacing and audio. The shared main menu consumes optional FrontEnd Title/Detail; the example supplies an intentional two-line EMBER / WATCH title. Long unbroken titles also allow per-character wrapping through ordinary Text Block properties.
Bounded Scroll Boxes use Instant Scroll. The action region uses Navigation Destination = Bottom or Right, keeping its label and unavailable reason visible when the whole tall card cannot fit at enlarged text size. Context panels retain Center. Event Construct → Set Navigation Rule Explicit links connect Kindle ↔ Ward ↔ Approach ↔ Interact, and Interact ↔ Pause vertically. Apply links in Construct after the nested widgets have their Slate targets; On Initialized is too early for these cross-tree links. This allows a directional move to reveal a button outside the current scroll view. At 800×600 with 150% UI and text, the action row wraps; some passive text and the upper portion of a tall card are scrollable rather than simultaneously visible. InterfaceForge Text defaults to standard character wrapping for long words; its normal Designer wrapping settings remain overridable. Native IFActionPrompt's text occupies a Fill slot and wraps long labels. Developers can provide their own prompt class using On Prompt Updated and the resolved key/glyph/text.
The saved WBP_EmberRoot chooses the same result body as WBP_ForgeRoot with a different public Notification Dock. A reserved lane separates party/objective panels from the lower action/context area, which begins at Y=.54. Blueprint notifications documents actual Ward/hearth results, owner cleanup, class replacement and current test limits.
WBP_EmberActionButton also reveals feedback that grows after an action, without requiring another focus move. On Appearance Updated runs a Sequence: the first path applies its existing appearance immediately; the second checks Navigation Focused → Delay Until Next Tick → Has Focused Descendants → Find Parent Widget Of Type (Starting Widget=self, Type=ScrollBox) → Cast To ScrollBox → Force Layout Prepass → Scroll Widget Into View (Widget To Find=self, Animate Scroll=false, Scroll Destination=Bottom or Right, Padding=4). Connect the execution pins on Find Parent Widget Of Type; it is callable rather than pure. A missing parent exits through the cast failure. This standard Blueprint graph follows CommonUI's parent lookup across nested widget trees and remeasures the changed caption before revealing it. It preserves the entry class, model and command routing. Native pointer/touch interactions and interrupted/paused deferred updates still need broader testing.
Keep context actions reachable
The latest saved context surface contains ContextReadoutDock, a Vertical Box. Its clipped ContextReading Scroll Box takes the Fill slot and holds Context/Notice/interaction prompt. PinnedContextActions below it holds Interact and Pause, separated by8units. These controls remain reachable while longer prose scrolls. The surface uses12units padding, with8units below the reading region. This uses standard Designer layout features and the existing public buttons.
Event Construct → Sequence retains explicit navigation on its first path. Its second path sets ContextReadout and NoticeReadout's Readout Title / Readout Detail → Base Size=12 → Refresh Appearance. The adapter supplies compact KEEPER/HEARTH context names, keeping descriptive story text in dialogue/objectives. A smaller font alone did not make the original wrapped title fit at800×600150%; the current full-title and pinned-control bounds assertions pass in source and the exact package. See loading/arrival evidence.
Begin now calls the public async loader through the separate example adapter. Ready initializes the same Blueprint HUD with its provider; cancel/failure preserves the main menu, and the saved failure dialog offers return/retry. No gameplay starts before Ready. Blueprint loading explains replacing the body and using the actual node present in the shared Settings click graph.
The same common input presentation, screen input policy, focus and settings services run in both genres. Mouse/keyboard automation is runtime evidence; physical controllers, touch and non-Windows platforms remain unverified. See the verification records for the tested revision and remaining gates. This is a development example, not a finished release.
Bottom action dock and status layout
The saved ActionDockFit Overlay retains the responsive action-region Canvas slot and content-fits ActionDockColumn with Fill/Bottom alignment. StatusReadout is an Auto first child outside the scrolling action region; the original Scroll Box is the Fill second child. Its existing ActionColumn/Wrap Box/entry hierarchy and Construct navigation links remain. Cards use Width Override160/Min Desired Height168/no fixed height. Long reasons grow and scroll.
StatusReadout enables the shared entry's Presentation → Inline Detail option. Its Title/Detail use Base Size12/Refresh Appearance; normal quest/RTS readouts keep stacked mode. This ordinary editable Blueprint choice is documented with actual nodes in Readout layouts. Configure it before construction; a live Boolean toggle alone does not run a layout-refresh event.
Current5.6 source and exact fresh cooked checks at1280×720/defaults and800×600/150% UI/text verify the whole focused Ward icon/tint/countdown, recovery reason and pinned party status. Synthetic Down reaches Pause, Up returns to Interact, Left reveals Approach and its complete unavailable reason. A tall Approach card can still scroll its upper icon away at enlarged settings. Action runtime evidence also records14complete/scoped current results and the failures that drove these bounds checks. Physical devices, broader tooltip placement, long translations and final HUD/scene polish remain open.
Descriptions without covering cooldowns
The saved HUD registers NavigationHintHost through the public screen node and uses WBP_ForgeContextHint for keyboard/controller descriptions. Its centered, content-fitted Surface stays inside the .36→.54 lane. Result messages take reading priority; while Ward's result is active, the hint is hidden and the full cooldown/status stay unobscured. After the result, navigation descriptions return. Pointer hover uses the original customizable popup; blocked actions can now show it through native outer-widget mouse events without enabling activation. Host recipe gives the actual nodes and input/lifetime contract. No change to the inspected center tint, material parameters, icon masking, countdown or provider clock.
Current glyph revision: the example opts into original neutral CommonInput face-position art; remap Apply refreshes IFActionPrompt in place, and empty Action Label shows only a glyph/readable key. RPG header keeps the cue visible beside scrolling prose with a.62shared divider. Current29Blueprint source/archive runtime proof is5.6; the newer28-class sample proof above predates it. Glyph authoring recipe and exact runtime/limitations. Physical controller tests remain explicitly deferred.
The context/action docks also use normal editable Canvas anchors to retain the enlarged interaction heading inside a reduced Safe Zone. Narrow action areas can wrap into a scrollable column; focus reveals Ward and preserves its recovery/tint feedback. Safe-area authoring documents the current layout and verification scope.