Ordered implementation contract · no calendar estimates

HUD & UI Implementation Plan

แผน implement แบบละเอียดสำหรับเปลี่ยน UI ปัจจุบันไปสู่ Hybrid CommonUI + UMG ตาม FEAT-HUD-UI โดยแยก verified baseline, target architecture, C++ work, user-only Widget Blueprint work, dependency gates, migration, testing และหลักฐานที่ต้องมีเพื่อผ่านแต่ละ milestone

Status: draftOwner: UnassignedUpdated: 2026-09-18UE 5.8

Production schedule — 2026-09-13: PIPE-ROADMAP now defines 32 focused phases (P00–P31). Phase 0/1/2/3 references retained in this document are legacy scope bands, not the new phase numbers. The owner confirmed limited-area core-loop proof before full-map expansion; see the roadmap for dependencies, audited status and remaining work.

Problem, Scope & Execution Boundary

UI ปัจจุบันเป็น UMG widgets ที่ถูกเปิดโดย GameInstance subsystems แยกกันและยังไม่มี screen stack กลาง ขณะที่ target design ต้องรองรับ menu navigation, modal priority, controller focus, dynamic glyphs, multiplayer input blocking, SP pause, localization และทุกระบบที่ยังพัฒนาไม่ครบ แผนนี้จึงสร้าง foundation ก่อน แล้วค่อยย้าย screen แบบ vertical slices โดยไม่ตัดระบบเดิมพร้อมกันทั้งหมด

Included

  • C++ UI framework, presentation data, events และ input routing
  • CommonUI activation stack + passive UMG HUD
  • Widget Blueprint hierarchy และ Unreal MCP implementation เมื่อ tool coverage รองรับ
  • 64 SVG icon import plan และ controller glyph mapping
  • Frontend, HUD, inventory, map, crafting, workbench, building, vehicle, boss, social, death, settings และ accessibility
  • Automation-test targets, compile/cook gates และ user-run PIE matrix

Execution boundary

  • Agent แก้ source/config และสร้าง แก้ compile save Blueprint assets ผ่าน Unreal MCP ได้
  • Agent ไม่ใช้ computer-use กับ Unreal และไม่เริ่มหรือควบคุม PIE; เฉพาะผู้ใช้รันและบันทึกผล
  • งาน import/editor ที่ Unreal MCP ไม่มี factory หรือ property coverage ต้องส่งต่อผู้ใช้พร้อมขั้นตอนตรงจุด
  • ไม่กำหนดวัน, effort estimate, assignee หรือ performance budget ที่ยังไม่ได้อนุมัติ
  • ไม่สมมติ backend สำหรับ gameplay feature ที่ยังไม่มี
Definition of implementation-ready: งานที่พึ่ง TBD สามารถสร้าง shell, contract และ unavailable/empty state ได้ แต่ห้ามเขียน authoritative behavior แทนคำตอบที่ยังไม่ตัดสิน

Verified Current Implementation vs Target

7verified non-glyph UI assets
12existing UI C++ classes
8→10Quick Slot migration
5→8survival-bar migration
AreaVerified current stateTarget / consequence
DependenciesImplemented and owner-verified for G1: CommonUI is enabled; CommonUI/CommonInput are module dependencies; UCommonGameViewportClient is configured.The owner completed the configured viewport and local-player PIE checks on 2026-09-07.
Widget spawningImplemented and owner-verified for G1: ULambeerUIManagerSubsystem owns the root, layers, blocking input and compatibility presentation. The HUD, inventory and character-creation subsystems route through it. WBP_UIRoot exists with the verified four-layer hierarchy.The owner reported the G1 runtime creation, layer, focus, input restoration and pause matrix passing on 2026-09-07.
HUDG3 PASS 2026-09-10: After owner Editor reopen, Unreal MCP compiled/saved WBP_HUDRoot with StatusBars, Compass, PromptHost, BloodOverlay, Text_Weight, ScreenEffects, Reticle, Minimap, ContextStatusList, Hands and QuickSlots. Child assets: WBP_Hands, WBP_QuickSlots, WBP_Reticle, WBP_Minimap, WBP_ContextStatusList, WBP_ScreenEffects. WBP_StatusBars has eight bars. WBP_HUD is preserved as fallback; HitMarker was removed from that asset. MCP GetWidgets on WBP_HUDRoot shows no empty BindWidget holes and no HitMarker. Owner reported eight GAS-colored bars, UI_G3GiveBackWeapons, ADS-hidden reticle, no HitMarker, nearby 2 m / LOS blood, low-health 30/20/10 edges, rain-lens droplets, and prompt quantity/denied on 2026-09-10.Passive HUD remains UMG and updates from ULambeerHUDAdapter snapshots. Skeletal L1810, magazine-as-item and material wet-look are G3.2. Rain VFX is out of G3. HOLD text waits for an interactable with duration > 0.
Hit feedbackC++ HitMarker API is gone. Unreal MCP removed the HitMarker widget from WBP_HUD. After Editor reopen, WBP_HUDRoot has no HitMarker bind. A repository search of Source/Lambeer finds no hit/headshot/kill marker presentation path. Owner reported no HitMarker in dedicated-server PIE on 2026-09-10.No further G3 hit-marker presentation work.
SurvivalGAS attributes Energy/Sleep/Immunity exist with Init 100 / Max 100 and session replication. The server survival tick applies approved DA_SurvivalTuning drain/regen. Jog drains 1 Energy every 5 seconds; sprint (Run) drains 1 Energy every 1 second. Sleeping dims the screen slightly (alpha 0.22). Owner reported bed sleep and that dim passed in PIE on 2026-09-09. Status bars bind from adapter delegates rather than Tick polling of gameplay values.Do not invent unapproved rates or save-format values. UI must not synthesize missing backends.
InventoryUse-quick assignment no longer requires bUsableFromQuickSlot; possessed items including held stacks can bind to HUD slots 3–0. HUD display uses 10 slots with 1–2 reserved for Back Weapon. HeldHand ↔ UseQuick pairing is implemented. G4 UI-CORE-001 owner-reported pass 2026-09-12: activatable inventory; Tab opens and closes without crash; Escape/Close still work. G4 UI-CORE-002 owner-reported pass 2026-09-11 commands and 2026-09-12 worn-slot/Tab retest: merge/split/drop/sort/search/Use/Equip/pickup routing, Worn row, and sandbox clothing pickups. The owner-approved presentation and side-by-side loot layout retain UI-CORE-003 and move to G4.2.G4.2 implementation in progress 2026-09-13: Unreal MCP imported /Game/Lambeer/UI/Inventory/Textures/T_UI_Inventory_Panel_9Slice, T_UI_Inventory_Slot_9Slice and T_UI_Inventory_FocusCorners. UE 5.8 has no TC_UserInterface2D; these textures use the same verified UI mapping as G2 icons: TC_EditorIcon, TEXTUREGROUP_UI, TMGS_NoMipmaps, Never Stream, Clamp, sRGB. Designer WBP_Inventory is Safe Zone → header → 36/64 split → Q1–Q0 → action hints, with Worn on Box_WornSlots above Scroll_Containers and duplicate BackSlots collapsed. /Game/Lambeer/UI/Inventory/WBP_ContainerTransfer is parented to ULambeerContainerTransferWidget. Unreal MCP bound designer Transfer_Target in WBP_Inventory and compiled/saved the inventory widgets against the rebuilt Editor. Owner PIE 2026-09-13 showed missing inventory string-table keys, then later the 36/64 hierarchy with gray engine buttons and overlapping Worn labels (not a chrome pass). 28 Inventory.* keys are saved; designer slot/panel chrome was written and widgets compiled/saved. Owner PIE retest after C++ rebuild is not recorded. The concept PNG remains design reference only. Character capture remains a placeholder. G4 UI-CORE-004 owner-reported pass 2026-09-13: world map screen, local category filters, pan/zoom/center, server-validated shared ping, and temporary map image T_WorldMap_Temporary (1024×576, not geographically registered). Unreal MCP created/compiled/saved /Game/Lambeer/UI/Map/WBP_WorldMap after the owner Editor reopen (parent ULambeerMapScreen; empty designer tree; C++ fallback layout still builds at runtime). Owner reported missing icons after UI_G3AddMarker Death, then that the full-map death diamond was still missing and that the minimap must show the same image with a smaller center pip. Owner later reported the minimap image rotating with the camera and the full-map death diamond following the pawn. Source now uses a frozen 50 m fallback while the map is open, filled diamonds, a world-XY chevron, a north-up minimap image, and an 8 px player pip. Owner-reported pass 2026-09-12 for that north-up / frozen-death retest. Owner-reported pass 2026-09-13 for pan/zoom/center, shared ping, filter toggles and map↔inventory Tab switching. Canvas clips to bounds so zoomed paint stays inside the map panel. Owner-reported pass 2026-09-13 for that zoom clip retest. G4 UI-CORE-005 owner-reported pass 2026-09-13. G4 UI-CORE-006 owner-reported pass 2026-09-13: death/respawn screen, Last Bed after Sleep, and Fresh Spawn to the four sandbox towns. Immediate-respawn close already passed 2026-09-12. Sandbox towns are not production geography. G4 UI-CORE-007 owner-reported dedicated-server pause 2026-09-12 and standalone PAUSED 2026-09-13. G4 UI-CORE-008 owner-reported pass 2026-09-13.
HandednessELambeerItemHandedness defaults to OneHanded. Held-item placement rejects two-hand occupancy when the other hand is filled. Per-item TwoHanded tagging is still user asset work.Author TwoHanded on real item Data Assets; Crowbar/Pistol stubs stay OneHanded until tagged.
InteractionFInteractionPromptState is emitted to the HUD adapter. WBP_HUDRoot owns PromptHost and projects/clamps in C++. Denied candidates can still focus for a denied prompt. Legacy prompt widget spawn is skipped when the HUD PromptHost exists. Quantity uses pickup stack count; denied uses generic Cannot interact; hold text requires GetInteractHoldDuration > 0. Owner reported prompt quantity/denied on 2026-09-10.No G3 debug hold fixture. HOLD presentation waits for a real hold action.
TestsSource/Lambeer/Tests/LambeerHUDContractTests.cpp covers reserved slots, status sort, compass offset and WorldYawToHudYaw (look-right from north is HUD east / screen-right), observation invalidation, low-health tiers, overlay alpha, two-hand lock helper, reticle mapping, firearm inspection/blood-distance rules, skeletal mesh resolve, magazine-as-item rules, inventory activatable parent, inventory command helpers (ExpectedItemId match, sort compare, auto-equip eligibility, split-half quantity, merge-to-MaxStack), G4.2 Worn presentation order plus slot size / label size / 36+64 fill tokens, map view helpers, pause session rules, pause activatable parent, and settings persist/confirm rules plus settings activatable parent. Inventory Search assertions were removed with the feature on 2026-09-14. Headless non-PIE Lambeer.HUD passed 24/24 on 2026-09-14 after the look-right E/W follow-through (report: Saved/Automation/CompassEWFix/index.json). Source/Lambeer/Tests/LambeerPersistenceContractTests.cpp covers P07 schema, codec, migrate/refuse, checksum/rollback and world-index file rules; headless Lambeer.Persistence passed 6/6.Owner runs Widget/PIE validation; controller coverage remains deferred until hardware. P07 restart/rejoin PIE remains owner-only.
Character creation[OWNER-REPORTED VISUAL/PERSISTENCE PASS 2026-09-16] Native creation subsystem/widget and WBP_CharacterCreation use the owner-approved street box blockout via a client-only streamed stage and cosmetic MetaHuman preview. Owner reported the remaining visual checks and remaining persistence/restart/rejoin checks passed. [OWNER-REPORTED DEDICATED FOLLOW-CAMERA PASS 2026-09-16] Extra dedicated first-time creation now restores the hip follow camera behind the pawn; returning clients that skip creation do not cover this. Barber remains on its portrait path. See canonical evidence. Final environment assets and art lighting/time of day remain later content.G5 stays open for Steam/Feedback/production-map work. Do not reopen this visual/persistence, follow-camera, or Null/LAN join slice from that remainder.
GlyphsXbox and PlayStation imported assets exist under Content/Lambeer/UI/ControllerGlyphs/.Map verified assets through CommonInput controller data; do not rename until package license/source verification.
PersistenceP07 owner-reported pass 2026-09-14: USaveSubsystem installs USQLiteSaveBackend per opened world (Saved/Lambeer/Worlds/<id>/world.db). Create/list/rename/delete/open, missing/corrupt/incompatible probes, 30-second dirty flush, critical flushes and remembered-world pointer in ULambeerUserSettings are implemented. Headless Lambeer.Persistence passed 6/6. UE 5.8 SQLiteCore omits WAL; committed transactions are the crash-safety surface. Owner Dedicated Server + two Preview restart/rejoin restored player/world state, collected map pickups and dead-save spawn select. P08 owner-reported pass 2026-09-16: Main Menu/Continue/Save World Select, character-entry restore, spawn recovery and Pause Save/Exit persistence passed. Dedicated Null/LAN advertise, Pause disconnect and Server Browser join/rejoin are implemented; owner reported Refresh/Join 2026-09-16. Steam/production-map work stays blocked.UI calls session/save services; it never invents durable state. Deferred production destination stays UI-FE-008/ROAD-P08-04.

Gate G0 Baseline & Review Evidence

Gate state: PASS — closed 2026-09-06. Owner resolved TBD-HUD-UI-001, TBD-HUD-UI-002, and TBD-HUD-UI-008, approved the migration/rollback strategy, and supplied the interaction/input baseline below. The inability to drag an item into a Quick Slot is a captured legacy gap assigned to G3, not a G0 blocker.

Decision and evidence register

TaskVerified evidence (2026-09-06)Required close actionState
UI-PLN-001[CONFIRMED] Back Weapon 1–2 exclusively reserve numbered slots 1–2. Other items cannot be bound to those two slots; no displaced manual binding or restore behavior exists.Implementation tests must reject non-Back-Weapon assignment to reserved indices 0–1 and verify Back Weapon removal leaves the reserved slot empty.Complete
UI-PLN-002[CONFIRMED] Owner approved the documented palette, layouts, and exactly 64 SVG solid/silhouette icons on 2026-09-06.Use the approved sources for G2 import; retain source/license provenance before shipping.Complete
UI-PLN-003[CONFIRMED] Use Google Sans from RawResource/Fonts/Google_Sans/. Sixteen TTF files were found and each contains 87 Thai-block codepoints including the basic Thai set. Font metadata and the official source repository identify SIL Open Font License 1.1 without Reserved Font Names; OFL.txt is retained beside the fonts.Target /Game/Lambeer/UI/Common/Fonts/FF_UI_Primary; Regular is the default face with Medium/SemiBold/Bold variants. Google Sans supplies English and Thai glyphs; verify shaping, line breaks and tabular figures after user import.Complete
UI-PLN-004Unreal MCP asset/config/reference audit completed. Development Game target compiled and linked successfully; log: Saved/Baselines/HUDUI_G0_GameBuild.log. The initial Editor build was blocked at final DLL link by the running Editor (LNK1104); after closing the lock, the owner reported a successful clean Editor build on 2026-09-06 and the rebuilt Binaries/Win64/UnrealEditor-Lambeer.dll was verified on disk.Baseline compile evidence is complete. The existing warning that HairStrandsCore is used without declaring the HairStrands plugin remains recorded for G1/project cleanup.Complete
UI-PLN-005User supplied legacy HUD, inventory, and interaction-prompt screenshots. The owner reported that Wood can be dragged among Hand 1, Hand 2, and Pocket, while dragging Wood into a Quick Slot does not work. Unreal MCP logs corroborate two user-run L_Dev_Sandbox PIE sessions using a dedicated-server world plus two clients; all three worlds tore down after each session. No agent-run PIE claim is made.Baseline is complete for migration comparison. Preserve the Quick Slot drag failure as a known legacy gap and verify its correction under UI-HUD-010 in G3; controller, denied/out-of-range, and hold behavior remain unverified rather than implicitly passed.Complete

Verified legacy asset-reference snapshot

AssetHard package dependenciesRegistry referencersMigration disposition
/Game/Lambeer/UI/Common/WBP_InteractionPromptSlateCore, UMG, UMGEditor/Game/Lambeer/Characters/Player/Blueprints/BP_PlayerCharacterPreserve path until the player Blueprint is manually migrated and verified.
/Game/Lambeer/UI/HUD/WBP_HUDWBP_Compass, WBP_StatusBars, Lambeer/UMG modulesNo registry referencer; loaded by config and C++ fallback soft class path.Preserve as compatibility HUD until the new root passes cook and user PIE.
/Game/Lambeer/UI/HUD/WBP_CompassLambeer/UMG modulesWBP_HUDMigrate behind the new HUD adapter before any move/rename.
/Game/Lambeer/UI/HUD/WBP_StatusBarsLambeer/UMG modulesWBP_HUDMigrate behind event-driven state before any move/rename.
/Game/Lambeer/UI/Inventory/WBP_InventoryWBP_InventorySlot, Lambeer/UMG modulesNo registry referencer; loaded by config and C++ fallback soft class path.Preserve as compatibility screen until CommonUI activation passes user PIE.
/Game/Lambeer/UI/Inventory/WBP_InventoryContainerLambeer/UMG modulesNo registry referencer reported.Preserve; runtime creation is a code/config path not represented as a hard package reference.
/Game/Lambeer/UI/Inventory/WBP_InventorySlotLambeer/UMG modulesWBP_InventoryPreserve through inventory-screen migration.

Config snapshot: DefaultGame.ini points HUD and inventory soft classes to WBP_HUD and WBP_Inventory. Lambeer.Build.cs includes UMG/Slate/SlateCore but not CommonUI/CommonInput, and Lambeer.uproject does not enable CommonUI. Xbox and PlayStation glyph assets exist under /Game/Lambeer/UI/ControllerGlyphs/.

Frozen migration/rollback strategy — owner approved 2026-09-06

  1. Make a source-control checkpoint limited to the verified HUD/UI source, config, and seven legacy widget assets; do not mix unrelated dirty assets into the migration checkpoint.
  2. Create the CommonUI root and new screens alongside legacy paths. Do not rename, move, delete, or redirect WBP_HUD, WBP_Inventory, or WBP_InteractionPrompt during G1–G2.
  3. Switch through the existing soft-class config/facade seam only after the new root compiles and a missing-class path fails explicitly.
  4. Before each legacy removal, repeat Asset Registry dependency/referencer capture, fix config/C++ fallback paths, run redirector validation, compile Editor/Game/Server, and complete cook/package smoke.
  5. Rollback by restoring the legacy soft-class config and compatibility facades; remove redirectors only after the matching user PIE regression result is recorded.

User-supplied PIE baseline evidence

Legacy gameplay HUD screenshot supplied by the user, showing five survival bars, compass heading and weight
Legacy HUD · 1277×720 capture: five visible bars (Health, Stamina, Hunger, Thirst, Temp), compass text E 0, and 0 / 10 kg. The capture does not show an interaction prompt or prove behavior across other resolutions.
Legacy inventory screenshot supplied by the user, showing back weapons, equipment slots, hands, drop and eight quick slots
Legacy inventory · 1281×723 capture: Back 1–2, worn-equipment row, Pockets 0/4, right/left hand, Drop, Q1–Q8, weight and Close are visible. A static image does not prove assignment, drag/drop, transfer, focus, or input restoration.
Legacy gameplay screenshot supplied by the user, showing an E interaction prompt while facing a cube
Legacy interaction prompt · 367×700 capture: the E prompt is visible near screen center while the player faces a cube. This static capture proves prompt visibility and placement only; it does not prove activation, denied/out-of-range, hold, or controller behavior.

Unreal MCP log corroboration: user-run New Editor Window PIE started on /Game/Lambeer/World/Maps/L_Dev_Sandbox/L_Dev_Sandbox at 20:12 and 20:13 local time with one dedicated-server world and two client worlds. The logs prove session topology/start/teardown only, not visual or interaction correctness.

Owner-reported input baseline (2026-09-06): Wood drag succeeds among Hand 1, Hand 2, and Pocket. Wood drag into a Quick Slot fails in the legacy UI. The failure is retained as regression context and a required G3 correction; no result is recorded for controller input, denied/out-of-range prompts, or hold interactions.

Reviewed user-only baseline acceptance matrix

AreaMinimum captureG0 record (2026-09-06)
HUDSpawn HUD; health/stamina/hunger/thirst/temperature, compass, weight, blood overlay, and interaction prompt visible/hidden transitions.Captured: five stats, compass, weight, and visible E prompt. Blood overlay and prompt hidden transition are not shown.
InventoryOpen/close; mouse and keyboard focus; drag/click assignment; both hands; Back Weapon 1–2; all eight current quick slots; container transfer/drop.Captured/reported: inventory layout; Wood drag among Hand 1, Hand 2, and Pocket succeeds. Known gap: drag into Quick Slot fails. Controller/focus restoration is unverified.
InteractionValid target, no target, denied/out-of-range, prompt placement, hold behavior if present, and return of game input.Captured: visible E prompt while facing a cube. Activation, no-target transition, denied/out-of-range, hold, and controller behavior are unverified.
SessionSingle-player baseline and current multiplayer mode if available; confirm whether opening inventory pauses the world.Corroborated by Unreal MCP: dedicated server plus two clients in two user-run sessions. Pause and authority behavior are unverified.

Gate G1 Implementation & Verification Record

Gate state: PASS — closed 2026-09-07. The C++/config foundation, required G1 Widget Blueprints, and legacy CommonUI Accept/Back input data are implemented, compiled, saved and structurally verified through Unreal MCP. After the missing Back action data was added, the owner reran PIE and confirmed the complete G1 matrix passes, including Escape dismissing the modal before the dummy screen.

Implemented and verified without PIE

ScopeEvidenceState
UI-FND-001CommonUI enabled; CommonUI/CommonInput linked. The previously undeclared HairStrands plugin dependency is now explicit. Development Editor and Game targets compiled successfully on 2026-09-06.Complete
UI-FND-002–004UCommonGameViewportClient is configured; ULambeerUIManagerSubsystem and ULambeerUIRootWidget compile. Unreal MCP loaded all three runtime classes on UE 5.8.2 and verified the root hierarchy in paint order: HUD, Screen, Modal, Toast. The owner verified runtime creation and layer behavior in the requested PIE matrix.Complete
UI-FND-006–008ULambeerActivatableWidget, typed input mode, Back/initial-focus contract, tagged Screen/Modal push-pop, duplicate-modal rejection, cursor/game-input restoration and standalone-only pause request compile. DT_UI_CommonActions maps Accept to Enter/Space/Gamepad Face Button Bottom and Back to Escape/Gamepad Face Button Right. BP_LambeerCommonUIInputData supplies those rows through CommonInputSettings.InputData with Enhanced Input support intentionally disabled for this legacy CommonUI route. The owner verified focus, modal-first Back order, final-layer input restoration and the SP/MP pause policy in PIE.Complete
UI-FND-009HUD, inventory and character-creation subsystems delegate presentation/dismissal to the LocalPlayer UI manager. Repository search finds no direct viewport or input-mode ownership in those three facades. Existing non-activatable widgets retain a manager-owned fallback during migration, and the owner reported the requested G1 regression checks passing.Complete
CookWindows iterative cook completed with 934 packages saved, 0 errors and one Model Context Protocol EULA notice. No PIE result is inferred from cook.Pass
Unreal MCP auditVerified UE 5.8.2, CommonUI viewport class and native UI classes. On 2026-09-07 Unreal MCP corrected and compiled WBP_UIRoot, completed WBP_G1_DummyScreen, created WBP_G1_DummyModal, added both initial-focus overrides, then created and verified DT_UI_CommonActions plus BP_LambeerCommonUIInputData. All affected assets were saved. No computer-use or PIE automation was used.Complete

Completed through Unreal MCP: root Blueprint (UI-FND-005)

  1. Create Widget Blueprint /Game/Lambeer/UI/HUD/WBP_UIRoot with parent class ULambeerUIRootWidget.
  2. Add four full-screen children in this paint order and mark each Is Variable: Layer_GameHUD as Overlay; Layer_Screens as CommonActivatableWidgetStack; Layer_Modals as CommonActivatableWidgetStack; Layer_Toast as Overlay. Names and types must match exactly.
  3. Anchor every layer to fill the root, then Compile and Save. There is no required Blueprint graph logic.

Fixture assets and owner-run PIE complete (UI-FND-010)

  1. Complete 2026-09-07: /Game/Lambeer/UI/Tests/WBP_G1_DummyScreen and WBP_G1_DummyModal are parented to ULambeerActivatableWidget, contain two focusable buttons, and implement GetInitialFocusTarget. Both compile and are saved.
  2. Complete 2026-09-07: /Game/Lambeer/UI/Common/Input/DT_UI_CommonActions and BP_LambeerCommonUIInputData provide the global CommonUI Accept/Back actions; Config/DefaultGame.ini selects the generated Input Data class.
  3. Owner result 2026-09-07: the initial run passed all checks except Escape because CommonUI Input Data was missing. After the action table and Input Data class were configured and the Editor restarted, the owner reran the test and confirmed Escape closes the top modal first, then the underlying dummy screen. The complete requested G1 matrix is reported passing.
  4. Start PIE yourself. Open the console and run UI_G1PushTestWidget /Game/Lambeer/UI/Tests/WBP_G1_DummyScreen.WBP_G1_DummyScreen_C false, then UI_G1PushTestWidget /Game/Lambeer/UI/Tests/WBP_G1_DummyModal.WBP_G1_DummyModal_C true. These development-only commands avoid temporary level/PlayerController Blueprint wiring.
  5. For KBM, Xbox, and PlayStation controllers, verify focus starts on the first button, directional navigation cannot escape the top modal, Back closes the modal before the screen, the cursor/input mode is correct, and closing the final layer restores gameplay input.
  6. Repeat once in standalone/single-player and once in the current multiplayer PIE topology. While the screen is open, run UI_G1SetPauseRequested true, verify only standalone pauses, then run UI_G1SetPauseRequested false. Multiplayer must never pause the server. Stop PIE and report pass/fail per device plus any log warnings or screenshots.

Optional recovery commands: UI_G1PopTestLayer true pops the modal; UI_G1PopTestLayer false pops the screen. G1 is closed from the owner-reported results above; these commands remain available for future regression diagnosis.

Gate G2 Implementation & Handoff Record

Gate state: PASS — closed 2026-09-08. Owner confirmed HUDScale, SafeZoneScale, TextScale and Thai Gallery culture switching. Theme, icons, fonts, CommonUI styles and localization assets were already implemented. Physical Xbox and PlayStation glyph/focus checks remain deferred until hardware is available; that is unverified, not failed. G3 may start on the KBM design-system foundation.
Presentation-scale record — 2026-09-08: HUDScale overflow after the saved-pivot change was caused by AddToPassiveLayer creating the HUD Overlay Slot with UE defaults HAlign_Left / VAlign_Top, which constrained the HUD Canvas to desired size instead of the available safe area. The runtime HUD Overlay Slot now uses Fill/Fill before applying presentation settings. Owner confirmed HUDScale after that fix, then confirmed SafeZoneScale and TextScale. Very large HUD scales can still exceed the available space; no approved maximum scale or overlap policy is established. Safe Zone Scale multiplies platform-provided safe margins and is visually unchanged on a normal Windows display until a debug safe zone is enabled.
Thai culture/font record — 2026-09-08: Engine BaseGame.ini already supplies %GAMEDIR%Content/Localization/Game. Editor preview requires switching both culture and game-localization preview resources via UI_G2SetCulture th/UI_G2SetCulture en. Missing-glyph boxes in the String Table Editor use Slate's default Editor font, not FF_UI_Primary; the project module adds the Thai Unicode range to the shared Editor font for the current session only. FF_UI_Primary also uses the four Google Sans faces as its explicit fallback typeface. Owner confirmed Thai rendering and English/Thai Gallery sample switching after those corrections.

Implemented evidence

TaskEvidenceState
UI-DSN-001Exactly 64 approved SVG sources were rasterized at 256×256 because UE Texture Factory does not accept SVG. Unreal MCP imported /Game/Lambeer/UI/Common/Icons/T_UI_*, then verified Clamp, NoMipmaps, TC_EditorIcon, TEXTUREGROUP_UI, sRGB, non-streaming and bilinear settings. Each asset retains its source-SVG metadata.Complete
UI-DSN-002Eight compiled/saved CommonUI style classes cover Body/Heading/Caption and Primary/Secondary/Danger/Tab/ListRow. After the owner reported boxed Thai glyphs, Unreal MCP changed all 17 gallery TextBlocks from Roboto to FF_UI_Primary while preserving face/size and disabling Simple Text Mode. Owner PIE step 5.2 passed on 2026-09-08.Complete; 5.2 passed
UI-DSN-003BP_UI_ControllerData_Xbox and BP_UI_ControllerData_PlayStation each contain 16 verified key-brush mappings. DefaultGame.ini registers both classes and Common action rows include Accept, Back, Context, TabLeft and TabRight.Deferred: physical hardware unavailable
UI-DSN-004ULambeerUIManagerSubsystem binds CommonInput's native input-method event, broadcasts input type + gamepad name, preserves the focused Slate widget and requests focus refresh only when focus is absent. Development Game build passed.Deferred: Xbox/PlayStation runtime evidence
UI-DSN-005The owner imported Regular, Medium, SemiBold and Bold as Font Face assets and created runtime composite font FF_UI_Primary. Unreal MCP verified all four face references, Runtime cache type, assignments and 87 Thai-range codepoints in every source TTF. The same four Google Sans faces are also the composite font's explicit fallback typeface so weight names remain intact. Owner PIE step 5.2 passed, then the owner confirmed Thai Gallery culture rendering on 2026-09-08.Complete; 5.2 and Thai culture PASS
UI-DSN-006The project locks the engine ShortestSide DPI curve and WBP_UIRoot wraps HUD/Toast in Safe Zones. HUD Scale applies only to point-anchored HUD children and leaves stretched overlays full-screen. The current HitMarker, Text_Weight, StatusBars and Compass persist Render Transform Pivot values equal to their Canvas Slot Alignment. Text Scale changes actual TextBlock font sizes so layout reflows. Windows Safe Zone testing uses r.DebugSafeZone.TitleRatio below 1.0 with r.DebugSafeZone.Mode 1. Owner confirmed HUDScale, SafeZoneScale and TextScale on 2026-09-08.Complete; HUDScale, SafeZoneScale, TextScale PASS
UI-DSN-007ST_UI_Common_EN and ST_UI_Common_TH contain the same 24 keys; English/Thai localization reports are 175/175 and Game.locres is compiled. The gallery's four culture samples bind to ST_UI_Common_EN keys (Input.DeviceChanged, Modal.ConfirmTitle, Error.Generic, Warning.WorldContinues) and resolve Thai through Game.locres. Owner confirmed English/Thai switching with UI_G2SetCulture on 2026-09-08. Remaining Gallery development labels are not covered by these four bindings.Complete; 5.7 Thai PASS

Owner PIE record used to close G2

  1. Complete: Editor rebuild and compile/save of WBP_UIRoot and WBP_G2_ComponentGallery were required before the scale and culture helpers could be verified in PIE.
  2. Complete 2026-09-07: Regular, Medium, SemiBold and Bold were imported as Font Face assets under /Game/Lambeer/UI/Common/Fonts/; runtime composite font FF_UI_Primary contains the four named faces and OFL.txt remains in source control.
  3. PASS 2026-09-08 — step 5.2: owner confirmed Thai glyph rendering after FF_UI_Primary was assigned to all 17 gallery TextBlocks.
  4. Step 5.4 PASS — owner confirmed 2026-09-08: HUDScale after the runtime Fill/Fill fix, then SafeZoneScale and TextScale. Regression command remains UI_G2SetPresentationScales HUDScale TextScale SafeZoneScale. Increased HUD Scale must grow inward: top-left grows down/right, top-right down/left, bottom-left up/right and bottom-right up/left. Windows Safe Zone comparison uses r.DebugSafeZone.TitleRatio 0.90 and r.DebugSafeZone.Mode 1 between scale 0.0 and 1.0, then restore TitleRatio 1.0 and Mode 0. Full-bleed visuals are not the Safe Zone observation target. No approved maximum HUD scale or overlap policy is established.
  5. Step 5.7 PASS — owner confirmed Thai 2026-09-08: UI_G2SetCulture th and UI_G2SetCulture en switch the four bound Gallery samples. Remaining Gallery development labels are not covered by those String Table bindings. The widget references ST_UI_Common_EN; Thai is resolved from Game.locres.
  6. Deferred by owner 2026-09-08: all physical Xbox and PlayStation glyph/focus/navigation checks wait until the controllers are available. Preserve them as unverified; do not record failure or pass. This does not reopen G2.

Gate G3 Implementation & Handoff Record

MCP audit and backend scope — 2026-09-08: Owner requested completion including gameplay backends, with missing requirements discussed before implementation. G3 remains open; debug commands alone do not satisfy that scope. Unreal MCP compiled and saved ten HUD assets (StatusBars, Compass, ContextStatusList, Hands, QuickSlots, Minimap, Reticle, ScreenEffects, HUDRoot and legacy HUD). Five missing stat icon widgets were added to their existing rows; GetWidgets now reports all eight icons and no empty bindings in StatusBars. Readback verified the five added texture references, 20×20 size and non-interactive visibility.
Current verification: MCP ran all seven Lambeer.HUD tests in the loaded Editor: six passed; StatusSort failed because its assertion expected one hidden ordinary row although the sole visible row was occupied by a critical status, leaving two hidden ordinary rows. The assertion is corrected in source and covers zero/one/two/three-row budgets. Owner subsequently compiled/reopened Editor; MCP reran all seven tests: 7/7 Success, zero errors and warnings. This verifies the prior HUD correction, before the new melee-classification source change. Source fixes also advance blood/wet visual timelines without rebuilding/broadcasting all gameplay snapshots each frame, prevent the legacy blood image from drawing over the new effects widget, remove the overflow click delegate on destruction, and keep a visible collapse symbol after expanding statuses. Lambeer Win64 Development build succeeded. The prior Editor build block was resolved by the owner compiling/reopening Editor; the new melee-classification change still requires a later Editor rebuild. No new PIE result is asserted.
Melee follow-up source: Item definitions now expose bMeleeWeapon (default false, explicit content classification). HUD adapter checks both held stacks on existing held-item events and selects Melee through the existing reticle priority function. No firearm/tool is automatically classified by name or category. Source is prepared; Editor property loading and authoring confirmed melee assets remain pending the next rebuild. The chamber/magazine production backend is not implemented by the debug observer.
RESOLVED IN SOURCE — 2026-09-09: Owner supplied L1810 as the G3 test firearm: ItemId Item.Weapon.L1810, magazine capacity 18, new instances start with a full magazine and an empty chamber. Instance ChamberCount/MagazineCount live on FInventoryStack. MagazineCapacity > 0 marks a firearm. Field checks now run a server channel: Shift+R 3 s per held firearm, Alt+R 5 s per held firearm, right then left, apply HUD knowledge only when the whole sequence finishes. Move, damage, death or held-item identity change discards the sequence. MCP created /Game/Lambeer/Core/Data/Items/DA_Item_L1810. Weight 1.2 kg, durability 100 and throw 0.6 s / 900 cm/s are copied from DA_Item_Pistol, not a measured L1810 mass. World/held meshes remain the Engine cube because SKM_L1810 is a skeletal mesh and the item visual pipeline is StaticMesh-only. Skeletal visuals and magazine-as-item install are G3.2. Owner reported inspection working on 2026-09-10.
Latest build and owner PIE — 2026-09-09: Owner compiled the sleep-dim C++ after the UWidget::Slot hide fix. Owner then reported “ผ่านแล้ว”. Scoped result: L_Dev_Sandbox bed sleep, slight Sleeping screen dim, and the Jog/sprint Energy drain used to make that test visible. Earlier the same day the owner reported the other throw/sledgehammer checks on that map passed before bed sleep was unblocked. Earlier MCP ran 11 Lambeer.HUD tests in the loaded Editor: 11 succeeded, 0 failed, 0 test warnings. That includes EditableSurvivalTuning, ThrowLifecycle, SurvivalRates, WetnessRates and the prior HUD tests. This does not close G3.
MCP item audit — 2026-09-09: loaded Editor exposes the latest throw fields. All nine original DA_Item_* assets under /Game/Lambeer/Core/Data/Items have throwable enabled and approved windup/speed defaults. All nine still use the Engine cube for world/held meshes, and all have melee classification disabled. No production model hookup is implied. Owner chose a new Sledgehammer item instead of changing Crowbar. MCP created and verified DA_Item_Sledgehammer plus BP_Pickup_Sledgehammer_Test; see canonical item tuning. /Game/Lambeer/Interaction/BP_Bed_Test uses the native bed backend and a cube placeholder mesh. MCP placed both test actors in L_Dev_Sandbox near PlayerStart (pickup about 200 cm forward, bed about 250 cm to the right) and saved the map. The placed pickup instance uses the Sledgehammer static mesh at imported scale 1, Movable. Owner reported the throw/sledgehammer checks on that map passed on 2026-09-09, then reported bed sleep and the Sleeping dim passed after the later Energy/dim work. Final bed art and sleeping animation are not implemented.
Editable survival tuning — asset assigned: MCP created /Game/Lambeer/Core/Data/Survival/DA_SurvivalTuning (ULambeerSurvivalTuning). Owner Energy drain is Jog −1 / 5s (−12/min) and sprint −1 / 1s (−60/min). There is no PlayerState Blueprint; BP_LambeerGameMode uses native ALambeerPlayerState. The Data Asset is assigned on Default__LambeerPlayerState:Survival.Tuning and the survival-component CDO. ConstructorHelpers loads the same path after Editor rebuild. Class defaults match the approved rates when Tuning is null.
Item wetness, blood impact, L1810 and shelter — 2026-09-09: Occupied clothing slots now use the approved rain/swim/dry rates (owner confirmed wetting every worn slot until outer layers exist). Back-weapon rain increase is unchanged. ApplyDamage notifies owning clients when the impact is within 2 m of the pawn view and a visibility trace to that view is clear. MCP created DA_Item_L1810 and placed RainShelter_G3Test (volume bounds X 200–600, Y −200–200, Z 200–600), visible roof RainShelterRoof_G3Test with tag RainShelter, and pickup Pickup_L1810_Test at about (200, −150, 260). Map save verified 2026-09-10: those actors are in saved L_Dev_Sandbox (is_dirty false). Owner later reported nearby blood, rain-lens droplets and shelter. G3 rain presentation is HUD droplets + UI_G3SetRain; rain VFX is out of G3. Material wet-look mapping is G3.2.
Owner PIE miss — 2026-09-09: After picking up Pickup_L1810_Test, Shift+R / Alt+R showed no ammo, and Lambeer.Damage 10 showed no blood. Source cause: hand cards hid chamber/magazine behind “Durability state only” because L1810 tracks durability; G3 does not require a separate magazine item. Lambeer.Damage from a client console did not deliver the blood overlay (Client RPC from the client is dropped). Fixes in source: firearm cards always show Chamber/Mag knowledge; L1810 remains a firearm if capacity was not saved on the DA; inspection prints a cyan on-screen status; Lambeer.Damage server-applies and notifies the local HUD. This does not close G3. Owner must rebuild Editor and re-run PIE.
Owner PIE follow-up — 2026-09-10: Shift+R worked. Alt+R still did not. Owner rejected the classic Alt+R chord and the extra Right Alt mapping: Check Magazine must use the same Enhanced Input path as Check Chamber (IMC_Default R + chord IA_Alt, remappable). Those extra binds are removed. Leftover Alt was being reported as handled UI input by CommonUI; ULambeerGameViewportClient now delivers modifier keys to gameplay the same way Shift already reached Enhanced Input. It is not a magazine-specific binding. Lambeer.Damage 10 still showed no tint: WBP_HUDRoot.BloodOverlay was collapsed whenever ScreenEffects existed, and WBP_ScreenEffects.Image_Blood is a NoImage brush so alpha tint draws nothing. HUD overlay paints again with the Engine white square; ScreenEffects blood uses the same fill; the adapter ticks the 2 s / 5 s fade. Self-damage still skips the visibility trace. This does not close G3.
Owner PIE — 2026-09-10: After the remappable Alt / overlay-paint rebuild, owner reported inspection working and Lambeer.Damage 10 still doing nothing. Source then always starts the local overlay when the damaged actor is that client’s pawn (the 2 m / LOS rule remains for nearby hits only). Lambeer.Damage also calls the local notify after apply, and HUD BloodOverlay is raised above ScreenEffects. Later log diagnosis: the client console never executed the cheat; see command unrecognized and owner-reported pass.
Owner PIE / MCP log — 2026-09-10: The same session was Dedicated Server + two clients. Output Log recorded Command not recognized: Lambeer.Damage 10 and the same for LambeerDamage 10, while HUD had already spawned on BP_LambeerPlayerController. Engine AddCheats() without force skips clients because they have no AuthGameMode, so ULambeerCheatManager was never created on the window that accepted the console command. Overlay/RPC patches cannot run if the cheat never executes. Source now calls EnableCheats() from ReceivedPlayer in non-Shipping so the client Preview console can reach Lambeer.Damage.
OWNER-REPORTED PASS — 2026-09-10: After the Editor rebuild that included client EnableCheats, the owner reported Lambeer.Damage 10 passed. Recorded pass scope: dedicated-server PIE with two client Preview windows; in-game console on a client window; self-damage cheat recognized; local blood overlay path. Not recorded: nearby (non-self) 2 m / LOS hits, low-health edge tiers, rain VFX, or G3 gate close. This is owner-reported runtime evidence, not agent-run PIE.
MCP remaining-work audit — 2026-09-10: Editor had L_Dev_Sandbox loaded; PIE was not running. The G3 sandbox actors are on disk (is_dirty false): RainShelter_G3Test, RainShelterRoof_G3Test (tag RainShelter), Pickup_L1810_Test, BP_Pickup_Sledgehammer_Test, BP_Bed_Test. WBP_HUDRoot still has twelve named widgets and no HitMarker. WBP_ScreenEffects.Image_Sleep was a BindWidget hole (C++ previously constructed it at runtime); Unreal MCP added the Image, compiled and saved the asset. Readback: collapsed, Engine white square, black alpha 0. DA_Item_L1810 still has capacity 18 and Engine cube meshes. DA_Item_Sledgehammer remains TwoHanded and melee. Find-assets for Niagara under /Game returned none. Automation Lambeer.HUD ran 13/13 Success, 0 errors, 0 warnings.
OWNER-REPORTED PASS — 2026-09-10 (HUD close checklist 1–7): Dedicated-server PIE, owner-reported: eight GAS bars no longer gray; UI_G3GiveBackWeapons and keys 1/2; ADS hides the reticle; no HitMarker; nearby 2 m / LOS blood overlay; low-health 30/20/10 edges; UI_G3SetRain lens droplets plus shelter. Owner decided G3 rain presentation stays HUD droplets + UI_G3SetRain; no rain VFX in this gate. Skeletal L1810 visuals, magazine-as-item install and material wet-look mapping move to G3.2.
OWNER-REPORTED PASS — 2026-09-10 (HUD close checklist 8): Owner reported prompt quantity/denied passed after the how-to-test. This is owner-reported runtime evidence, not agent-run PIE. No separate Listen Server x10 result was supplied. HOLD text was not a G3 PIE target: no sandbox interactable returns GetInteractHoldDuration > 0, and the owner did not request a debug hold fixture. HOLD presentation waits for a real hold action. This closes G3.

How to test prompt quantity / denied / hold (checklist 8)

PromptHost already projects near the target. Quantity and denied use live interactables. Hold has no authored duration in this sandbox. Lambeer.SpawnPickup and Lambeer.GiveItem require a host pawn; a Dedicated Server client Preview prints needs host, and the Dedicated Server window usually has no pawn.

  1. Quantity (Dedicated Server clients): look at Pickup_L1810_Test or the sledgehammer. The prompt should read Pick up {name} plus x1. HUD appends xN whenever quantity is greater than 0; a qty-1 pickup must not invent a larger count. Quantity x10: start Listen Server PIE instead, then on the host window run Lambeer.SpawnPickup Item.Wood 10 and look at that cube for x10.
  2. Denied: do not pick up L1810 first. Pick up the sledgehammer so both hands are locked, then look at the remaining L1810 cube. Pickup CanInteract is true if any hand is empty or inventory CanFit. Typical spawn has no worn storage, so pockets cannot fit and the prompt should stay visible with the second line Cannot interact. Pressing E must not take it. Optional, same client: Lambeer.InteractDump should print can=no for that pickup. If pants/backpack are already equipped, leftover pickups still go to pockets; unequip that storage or fill on Listen Server (Lambeer.GiveItem is also host-only).
  3. Hold: no G3 interactable implements GetInteractHoldDuration above zero. Bed, pickups and barber are tap actions. The HUD would append HOLD Ns only when an interactable returns a duration. Missing HOLD text on Sleep/Pick up is not a HUD bug. Owner closed G3 without a debug hold fixture; HOLD presentation waits for a real hold action.

Owner-only PIE checklist after Editor rebuild

  1. Hold one item: hold Middle Mouse for more than the item windup, then release. Exactly one pickup should leave the hand and remain collectible after landing.
  2. Release before the windup completes: the hand and world item count must remain unchanged.
  3. During windup click Left Mouse, then release Middle Mouse: nothing is thrown. Repeat with Right Mouse; cancellation must not toggle ADS on mouse release.
  4. Hold two different items: only the right item is thrown. With only the left hand occupied, the left item is thrown.
  5. Hold Wood ×10: one throw leaves Wood ×9 in the same hand and creates one Wood pickup. Recover it and check conservation of the total count.
  6. Compare a short completed windup with a long hold: launch speed must stay constant. Change one item's authored windup/speed and confirm that item uses its own values.
  7. Swap, stow or drop an item while winding up; releasing afterward must not throw a replacement item.
  8. Repeat near a wall, on a client and with another player observing. Check blocked spawn retains the item, flight/landing are visible and no duplicate pickups appear.
  9. L_Dev_Sandbox already has BP_Bed_Test near PlayerStart. Press the same Interact key used for pickups (IA_Interact, E) while looking at the cube; standing still is not required to start sleep. The screen should dim slightly while Sleeping. Energy/Sleep should recover. Move after sleep has started, take damage or destroy the bed: recovery must stop and the dim must clear. The cube is a functional bed placeholder; final bed art and sleeping animation are not implemented. Pick up the placed Sledgehammer, confirm two-hand occupancy and the melee reticle, then throw it.

Backend decisions required before implementation

Use the existing canonical feature decisions below; no gameplay tuning or approval state is inferred. Pending questions have been sent to the owner.

Backend source progress, 2026-09-10: server weather intensity, shelter queries, survival rates/hysteresis, body/lens wetness, held-item and worn-clothing rain/swim/dry, bed interaction and HUD survival delegates are added. ApplyDamage can drive the blood overlay. Owner reported Lambeer.Damage 10 on a dedicated-server client on 2026-09-10, then nearby 2 m / LOS hits, low-health edges, rain-lens shelter, and prompt quantity/denied the same day. L1810 instance ammo and timed field inspection are in source; owner reported that inspection working the same day. MCP verified the sandbox G3 actors are saved. Owner decided rain VFX is out of G3. Skeletal L1810, magazine-as-item and material wet-look are G3.2. G3 is closed.

  • Combat: Melee trigger is confirmed as holding a melee weapon. Check chords, durations and press-once/sequential behavior are now canonical in field inspection inputs. Owner confirmed right-hand firearm then left-hand firearm on 2026-09-09. Per-firearm duration, discarding newly collected results on interruption and actual item truth are confirmed. IA_Throw exists; MCP verified its MiddleMouseButton mapping. Throw lifecycle is confirmed in the HUD input contract. Runtime source: DA_Item_L1810 / Item.Weapon.L1810, capacity 18. G3 new stacks used full mag / empty chamber; G3.2 new stacks spawn with no magazine. Timed inspection applies HUD knowledge only after the full sequence. Owner reported Shift+R / magazine inspection working on 2026-09-10. Debug UI_G3ObserveWeapon remains. G3 used Engine-cube world/held visuals; G3.2 assigned SKM_L1810 on 2026-09-11. Owner reported skeletal world/held/back visuals and magazine-as-item on 2026-09-11.
  • Blood: owner confirmed maximum 2 metres to the pawn view with no intervening obstruction for nearby impacts. Hits on the local pawn always start that client’s overlay. Owner reported Lambeer.Damage 10 on a dedicated-server client on 2026-09-10, then nearby 2 m / LOS hits and low-health 30/20/10 edges the same day. The confirmed 2-second hold / 5-second fade remains unchanged.
  • Rain/wetness: follow the owner-approved weather/shelter decision. Occupied clothing slots wet from rain. MCP placed a G3 shelter volume and tagged roof in L_Dev_Sandbox; map save verified 2026-09-10. Owner reported UI_G3SetRain lens droplets plus shelter on 2026-09-10. G3 rain presentation is HUD droplets + UI_G3SetRain only. Rain VFX is out of G3. Material wet-look mapping is G3.2.
  • Survival: Energy/Sleep/Immunity rates and fatigue hysteresis are approved; interact with a bed starts sleep. Injury and treatment tuning remain unresolved. Approved starting values are in the survival decision.
Gate state: PASS — closed 2026-09-10. Owner reported HUD close checklist 1–8. G3 rain presentation is HUD droplets + UI_G3SetRain. HOLD text waits for a real hold action; no G3 debug hold fixture. Xbox/PlayStation hardware checks remain deferred. G3.2 skeletal L1810 and magazine-as-item later passed owner PIE on 2026-09-11; wet-look remains deferred. That follow-through does not reopen this gate.
Editor rebuild: Owner compiled the 2026-09-10 client CheatManager / Lambeer.Damage C++ change and reported that cheat passed. Later C++ still needs a closed-Editor LambeerEditor Win64 Development rebuild when Live Coding is active. PIE remains owner-only.

Owner PIE notes (2026-09-08)

  • Slots 3–0 with Wood: reported working.
  • UI_G3NotifyBlood, UI_G3NotifyWet 1, UI_G3PushStatus Bleeding 2 1: reported working.
  • UI_G3AddMarker Death: later PIE reported working (compass/minimap diamonds).
  • Later same-day PIE still failing (not fixed in that session): UI_G3GiveBackWeapons; ADS does not hide the center square reticle; UI_G3ObserveWeapon does not put an item in a hand; eight bars remain gray. Session tooling: docs/handoff-g3-hud.md. Owner later reported those HUD close items passed on 2026-09-10; see checklist 1–7.
Handoff fix pass — 2026-09-08: Client-safe debug give/observe RPCs, delayed observation delivery, HUD initialization/late ASC binding, pre-Slate icon insertion and ADS-first reticle hiding are implemented in source. Debug RPC mutation paths are disabled in Shipping/Test builds. The older Interaction-first implementation conflicted with the canonical ADS rule and has been corrected. Editor build was attempted but blocked by active Live Coding; the owner must close Editor, rebuild LambeerEditor Win64 Development, and reopen. Regression test source now checks ADS with interaction/combat readiness; execution remains unverified. Validation: Lambeer Win64 Development build succeeded after this fix pass; git diff --check passed; all 40 HTML documents passed the documentation validator with 0 errors/0 warnings. Game-target compilation does not verify the currently loaded Editor DLL or PIE behavior.

Implemented evidence

TaskEvidenceState
UI-HUD-001FUIHUDSnapshot and ULambeerHUDAdapter rebuild from GAS/inventory/aim/prompt delegates. Compass/minimap NativeTick is heading-only; screen-effects NativeTick runs only while overlay alpha is live. Owner reported eight GAS-colored bars on 2026-09-10.Complete
UI-HUD-002Energy/Sleep/Immunity plus Max* attributes Init 100 / Max 100, session replicated. Server survival tick applies approved DA_SurvivalTuning drain/regen through instant SetByCaller GEs on Data.Energy/Data.Sleep/Data.Immunity. Jog is −1 Energy / 5s; sprint (Run) is −1 Energy / 1s. Owner reported bed sleep PIE on 2026-09-09 after that drain was visible. Persistence/save format was not invented.Complete — G3 session attributes; persistence not invented
UI-HUD-003Status bars consume snapshot delegates. MCP added Energy/Sleep/Immunity rows. C++ now also injects T_Ui_Stat_* icons for Health/Stamina/Hunger/Thirst/Temperature when those BindWidgets are missing. Numeric labels remain collapsed. HUD root requests an initial snapshot; adapter listens for possession changes, retries missing sources and binds a late/replaced PlayerState ASC even when the pawn is unchanged. Attribute delegates handle subsequent value/max replication, including initial zero values; no stat values are fabricated. Missing icons are inserted into the existing horizontal row before Slate construction, preserving SizeBox layout. Owner reported the eight bars no longer gray on 2026-09-10.Complete
UI-HUD-004C++ HitMarker API removed. MCP deleted the HitMarker widget from WBP_HUD. After Editor reopen, WBP_HUDRoot has no HitMarker bind. Source search has no presentation path. Owner reported no HitMarker in dedicated-server PIE on 2026-09-10.Complete
UI-HUD-005MCP created/compiled/saved /Game/Lambeer/UI/HUD/WBP_HUDRoot with viewport-edge StatusBars (top-left), Compass (top-center), PromptHost, BloodOverlay, Text_Weight, ScreenEffects (full screen), Reticle (center), Minimap (top-right), ContextStatusList (left below bars), Hands (bottom-left) and QuickSlots (bottom-center). Child WBPs: WBP_Hands, WBP_QuickSlots, WBP_Reticle, WBP_Minimap, WBP_ContextStatusList, WBP_ScreenEffects. MCP GetWidgets shows all BindWidget names bound. Owner-reported HUD close checklist 1–7 used this root.Complete
UI-HUD-006008C++ widgets and matching WBPs compiled/saved. MCP GetWidgets on WBP_HUDRoot still shows StatusBars, Compass, PromptHost, BloodOverlay, Text_Weight, ScreenEffects, Reticle, Minimap, ContextStatusList, Hands and QuickSlots with no HitMarker. Status onset now stamps GetServerWorldTimeSeconds. Status list stays empty until gameplay/debug inject besides Energy/Sleep/Immunity/Wet from survival. Minimap is a heading disc plus shared markers. G3 used a direction ring because no radar radius was approved. G4 now scales marker distance with a 50 m implementation clamp (LambeerHUDPresentation::MinimapRangeCm), paints temporary T_WorldMap_Temporary north-up on the minimap disc, and uses an 8 px center pip plus a heading chevron; that is still not an approved radar range. Owner reported status injectors and marker diamonds on 2026-09-08 and the north-up / walk-only diamond retest on 2026-09-12.Complete
UI-HUD-009Handedness enum defaults OneHanded. Two-hand occupancy is enforced in UHeldItemComponent. DA_Item_Sledgehammer is TwoHanded; owner reported two-hand occupancy on 2026-09-09. Remaining production DA tagging is not a G3 HUD blocker.Complete — C++ contract + sledgehammer
UI-HUD-010HUD slots 1–0; 1–2 reserved for Back Weapon; 3–0 are eight use-quick. Runtime keys 1–0. Wood assignment no longer requires bUsableFromQuickSlot. Owner PIE confirmed Wood→3–0. Development-only server RPCs now support the owning dedicated-server client, preserve occupied back slots, and report grant/equip failures to that client. Mock holsterable Item.Weapon.MockBack plus UI_G3GiveBackWeapons and ULambeerBackWeaponVisualComponent were added so keys 1–2 can be tested without authored weapon assets. Owner reported UI_G3GiveBackWeapons and keys 1/2 on 2026-09-10.Complete
UI-HUD-011Reticle maps ADS Hidden > Interaction > Throw > Melee > Shoulder > Hip, matching FEAT-HUD-UI / AC-UI-003 (ADS hides all reticles). The reticle host also collapses in ADS; projected interaction prompts remain separate. Melee reads held-item classification. Throw windup feeds the existing Throw reticle priority. Owner reported ADS hides the reticle on 2026-09-10 and throw/sledgehammer melee on 2026-09-09. Hip/Shoulder/Interact matrix is not newly reported as a full sweep.Complete — G3 ADS-hidden + throw/melee source
UI-HUD-012Structured prompt + projected PromptHost + denied-focus. Quantity comes from pickup stack quantity. Owner reported quantity/denied on 2026-09-10. HOLD text waits for GetInteractHoldDuration > 0; no G3 debug hold fixture.Complete — G3 quantity/denied; HOLD waits for a real hold action
UI-HUD-013Low-health 30/20/10%; blood hold 2s + fade 5s; wet fade 5s. Sleeping applies a slight black dim (alpha 0.22) for G3 bed testing; owner reported that dim passed in PIE on 2026-09-09. Lens wetness follows survival bLensExposed. Held items and occupied clothing use the approved rain/swim/dry rates. Nearby ApplyDamage still requires 2 m and a clear visibility trace. Hits on the local pawn always start that client’s overlay. HUD BloodOverlay uses the Engine white square and sits above ScreenEffects. Owner reported self-hit overlay, nearby 2 m / LOS hits, low-health edges and UI_G3SetRain lens droplets plus shelter on 2026-09-10. G3 rain presentation is HUD droplets + UI_G3SetRain only; rain VFX is out of G3.Complete — G3 HUD droplets; rain VFX out of G3
UI-HUD-014Firearm hand cards show Chamber/Mag even when the item also tracks durability. Production inspection uses actual stack chamber/magazine counts on L1810 (18/0 on new stacks); no magazine item is required in this G3 slice. Owner reported chamber/magazine inspection working on 2026-09-10. Debug UI_G3ObserveWeapon remains. Invalidate on item id/quantity change. [CONFIRMED 2026-09-14] Observation is not persisted; every fired round clears Chamber and Mag to UNKNOWN (P10 fire path). Magazine-as-item install is G3.2 UI-HUD-016.Complete — G3 knowledge mask; magazine-as-item is G3.2
Back-weapon flow update — confirmed by owner 2026-09-08: Canonical return/toggle flow. Historical implementation; logical projection and reservation behavior below superseded by the 2026-09-13 physical-slot correction. The held FInventoryStack.OriginBackSlot replicates with its stack and follows hand swaps; physical EquippedItems is empty while drawn, so back mesh and weight are not duplicated. GetAssignedBackWeaponStack exposes logical slot ownership to HUD/inventory; both show In hand. Server quick-slot switching plans on copies before committing. Q1/left and Q2/right use physical slot contents for draw/store/exchange, including the confirmed empty-slot fallback from the other hand. Storing into another slot clears the original reservation. When exchanging, the new in-hand stack cannot mask the physically stored item in that slot. Q3–Q0 retain one-handed coexistence and the existing replacement preflight; ordinary held items are never overwritten. Failed preflight leaves the original state untouched. Generic held transfers clear the reservation; occupied reserved back slots reject equip replacement. No inventory cell/weight capacity is needed for an internal back↔hand move. New Lambeer.HUD.BackWeaponReturn regression source covers identical item IDs with different durability, Q1/left→empty Q2 storage, right-hand/Q2 exchange, repeated swaps, dual holding, Q2 selection with both hands occupied, use-quick alongside a weapon and two-handed/no-discard guards. Game Development build passed after this flow change. The agent Editor-build attempt was blocked by Live Coding; owner subsequently reported the latest correction passed (see scoped result). Automation execution remains unverified.

Handedness debug commands — 2026-09-08

UI_G3GiveOneHanded [Key=1] uses the existing Item.Weapon.MockBack OneHanded fixture. UI_G3GiveTwoHanded [Key=2] uses Item.Weapon.MockTwoHanded, explicitly TwoHanded. Key accepts 1–9 or 0 as printed on the keyboard: 1–2 equip a back slot, 3–0 bind an inventory fixture to use-quick. Both commands execute on the server for the owning client. For Q3–Q0, an already-held matching fixture is bound without granting a duplicate; failed grants report weight/cell usage. They are disabled in Shipping/Test, preserve conflicting assignments and report capacity/assignment failure in the client console. Mocks have no mesh; inspect the hand cards. The TwoHanded fixture copies the existing mock's test weight/stack/durability settings, not production weapon tuning; real Data Assets remain unchanged.

  • OneHanded scenario, empty target slots and sufficient capacity: UI_G3GiveOneHanded 1, UI_G3GiveOneHanded 2, then keys 1→2. Both hands should be occupied; key 1 returns only Back1. For use-quick instead, use UI_G3GiveOneHanded 3 with key 1→3 and verify both hands.
  • TwoHanded scenario, separate clean setup: UI_G3GiveOneHanded 1, UI_G3GiveTwoHanded 2, then keys 1→2→1. Entering TwoHanded stores the outgoing weapon in the selected occupied slot and locks the sibling hand; subsequent Q1/Q2 input follows selected-slot storage/exchange. UI_G3GiveTwoHanded 4 tests a use-quick two-handed item instead. An ordinary two-handed item without a back origin must be stowed manually before another item can replace it.
  • Clear/drop earlier test fixtures or use a fresh setup between scenarios if the existing inventory capacity is reached. Repeated setup must not overwrite another assignment. Run on dedicated-server client as well as standalone/listen server; owner results remain pending.
Inventory integration follow-up — 2026-09-08, source changes: Historical record: redirecting a Q action to a drawn hand is superseded by physical-slot commands. Inventory quick-slot row now contains Q1–Q0 using the same HUD indices; Q1/Q2 present the back-weapon roles and the separate legacy back-slot widgets are collapsed. Pocket drops use explicit source→destination dispatch: held stacks stow, physical equipment unequips to the selected container, drawn back weapons stow from their actual hand, and use-quick resolves its existing inventory/held source. Internal held/equipped→inventory moves exclude the source during capacity checks to avoid counting its weight twice; normal slot/weight limits remain in effect. Handedness debug commands can bind an already-held fixture to Q3–Q0 without an unnecessary duplicate grant and now report weight/cell usage on grant failure. Game Development build passed; owner subsequently reported the latest correction passed (see scoped result). Owner confirmed Q1-drawn weapon→empty Q2 stores it in Q2, clears Q1 and empties its hand; also confirmed right-hand A↔Q2 B exchange. Owner then confirmed Q1/left and Q2/right mapping plus fallback from the other held hand for an empty target. These rules are implemented by PlanBackExchange; same-type/different-durability regression source covers the exact confirmed examples, repeated exchange, dual holding, right-hand priority, two-handed occupancy and failure preservation.
OWNER-REPORTED PASS — 2026-09-08: Owner replied “ผ่านแล้ว” after the latest inventory/quick-slot correction. Recorded pass scope: unified Q1–Q0 with separate Back Weapon UI hidden; pocket drag/drop and relocation weight fix; Q1/left and Q2/right storage/exchange, including Q1→empty Q2 and right-hand A↔Q2 B; Q3–Q0 debug assignment follow-up. This is owner-reported runtime evidence, not agent-run PIE. No new resolution/device/network-mode details or automation results were supplied. Broader G3 acceptance items and deferred controller hardware checks retain their existing status.
OWNER-REPORTED PASS — 2026-09-09: Owner reported the other L_Dev_Sandbox throw/sledgehammer checks passed, then that bed sleep could not start until Energy drain and a visible Sleeping dim were added. After Jog −1 Energy / 5s, sprint −1 Energy / 1s, and the slight black dim (alpha 0.22), the owner compiled the C4458 fix and replied “ผ่านแล้ว”. Recorded pass scope: Interact-to-sleep on BP_Bed_Test without standing still; screen dims while Sleeping; Energy drain while Jog/Run is visible enough to leave max Energy; throw/sledgehammer checks on that map from earlier the same day. Not recorded: full throw matrix in MP/near-wall, firearm inspections, blood-impact source, or G3 gate close. This is owner-reported runtime evidence, not agent-run PIE.

Owner PIE steps

  1. Compile the Editor target after the latest C++ HUD pass, then start PIE yourself on L_Dev_Sandbox.
  2. Confirm eight colored bars with icons, no numbers, no hit marker. Bars should fill from GAS without needing UI_G3NotifyBlood first; re-check after respawn and confirm subsequent attribute changes update the bars.
  3. Console: UI_G3GiveBackWeapons from the owning client in dedicated-server PIE (also re-check standalone/listen server), then keys 1 and 2 to hold both one-handed Mock Back Weapons simultaneously. Confirm each back slot becomes empty when its item is drawn; the held item appears only in Hands. Press the same key again to return it; test 1→2→1 (only Back1 returns; Back2 stays in hand) and 1→3 (Wood alongside a one-handed weapon), including full inventory and two identical weapons with distinct durability. With only Q1 assigned, draw using 1 then press empty Q2: confirm storage in Q2, Q1 clears and the hand empties. With right-hand A and Q2 B, press 2 and verify exact-stack exchange (including durability). Empty Q1/Q2 with no held item is a no-op; missing Q3–Q0 items leave held state unchanged. Slots 3–0 remain Wood use-quick.
  4. ADS: quick click Right Mouse to toggle; hold Right Mouse for Shoulder Aim; or console UI_G3ToggleADS. ADS hides the reticle both away from and while facing an interactable; exit ADS restores the appropriate reticle. The projected prompt is a separate widget.
  5. UI_G3AddMarker Death should show a red diamond on the compass tape and minimap ring, 4 m ahead, plus an on-screen hint.
  6. UI_G3ObserveWeapon 0 1 8 should change the bottom-left right-hand card from UNKNOWN to Chamber 1 / Mag 8. If the hand is empty, the server gives/takes the mock into that hand first. Also test UI_G3ObserveWeapon 1 1 8 for the left hand; wait for replication. Mock has no assigned mesh, so verify the hand card rather than a visible weapon model. Change held item/quantity and confirm UNKNOWN returns. Check full inventory, two-handed occupancy and repeated give commands for clear feedback/no replacement of occupied slots.
  7. Map save verified 2026-09-10: the G3 actors are already in saved L_Dev_Sandbox. After Editor rebuild if C++ changed: pick up Pickup_L1810_Test (cube near the sledgehammer, negative Y) or UI_G3GiveL1810 / Lambeer.GiveItem Item.Weapon.L1810. Bottom-left hand card should read L1810 with Chamber UNKNOWN and Mag UNKNOWN immediately; no separate magazine item is required in this slice. Click the PIE viewport so it has keyboard focus. Stand still: Shift+R should print a cyan “Checking chamber (3s)” then Chamber 0; Alt+R should print “Checking magazine (5s)” then Mag 18. Both use the authored Enhanced Input chords (R + IA_Shift / R + IA_Alt); there is no extra magazine bind. If the gun is not in a hand, cyan “No firearm in hands to inspect.” Moving, taking damage, dying or swapping the held item before the timer finishes must leave UNKNOWN. Lambeer.Damage 10 should print a red “Blood overlay”, splash a full-screen red tint (2 s hold / 5 s fade), and show ok in the console. Compare with UI_G3NotifyBlood if isolating the overlay. Owner-reported pass 2026-09-10: L1810 field inspection and Lambeer.Damage 10 on a dedicated-server client Preview window.
  8. After Editor rebuild: UI_G3SetRain 1 should start lens droplets while unsheltered at PlayerStart. Worn clothing and held items should gain WetAmount (no wet mesh look until G3.2 materials expose it). Walk +X under the cube roof around (400, 0) to enter RainShelter_G3Test; wetting from rain should stop. UI_G3SetRain 0 should start the 5-second lens fade. G3 rain presentation is HUD droplets + UI_G3SetRain only; rain VFX is out of G3. Owner-reported pass 2026-09-10: droplets plus shelter.
  9. Owner-reported pass 2026-09-10: prompt quantity/denied per checklist 8. HOLD presentation waits for a real hold action.
  10. Optional Session Frontend: Tools → Session Frontend → Automation, filter Lambeer.HUD, run those tests. This is an Editor automation pass, not PIE.
  11. Xbox/PlayStation results remain deferred. Leftover PIE-UI-001005 rows stay partial where noted; they do not reopen G3.

Gate G3.2 HUD Visual Follow-through

OWNER-REPORTED PASS — 2026-09-11 (G3.2 skeletal + magazine-as-item). G3 stays closed. Rain VFX stays out. Owner reported the G3.2 checklist passed after compiling LambeerEditor Win64 Development and reopening. Wet-look (UI-HUD-017) remains deferred and is not part of this close.
  • UI-HUD-015Complete. C++ skeletal pipeline plus MCP-assigned SKM_L1810 on DA_Item_L1810. Owner reported world/held/back skeletal presentation (not a visible Engine cube). Grip pose remains unpolished content. Character holster sockets back_weapon_1 / back_weapon_2 were authored 2026-09-18; per-slot BackHolster1Relative / BackHolster2Relative are now on ULambeerItemDefinition and stay identity until calibrated. Owner PIE for that placement is not claimed. L1810_PhysicsAsset exists on disk but is not assigned to the skeletal mesh; the Engine cube remains the pickup collision proxy.
  • UI-HUD-016Complete. Tarkov magazine-as-item. Owner reported: new L1810 shows No mag; magazine inspect after Alt+R is 0; load ammo onto mag; 3 s mag install while standing still; move cancels install; RMB remove magazine (3 s) and unload ammo. Data Assets and sandbox pickups were MCP-saved 2026-09-11.
  • UI-HUD-017deferred by owner. MI_L1810, the magazine MI, and MetaHuman materials have no WetAmount parameter. Do not invent roughness/albedo/drip mapping. WetAmount scalar remains on pawns/stacks. This does not reopen G3.2 015/016.

G3 historical full-mag spawn is superseded for new stacks only; it does not reopen G3. Debug UI_G3ObserveWeapon remains.

Map save verified 2026-09-11 (L_Dev_Sandbox is_dirty false). MCP placed magazine and ammo pickups beside the existing L1810 pickup: Pickup_L1810_Test at (200, −150, 260); Pickup_L1810_Magazine_Test at (240, −150, 260), stack Item.Magazine.L1810 ×1; Pickup_Ammo_9x19_Test at (280, −150, 260), stack Item.Ammo.9x19 ×18.

Manual PIE checklist (owner-reported pass 2026-09-11)

  1. Owner-reported pass: Dedicated Server + two client Preview windows. Type cheats in a client Preview console, not the dedicated-server window.
  2. Owner-reported pass: UI_G3GiveL1810 or pick up Pickup_L1810_Test: skeletal L1810 in hand and in the world (not a visible Engine cube). Inventory label shows No mag. Shift+R / Alt+R still work; after magazine inspect, Mag is 0.
  3. Owner-reported pass: UI_G3GiveL1810Magazine and UI_G3Give9x19, or pick up Pickup_L1810_Magazine_Test and Pickup_Ammo_9x19_Test. Drag ammo onto the mag (count rises). Drag mag onto the gun and stand still 3 s. Moving should cancel. Right-click the gun: Remove magazine (3 s). Right-click the mag: Unload ammo.
  4. Owner-reported pass: Holster/draw: skeletal mesh on back as well as the world pickup.
  5. Wet-look is not in this gate. Rain remains HUD droplets + UI_G3SetRain.

Gate G4 Core Survival Screens

Gate state: PASS — closed 2026-09-13. Started 2026-09-11. Owner-reported pass 2026-09-12 for UI-CORE-001 and UI-CORE-002: Tab opens and closes without crash; Worn clothing slots are visible; sandbox Pants/Glasses/Body Armor/Backpack pickups equip. Command rules already passed 2026-09-11. Owner approved the Inventory presentation on 2026-09-12 and moved preserved task UI-CORE-003 to planned Gate G4.2. Owner-reported pass 2026-09-12 for the UI-CORE-004 north-up minimap and frozen full-map death-diamond retest. Owner-reported pass 2026-09-13 for pan/zoom/center, shared ping, filter toggles, map↔inventory Tab switching, and the zoom-clip retest (zoomed image stays inside the map panel). Owner-reported pass 2026-09-12 for the UI-CORE-005/UI-CORE-006 follow-through: backpack contents stay packed in the death bag, interact opens loot panels and allows individual take, and immediate respawn clears the blood overlay plus the death screen. Owner-reported pass 2026-09-13 for UI-CORE-005. Owner-reported pass 2026-09-13 for UI-CORE-006 Last Bed and four-town Fresh Spawn. Owner-reported pass 2026-09-12 for UI-CORE-007 dedicated-server client: Escape opens pause with WORLD CONTINUES WHILE MENU IS OPEN., local move/look blocked, other client/server keep running, Resume/Escape/Back close; inventory Escape closes inventory first; Tab/M do not stack. Owner-reported pass 2026-09-13 for standalone PAUSED/world-pause. Owner-reported pass 2026-09-13 for UI-CORE-008: settings language/font, Display Revert, HUD Scale/Safe Zone persist, categories, stacking, and no Text Scale control after rebuild (locked at 1.0). Xbox/PlayStation hardware checks remain deferred. UI-CORE-003 remains planned in G4.2. Agent does not run PIE.
OWNER-REPORTED PASS — 2026-09-12 (UI-CORE-001 + UI-CORE-002). Owner reported the inventory retest passed after the Tab-close crash fix and clothing pickups. Scope: Dedicated Server + two client Preview windows; Tab toggle; Escape/Close; Worn row; drag/Equip of the four existing clothing items. Does not close G4. The approved Character + Container Focus layout, side-by-side loot, Take All/Transfer All UI and final modal presentation are G4.2; map, death/spawn, pause, settings and controller remain out of this pass.

UI-CORE-001 — inventory activatable lifecycle

C++ in this change set:

  • ULambeerInventoryWidget derives ULambeerActivatableWidget. BindWidget names and assignment/magazine/drop logic are unchanged.
  • ULambeerInventorySubsystem opens through ULambeerUIManagerSubsystem::PushWidget on UI.Layer.Screen and closes with DeactivateWidget. It no longer calls PresentLegacyWidget, DismissLegacyWidget, or ReleaseKeyboardToGame.
  • Delegates bind in NativeOnActivated and unbind in NativeOnDeactivated/NativeDestruct. Back/Close notify the facade so the open map cannot go stale.
  • Input mode stays on the UI manager. The widget no longer forces viewport focus or disables its tree. Fallback focus target is Button_Close when Blueprint GetInitialFocusTarget is unset.
  • Escape uses the existing CommonUI Back contract. While the screen is open, CommonUI Menu mode blocks the PlayerController IA_Inventory bind. Registering that same UInputAction through RegisterUIActionBinding crashed on 2026-09-12 because CommonUI Enhanced Input support is off (LegacyActionData assert). Tab is consumed by a Slate input preprocessor while the screen is active. Owner-reported pass 2026-09-12: Tab opens and closes; Escape still closes.

Unreal MCP 2026-09-11 (after owner Editor rebuild): PIE was not running. CompileWidgetBlueprint and save of /Game/Lambeer/UI/Inventory/WBP_Inventory succeeded. Parent remains ULambeerInventoryWidget (Common UI Plugin category). GetWidgets still reports 20 widgets including bound Button_Close.

Owner PIE (UI-CORE-001)

  1. Owner-reported pass 2026-09-12: Dedicated Server + two client Preview windows. Type in a client Preview window.
  2. Owner-reported pass 2026-09-12: Open inventory with Tab. Existing layout still shows hands, Q1–Q0, pockets/containers, weight and Close.
  3. Owner-reported pass 2026-09-12: Close with Tab (IA_Inventory again). Escape (CommonUI Back) and Close remain available. After close, movement/look and the game cursor state return.
  4. Repeat one drag/assignment you already know works (Wood among hands/pockets and a Q3–Q0 bind). This slice must not lose that logic. Pocket drag/drop already passed 2026-09-08.
  5. In this multiplayer topology the world must keep running while inventory is open. Do not treat Xbox/PlayStation as required for this slice.

UI-CORE-002 — inventory command backends

[CONFIRMED 2026-09-11 owner answers] Command rules below are canonical. Stale-selection uses ExpectedItemId (the stack’s ItemId at the requested index). There is no generation token. Server rejects when the index is empty, missing, or holds a different item.

  • Merge: dragging the same mergeable item onto another stack combines them up to MaxStack; remainder stays on the source. Durability-tracked items and magazines still do not merge.
  • Split: fails unless the same container has an empty slot. Does not merge into an existing same-item stack. Context menu: Split 1, Split half, and Split amount... (typed 1…quantity−1).
  • Sort: by display name, weight, or item type, per container (each bag separately). Empty container cells still open this menu.
  • Inventory Search: removed from UI, native filtering and the G4.2 contract by owner decision on 2026-09-14.
  • Drop: context menu Drop throws the whole stack. Same world pickup as the Drop slot.
  • Pickup/store: Clothing equips an empty matching slot (no replace). Weapon goes to an empty hand first. Other types merge incomplete stacks, then an empty storage cell, then an empty hand. bCanHolsterOnBack takes an empty back slot before storage.
  • Take All: source inventory → player, filling every player storage container that can fit (TryAddStack / PickContainerWithSpace). Side-by-side loot UI is UI-CORE-003 in G4.2. World-container interact opens inventory loot panels; Take All from those panels uses TryTakeAllFromWorldLoot, not vacuum TransferAllTo on Interact.
  • Transfer All: one player container at a time into the linked target, not the whole character. Shown only when LinkedTransferInventory is set.
  • Use: from the inventory slot in place. No authored consume/heal/eat fields exist; TryUseStackAt rejects without consuming and logs.
  • Equip (menu / Ctrl+RMB / drag onto Worn or Back): automatic or explicit slot. Clothing uses Def->EquipmentSlot. Holsterable Weapon/Tool uses the first empty BackWeapon1 then BackWeapon2; if both are occupied, Equip displaces BackWeapon1. Occupied slots pack the previous worn-storage contents into NestedContents, then move that item into player storage when there is space, otherwise drop it as a world pickup. Drag from loot/death-bag cells onto Worn/Back uses TryEquipStackFromWorldLoot. World pickup/store still does not replace worn clothing.

Context menu still includes Unload ammo / Remove magazine. Owner-reported command pass 2026-09-11 for merge, split, drop, sort, search, Use (no consume), Equip, and pickup routing. Two gaps in that PIE were worn clothing wear slots and Tab-close. Those crashed on the first rebuild (RegisterUIActionBinding / LegacyActionData). Owner-reported pass 2026-09-12: inventory opens without that crash; Tab closes; nine wear slots are visible at the top of Scroll_Containers; sandbox Pants/Glasses/Body Armor/Backpack pickups equip into Legs/Eyes/Armor/Pack. G4.2 now binds the nine Worn targets to designer Box_WornSlots above the container list (not inside the scroll) and replaces the temporary C++ split window with an in-widget overlay. Take All / Transfer All presentation is that G4.2 transfer layout.

Map save verified 2026-09-12 (L_Dev_Sandbox is_dirty false). MCP placed the four existing clothing/equipment pickups on a row opposite the L1810 cubes (positive Y, Z 260): Pickup_Clothes_Pants_Test at (200, 50, 260) Item.Clothes.Pants ×1; Pickup_Clothes_Glasses_Test at (240, 50, 260) Item.Clothes.Glasses ×1; Pickup_Clothes_BodyArmor_Test at (280, 50, 260) Item.Clothes.BodyArmor ×1; Pickup_Backpack_Improvised_Test at (320, 50, 260) Item.Backpack.Improvised ×1. No Head, Torso, Feet, Hands, or Vest Data Assets exist, so those wear slots have no sandbox pickup.

Owner Editor rebuild then PIE (UI-CORE-002)

  1. Owner-reported pass 2026-09-12: Close Unreal Editor so UnrealEditor-Lambeer.dll is not locked.
  2. Owner-reported pass 2026-09-12: Compile LambeerEditor Win64 Development and reopen this project.
  3. Tell the agent the Editor is open again if Unreal MCP should recompile WBP_Inventory.
  4. Owner-reported pass 2026-09-12: Dedicated Server + two client Preview windows. Type in a client Preview window.
  5. Owner-reported pass 2026-09-12: Tab opens and closes. Escape and Close may still work.
  6. Owner-reported pass 2026-09-12: Worn row at the top of the container list. Pickup/Equip of Pants, Glasses, Body Armor and Improvised Backpack into Legs / Eyes / Armor / Pack. Head, Torso, Feet, Gloves, and Vest stay empty until those items exist.
  7. Owner-reported pass 2026-09-11: Right-click a stack with quantity > 1: Split 1 / Split half / Split amount. Drop throws the whole stack.
  8. Owner-reported pass 2026-09-11: Drag two incomplete Wood stacks onto each other: they merge up to MaxStack.
  9. Owner-reported pass 2026-09-11: Right-click a container cell (including empty): Sort by name / weight / type reorders only that bag.
  10. Owner-reported pass 2026-09-11: Right-click clothing or a holsterable weapon/tool: Equip. Right-click any item: Use must not consume it.
  11. Owner-reported pass 2026-09-11 / clothing pickup 2026-09-12: Pickup: empty clothing slot wears it; occupied clothing slot stores. Weapon to empty hand first. Other items merge then empty cell then hand. Holsterable items take an empty back slot before storage.
  12. [OWNER 2026-09-15] Drag clothing/backpack from a death bag or other loot onto Worn slots must equip. Occupied slots store or drop the previous item. RMB Equip and Ctrl+RMB equip from inventory or loot. Ctrl+LMB transfers one stack between the character and an open non-death-bag container. Action hints show those shortcuts. Owner PIE pending after the native rebuild.
  13. Take All / Transfer All wait for the side-by-side layout unless a linked inventory is present. This remains UI-CORE-003 in G4.2.

UI-CORE-003 is preserved on Gate G4.2. It owns the approved Character + Container Focus hierarchy, WBP_ContainerTransfer, and context/split overlay presentation. Inventory Search was removed by owner decision on 2026-09-14. Map, death/spawn, pause and settings remain closed G4 tasks.

UI-CORE-004 — world map screen / view model

C++ in this change set. Owner-reported pass 2026-09-12 for the north-up minimap and frozen full-map death-diamond retest. Owner-reported pass 2026-09-13 for pan/zoom/center, shared ping, filter toggles, map↔inventory Tab switching, and the zoom-clip retest. Unreal MCP 2026-09-12 (after owner Editor reopen): created, compiled and saved /Game/Lambeer/UI/Map/WBP_WorldMap. Parent is ULambeerMapScreen. GetWidgets reports an empty designer tree (0 widgets). Runtime layout still comes from the C++ fallback in ULambeerMapScreen::EnsureLayout. DefaultGame.ini MapWidgetClass now points at WBP_WorldMap_C. Unreal MCP 2026-09-12: imported owner-supplied temporary map image as /Game/Lambeer/UI/Map/T_WorldMap_Temporary (1024×576, TEXTUREGROUP_UI, clamp, never-stream). Source file: RawResource/UI/Map/WorldMap_Temporary.jpg. The canvas draws that texture with the same pan/zoom as markers. The image is not geographically registered to L_Dev_Sandbox or any production footprint; TBD-WORLD-001 is unchanged.

OWNER-REPORTED PASS — 2026-09-12 (north-up minimap + frozen full-map death diamond). Earlier the same day: after UI_G3AddMarker Death the world-map player icon left the center, the minimap death diamond stuck to the rim, then the full-map diamond was still missing, then the minimap image rotated with the camera and the full-map diamond followed the pawn. Cause of the last two: heading-up Image_Disc rotation, and NativeTick recapturing player-centered fallback bounds every frame. Source keeps the minimap image north-up, projects minimap markers in world XY, draws a heading chevron at the pip, and freezes fallback bounds while the map is open (KeepOrMakeFallbackBounds). Owner reported that retest passed: the island image does not spin with the camera; the heading chevron shows facing; walking with the full map open leaves the death diamond in place and moves the player chevron; the minimap diamond moves only when the pawn walks. Scope does not include pan/zoom/center, shared ping, filter toggles, or map↔inventory Tab switching. Neither the 50 m clamp nor the pip size is a production footprint or an approved radar radius. The temporary image is not geographically registered.
OWNER-REPORTED PASS — 2026-09-13 (UI-CORE-004 remainder + zoom clip). Owner reported pan, zoom, Center player, shared ping, filter toggles and map↔inventory Tab switching passed, then that the zoomed map image stays inside the map panel after the ClipToBounds / Slate clip follow-through. Does not close G4 (UI-CORE-006 Last Bed / four-town Fresh Spawn remain).
  • ULambeerMapScreen derives ULambeerActivatableWidget and opens through ULambeerMapSubsystem on UI.Layer.Screen. Opening the map closes inventory and the reverse, so the two screens do not stack.
  • Toggle is M via runtime IA_UI_Map_Runtime (or authored IA_UI_Map if present). Menu mode blocks the PlayerController bind, so the map screen uses a Slate preprocessor the same way inventory uses Tab. Escape/Close still use CommonUI Back. Tab from the map switches to inventory.
  • The map starts fully revealed: there is no fog of war. Category filters are local on ULambeerHUDAdapter and already feed compass/minimap. The screen exposes All plus one toggle per ELambeerUIMarkerCategory.
  • Pan (left-drag), wheel zoom toward the cursor, and Center player are local view state. Zoom 1 is the full bounds; the 32× ceiling is an implementation safety clamp, not an approved gameplay setting. The canvas and map overlay clip paint to bounds so a zoomed image cannot cover the filter list or action row.
  • World XY → UV uses optional authored bounds on the widget. Empty/inverted bounds fall back to a square of at least 50 m half-extent captured when the map opens (player-centered, expanded to include then-visible markers) and frozen while the screen stays open. Walking updates the player chevron; it does not recapture bounds, so a death diamond keeps its world UV. Reopening the map recaptures. That fallback is an implementation readability clamp, not a production map size. Production footprint remains TBD-WORLD-001. Temporary image T_WorldMap_Temporary fills world UV 0–1 and pans/zooms with the view. Player/marker positions on that image are not a claimed geographic match.
  • Minimap Image_Disc draws the same temporary T_WorldMap_Temporary inside the circular disc, north-up. The image does not rotate with camera yaw. Nearby markers use the 50 m implementation range on a north-up disc (HUD east / Unreal −X right, world +Y up) and sit inward from the rim; markers beyond the clamp stay on the rim. Looking around rotates the center heading chevron only. Walking moves markers relative to the pip. The center player pip is 8 px so a 4 m death diamond is not covered. Compass tape remains heading-only. The 50 m value is not an approved radar radius. Player/marker positions on that image are not a claimed geographic match. [OWNER CORRECTION 2026-09-14] east-is-right follows look-right, not Unreal +X.
  • Shared ping: click places, click the owner’s existing ping removes. ALambeerPlayerState replicates one ping per player. The server rejects non-finite positions. No ping duration or max range is authored. Debug: UI_G4ToggleMap, UI_G4SetPing / UI_G4SetPing 0.

Owner PIE (UI-CORE-004)

  1. Owner-reported ready 2026-09-12: Close Unreal Editor so UnrealEditor-Lambeer.dll is not locked.
  2. Owner-reported ready 2026-09-12: Compile LambeerEditor Win64 Development and reopen this project. WBP_WorldMap was created after that reopen.
  3. Owner-reported pass 2026-09-12: Close Unreal Editor again. The temporary map image needs a new LambeerEditor Win64 Development compile so Live Coding / the locked DLL does not keep the previous map paint path.
  4. Owner-reported pass 2026-09-12: Compile LambeerEditor Win64 Development and reopen this project.
  5. Owner-reported pass 2026-09-12: Dedicated Server + two client Preview windows. Type in a client Preview window.
  6. Owner-reported pass 2026-09-13: Press M (or UI_G4ToggleMap). The map opens without stacking on inventory and shows T_WorldMap_Temporary (island aerial). The “No authored map image” label is hidden. M, Escape and Close dismiss it. After close, movement/look return. In this multiplayer topology the world keeps running.
  7. Owner-reported pass 2026-09-12: UI_G3AddMarker Death. A filled red death diamond appears, then stays on the same full-map location while the player chevron moves. Minimap shows the temporary island image north-up (it does not spin with the camera). The heading chevron shows facing. The nearby death diamond sits inward from the rim, stays in world direction when looking around, and moves on the disc only when the player walks. Owner-reported pass 2026-09-13: filter toggles. Do not expect those diamonds to sit on a correct island location.
  8. Owner-reported pass 2026-09-13: Drag to pan, mouse wheel to zoom, Center player. The island image pans/zooms with the markers and stays inside the map panel. Zooming out past the full map is not possible.
  9. Owner-reported pass 2026-09-13: Click the map to place a ping. The other client sees that ping on map/compass/minimap. Click the same ping to remove it. UI_G4SetPing is an alternate path 4 m ahead of the pawn.
  10. Owner-reported pass 2026-09-13: Tab from the map opens inventory; M from inventory opens the map. They do not remain stacked.
  11. Do not treat Xbox/PlayStation as required. Do not treat this image as production map art or as a locked world footprint.

UI-CORE-005 — death/respawn state and death-marker lifecycle

C++ in this change set. Owner-reported pass 2026-09-12 for nested backpack dump, death-bag loot-panel interact with individual take, and immediate-respawn HUD/death-screen refresh. Owner-reported pass 2026-09-13 for UI-CORE-005. Last Bed and four-town Fresh Spawn were UI-CORE-006 and later passed 2026-09-13. Full-loot hardcore: inventory stacks, then held items, then worn/back equipment dump into ALambeerDeathBag. Worn-container contents (backpack, pants, vest, …) whose ContainerId matches that worn item’s ItemId are packed into FInventoryStack::NestedContents on that item, so they stay inside the dropped backpack instead of flattening as loose bag stacks. Body.Pockets stacks stay loose. Empty dump does not spawn a bag; the death screen still opens. Interact on the bag (and other AWorldDropContainer crates) opens inventory loot panels instead of vacuum TransferAllTo. Clients read ReplicatedLootStacks because the container inventory is not owner-replicated. Take / drag into a player container uses TryTakeFromWorldLoot; Take All uses TryTakeAllFromWorldLoot. Nested panels list packed contents so another player can pick those items individually. Equipping a packed storage item unpacks NestedContents back into worn ContainerId stacks. The bag destroys itself when emptied. G4.2 side-by-side transfer layout is not used yet; loot panels append under the current Scroll_Containers list. No production despawn timer is authored; UI_G4DestroyDeathBag / Lambeer.DestroyDeathBag covers the despawn-without-empty path. Death diamonds come from live replicated bags for every client, not from UI_G3AddMarker. Killer name is empty for self/unknown (UI shows Unknown). Cause ids are Damage / Unknown. Last selected bed for G4 is the bed last used to start Sleep. Health restores to MaxHealth on respawn; Hunger/Energy and other attributes are not reset. Owning-client HUD refresh on respawn clears the blood overlay timer and suppresses stale 0-Health low-HP edges until attributes replicate (NotifyLivingPresentation / ClientNotifyLivingPresentation). No ragdoll: movement is disabled until a valid respawn. Death-bag slot/weight caps are implementation so full-loot is not truncated (MinDeathBagSlots = 20, MinDeathBagWeight = 100000), not a production bag size.

  • FLambeerDeathRecord replicates on ALambeerPlayerState. Lethal Health clamp on the PlayerState ASC calls AuthorityNotifyLethalDamage once.
  • Opening death UI closes inventory and map. Tab/M do not open those screens while dead. Escape does not dismiss the death screen without a spawn choice.
  • Debug: Lambeer.Kill / UI_G4Kill, Lambeer.DestroyDeathBag / UI_G4DestroyDeathBag, UI_G4RespawnBed, UI_G4RespawnTown (default Town.NorthCoast).

UI-CORE-006 — death/respawn screen

C++ in this change set. Owner-reported pass 2026-09-12 that immediate respawn closes this screen. Owner-reported pass 2026-09-13 for Last Bed after Sleep and Fresh Spawn to the four sandbox towns. ULambeerDeathScreen derives ULambeerActivatableWidget and hosts the same map canvas as the world map (pan/zoom, no ping). Runtime layout comes from C++ EnsureLayout when the Widget Blueprint designer tree is empty. Unreal MCP 2026-09-12 (after owner Editor reopen): created, compiled and saved /Game/Lambeer/UI/Map/WBP_DeathRespawn. Parent is ULambeerDeathScreen. GetWidgets reports an empty designer tree (0 widgets). DefaultGame.ini DeathWidgetClass points at WBP_DeathRespawn_C. Map save verified 2026-09-12 (L_Dev_Sandbox is_dirty false). Four ALambeerSpawnRegion sandbox stand-ins sit in outliner folder G4/SpawnRegions, about 8 m from PlayerStart (0, 0, 302) on the lower sandbox floor: SpawnRegion_NorthCoast Town.NorthCoast at about (0, 800, 151); SpawnRegion_SouthCoast Town.SouthCoast at about (0, −800, 150); SpawnRegion_River Town.River at about (800, 0, 150); SpawnRegion_Isthmus Town.Isthmus at about (−800, 0, 150). They are not geographically registered and TBD-WORLD-001 is unchanged. Missing regions disable that town button with reason “No authored spawn region”. Last Bed is disabled until a sleep-on-bed has been recorded. Fresh Spawn does not include a sleeping bag.

OWNER-REPORTED PASS — 2026-09-12 (UI-CORE-005 / UI-CORE-006 follow-through). Owner reported “ผ่านแล้ว” for the three remaining death checks after the Editor rebuild. Scope: Dedicated Server + two client Preview windows; items placed in a worn backpack stay packed inside that backpack in the death bag; the other client’s Interact opens inventory loot panels and can take nested items individually; immediate respawn clears the blood overlay / low-HP edges and closes the death screen. Does not close G4. Last Bed, four-town Fresh Spawn, empty-bag marker lifecycle, Take All, DestroyDeathBag, and Tab/M stacking over the death screen are not newly itemized. G4.2 side-by-side transfer layout is out of this pass.
OWNER-REPORTED PASS — 2026-09-13 (UI-CORE-005). Owner reported the death/respawn state and death-marker lifecycle passed. Does not close G4 by itself. UI-CORE-006 Last Bed and four-town Fresh Spawn were not newly named in this report.
OWNER-REPORTED PASS — 2026-09-13 (UI-CORE-006). Owner reported Last Bed after Sleep and Fresh Spawn to the four sandbox towns passed. No sleeping bag. Sandbox towns are not production geography. Closes UI-CORE-006 and Gate G4. UI-CORE-003 remains G4.2. Xbox/PlayStation remain deferred. Agent does not run PIE.

Owner PIE (UI-CORE-005 / UI-CORE-006)

  1. Owner-reported ready 2026-09-12: Close Unreal Editor so UnrealEditor-Lambeer.dll is not locked.
  2. Owner-reported ready 2026-09-12: Compile LambeerEditor Win64 Development and reopen this project. Unreal MCP then created WBP_DeathRespawn and the four sandbox spawn regions.
  3. Owner-reported pass 2026-09-12: Dedicated Server + two client Preview windows. Type in a client Preview console, not the dedicated-server window.
  4. Owner-reported pass 2026-09-12: Put items in a worn backpack, then Lambeer.Kill. Those items stay inside the backpack in the death bag, not as loose bag stacks. Killer Unknown, cause Damage, death-screen copy, Last Bed disabled, and four town buttons were not newly itemized.
  5. Owner-reported pass 2026-09-12: The other client Interact (E) opens inventory loot panels like a storage box, not vacuum-loot, and can pick a nested backpack item individually. Owner-reported pass 2026-09-13: UI-CORE-005.
  6. Owner-reported pass 2026-09-12: Immediate respawn after death. Blood overlay and low-HP red edges clear; the death screen closes. In this multiplayer topology the world must keep running.
  7. Owner-reported pass 2026-09-13: Last Bed after Sleep, and Fresh Spawn to the four sandbox towns. No sleeping bag. Sandbox towns are not production geography.
  8. Do not treat sandbox town locations as production geography. Do not treat Xbox/PlayStation as required.

UI-CORE-007 — pause/menu policy by session type

C++ in this change set. Unreal MCP 2026-09-12 (after owner Editor reopen): created, compiled and saved /Game/Lambeer/UI/Menus/WBP_PauseMenu. Parent is ULambeerPauseScreen. GetWidgets reports an empty designer tree (0 widgets). Runtime layout comes from C++ EnsureLayout. DefaultGame.ini PauseWidgetClass points at WBP_PauseMenu_C. Owner-reported pass 2026-09-12 for dedicated-server client pause, inventory-first Escape, and Tab/M not stacking. Owner-reported pass 2026-09-13 for standalone PAUSED/world-pause. ULambeerPauseScreen derives ULambeerActivatableWidget and opens through ULambeerPauseSubsystem on UI.Layer.Screen. Opening pause closes inventory and map. Death and character-creation screens refuse pause. Tab/M do not open inventory or map while pause is open. Settings and Exit-to-main remain out of this slice (UI-CORE-008 and Gate G5).

  • World pause uses session NetMode, not “am I a client?”. Only NM_Standalone may pause. Listen-server and dedicated-server clients never pause; engine APlayerController::SetPause is already a no-op on NM_Client, but listen-server would pause every connected pawn if that guard used “not client”.
  • Multiplayer shows the confirmed persistent warning WORLD CONTINUES WHILE MENU IS OPEN. Title is MENU. Standalone title is PAUSED and the warning is hidden. Local move/look remain blocked by the existing UI manager Menu input path.
  • HUD-only Escape opens pause by reusing the existing runtime Escape mapping (IA_InventoryEscape_Runtime). While pause is open, Escape/Back/Resume close it. Inventory still consumes the first Escape. Map still uses CommonUI Back. Death still ignores Back.
  • Debug: UI_G4TogglePause. G1 UI_G1SetPauseRequested remains a standalone-only manager flag and is not the pause screen.
OWNER-REPORTED PASS — 2026-09-12 (UI-CORE-007 dedicated-server pause). Owner reported “ผ่านแล้ว” for the required pause checks after WBP_PauseMenu existed. Scope: Dedicated Server + two client Preview windows; HUD-only Escape opens pause with WORLD CONTINUES WHILE MENU IS OPEN.; local move/look stop; the dedicated-server world and the other client keep running; Resume, Escape and CommonUI Back close it and restore movement/look; inventory Escape closes inventory and does not open pause on that same press; Tab/M do not stack inventory or map on pause. Does not close G4. Standalone PAUSED/world-pause, Settings and Exit-to-main are not newly itemized.
OWNER-REPORTED PASS — 2026-09-13 (UI-CORE-007 standalone PAUSED). Owner reported the remaining pause check passed. Single Player Exit-to-main later passed as UI-FE-009 on 2026-09-16. Dedicated Exit-to-main later passed as UI-FE-005 on 2026-09-16. Does not close G4.

Owner PIE (UI-CORE-007)

  1. Owner-reported ready 2026-09-12: Close Unreal Editor so UnrealEditor-Lambeer.dll is not locked.
  2. Owner-reported ready 2026-09-12: Compile LambeerEditor Win64 Development and reopen this project. Unreal MCP then created /Game/Lambeer/UI/Menus/WBP_PauseMenu.
  3. Owner-reported pass 2026-09-12: Dedicated Server + two client Preview windows. Type in a client Preview window, not the dedicated-server window.
  4. Owner-reported pass 2026-09-12: From HUD-only, press Escape (or UI_G4TogglePause). The menu opens, movement/look stop, and the warning WORLD CONTINUES WHILE MENU IS OPEN. is visible. The dedicated-server world and the other client keep running. Resume, Escape and CommonUI Back close it and restore movement/look.
  5. Owner-reported pass 2026-09-12: With inventory open, Escape closes inventory and does not open pause on that same press. Tab/M do not stack inventory or map on the pause screen. A second Escape from HUD-only opening pause was not newly itemized beyond the HUD-only Escape check above.
  6. Owner-reported pass 2026-09-13: Optional standalone/single-player pass: the same menu pauses the world (PAUSED, no WORLD CONTINUES warning) and Resume unpauses. This check is in addition to the dedicated-server topology; do not treat a dedicated-server client as single-player.
  7. Do not treat Xbox/PlayStation as required. Settings are UI-CORE-008. Do not treat Exit-to-main as part of this slice.

UI-CORE-008 — settings model, staged apply/revert, per-category adapters

C++ in this change set. ULambeerUserSettings subclasses UGameUserSettings. DefaultEngine.ini sets GameUserSettingsClassName=/Script/Lambeer.LambeerUserSettings. HUD Scale, Safe Zone Scale and language (en/th) persist on that object. Text Scale is not a G4 Settings field (owner decision 2026-09-13; runtime stays at 1.0). Display resolution and window mode use engine UGameUserSettings fields. Opening the screen copies applied values into a draft. Apply validates then writes; Revert restores the last applied draft. HUD scale changes live-preview and persist only on Apply. Display changes apply tentatively and must be confirmed; they revert after 15 seconds, on Revert, or if the screen closes. That 15-second window is an implementation clamp, not an approved gameplay setting. Graphics, Audio, Voice, Controller, Mouse + Keyboard, Gameplay and Accessibility are listed with an explicit unavailable reason and have no persistable fields. Crosshair Customization is listed under HUD as waiting for approved values. Exit-to-main remains Gate G5. Invalid culture, non-positive scales, Safe Zone outside 0–1, non-positive resolution and unknown window mode cannot persist. ULambeerSettingsScreen derives ULambeerActivatableWidget and opens through ULambeerSettingsSubsystem on UI.Layer.Screen. Pause Settings stacks this screen without closing pause. Escape/Back close settings first. Tab/M still do not stack. Death closes settings then pause. Unreal MCP 2026-09-12 (after owner Editor reopen): created, compiled and saved /Game/Lambeer/UI/Menus/WBP_Settings. Parent is ULambeerSettingsScreen. GetWidgets reports an empty designer tree (0 widgets). Runtime layout comes from C++ EnsureLayout. DefaultGame.ini SettingsWidgetClass points at WBP_Settings_C. Debug: UI_G4ToggleSettings, UI_G4ApplySettings, UI_G4RevertSettings, UI_G4ConfirmDisplay.

  • Editable G4 categories are HUD (HUD Scale, Safe Zone Scale + English/Thai) and Display (engine resolution/window mode). Text Scale is not adjustable in G4 Settings.
  • Settings labels use G2 string tables ST_UI_Common_EN / ST_UI_Common_TH. Apply th sets culture like UI_G2SetCulture, then refreshes this screen from the TH table. Owner reported 2026-09-12 that Apply th left the settings labels in English, then <MISSING STRING TABLE ENTRY>, then Thai tofu boxes (C++ EnsureLayout used engine Roboto). Follow-through writes the 36 Settings.* keys, force-saves the tables, and applies /Game/Lambeer/UI/Common/Fonts/FF_UI_Primary to settings/pause runtime TextBlocks. Owner-reported pass 2026-09-13: Thai settings labels render with FF_UI_Primary (no tofu). C++ HUD/pause NSLOCTEXT still stays English until a later locres gather. G2 Gallery samples still switch through Game.locres; that Gallery path is not newly itemized in this retest.
  • Unsupported categories cannot persist. Their adapters expose a reason string only.
  • Dedicated-server client Preview windows may not change OS resolution; the confirm/revert path still runs. Do not treat a Preview window as a shipping display test.

Owner PIE (UI-CORE-008)

OWNER-REPORTED PASS — 2026-09-13 (UI-CORE-008 language/font). Owner reported Apply th shows Thai settings labels with FF_UI_Primary and no missing-glyph boxes.
OWNER-REPORTED PASS — 2026-09-13 (UI-CORE-008 G4 settings slice). Owner reported HUD has no Text Scale control after rebuild. Display Revert, language/font, categories, HUD Scale/Safe Zone persist and stacking already passed. Text Scale stays locked at 1.0 in G4; player-facing Text Size remains on the accessibility list for a later settings pass. G2 UI_G2SetPresentationScales remains a debug path. G4 later closed 2026-09-13 after UI-CORE-006. UI-CORE-003 remains G4.2.
  1. Owner-reported ready 2026-09-12: Close Unreal Editor so UnrealEditor-Lambeer.dll is not locked.
  2. Owner-reported ready 2026-09-12: Compile LambeerEditor Win64 Development and reopen this project. Unreal MCP then created /Game/Lambeer/UI/Menus/WBP_Settings.
  3. Owner-reported pass 2026-09-13: Dedicated Server + two client Preview windows. Type in a client Preview window, not the dedicated-server window.
  4. Owner-reported pass 2026-09-13: From HUD-only, Escape to pause, then Settings (or UI_G4ToggleSettings). The nine confirmed categories are listed. HUD and Display are editable. Graphics/Audio/Voice/Controller/Mouse + Keyboard/Gameplay/Accessibility show a reason and Apply is disabled.
  5. Owner-reported pass 2026-09-13: HUD Scale / Safe Zone Apply-revert persist. Text Scale is not in G4 Settings (locked at 1.0). Owner confirmed the HUD category has no Text Scale control after rebuild.
  6. Owner-reported pass 2026-09-13: HUD Language th then Apply switches the settings category/field labels to the TH string-table copy and renders those glyphs with FF_UI_Primary (no tofu). fr is not offered and cannot persist. C++ HUD/pause NSLOCTEXT remaining in English is not a fail for this slice. G2 locres-backed Gallery samples are not newly itemized in this retest.
  7. Owner-reported pass 2026-09-13: Display Apply then Revert re-applies the previous resolution. Keep / 15-second timeout were not listed as failing. Do not treat a Preview window as a shipping display test.
  8. Owner-reported pass 2026-09-13: Escape/Back from settings returns to pause. A further Escape closes pause. Tab/M must not stack. The dedicated-server world and the other client keep running.
  9. Do not treat Xbox/PlayStation as required. Do not treat colorblind, subtitles, rebind, camera shake, Disable Flashing, Crosshair Customization, audio volumes, graphics quality or Text Scale as part of this slice. Do not treat Exit-to-main as part of this slice.

Gate G4.2 Inventory Presentation & Container Transfer

Current owner direction — 2026-09-14: Inventory_UI_NEW.png replaces Rescue Equipment as the complete Inventory/transfer visual source of truth. Runtime behavior and the approved layout remain unchanged.

Gate state: COMPLETE — owner-reported PIE acceptance 2026-09-14. The Night Ops presentation, field-free header, existing 36/64 hierarchy, responsive Worn WrapBox, then-current 126-square equipment/container cells, flexible Q1/Q2 and hand targets, side-by-side transfer mode, live portrait and retained command routes passed. The owner reported drag, split, sort, drop, hand/Q1/Q2 and Player/Target transfer passed. Search was the sole failed route and was removed by explicit owner decision as unsuitable for this game; the owner then confirmed the header without Search and retained layout passed. Development Game/Editor builds, focused non-PIE automation 3/3 and WBP_Inventory compile/save/readback pass; readback reports 43 widgets and no Search widget. UI-CORE-003 and G4.2 are closed; G4.3 is the next gate.
[OWNER 2026-09-15] Worn equipment slots and player/loot container cells are now fixed 88×88 squares, about 30% smaller than the 126 px inspection target, so more cells fit in the allotted inventory region. Q3–Q0 and Drop stay 104×104; Q1/Q2 and Left/Right Hand stay 104 high and still stretch horizontally. Item artwork is centered in the square; title and quantity are Overlay layers and must not inset or offset the icon. Overlay label/quantity text is 7 pt (~40% smaller than the 12 pt inspection size). Runtime tokens: LambeerInventoryPresentation::SlotSize and SlotLabelFontSize. Closed-Editor LambeerEditor Win64 Development rebuilt successfully; focused non-PIE Inventory tests passed 3/3 with zero warnings/errors. Owner PIE pending.
Approved Night Ops Inventory visual reference with dark blue-black panels, thin steel borders, white text and cyan focus corners
Current visual source of truth · RawResource/ConceptReference/Inventory_UI_NEW.png · 1920×1080: use its palette, surface hierarchy, fine outlines, typography hierarchy and cyan interaction states. The existing layout contract remains authoritative; sample items, counts, character art and key hints are illustrative and stay live at runtime.

Night Ops presentation replacement — owner selected 2026-09-14

Designer/native integration and owner runtime acceptance passed 2026-09-14. Panel, shell, slot, button, input and scrollbar chrome use resource-less RoundedBox brushes so the thin Night Ops geometry stays crisp at every size. The former seven Rescue Equipment Texture2D assets and source pack were removed only after referencer checks returned empty. The portrait material's runtime-overridden texture parameter uses the engine default texture instead of a deleted theme slot. The sole Inventory chrome bitmap is a neutral corner mask at /Game/Lambeer/UI/Inventory/Textures/NightOps/T_UI_Inventory_NightOps_Focus, with source RawResource/UI/Inventory/UMG/NightOps/ui_inventory_night_ops_focus_corners.png; live states tint it cyan or danger red. Item icons, Drop glyph and portrait material remain separate content assets.

Theme authority: FEAT-HUD-UI Night Ops override. The legacy anchor g42-rescue-pack is preserved for inbound document links. Runtime tokens in LambeerInventoryPresentation.h are Background #070D12, Surface #0D161C, Raised #121E26, Border #364A56, Border Bright #617580, Accent #58EBEF, Text #DFE7EA and Muted #8797A0. Google Sans Medium/SemiBold plus letter spacing provides the reference's condensed technical hierarchy while preserving English/Thai glyph support.

ElementImplementationState contract
Shell / panel / slotResource-less dark RoundedBox fill with 1 px steel-blue outline and 2–3 px radiiNo layout or desired-size change between states
Buttons / split inputDark fill and fine outline; no light plates or orange action blocksCyan outline on hover/focus/press; disabled remains muted
Focus / selection / drop targetT_UI_Inventory_NightOps_Focus Image overlayCyan corners; danger red for denied; color is reinforced by corner shape
ScrollbarResource-less near-black track and steel thumbCyan thumb on hover/drag; no stretched bitmap
TextCool white primary and blue-gray secondary; quantities remain whiteLive localized text, never baked into the reference image
Historical 2026-09-13 crash record: the earlier Rescue pass exposed a dangling UEditableTextBox style pointer. The retained fix writes WidgetStyle on the UObject and calls SynchronizeProperties(); the Night Ops change does not restore the unsafe setter path.

Owner reference fidelity pass — 2026-09-13

Native build verified — 2026-09-13: Owner build log reported seven C4458 errors because local Slot variables hid UWidget::Slot. Renamed them by role (BackingSlot, QuickSlot, SafeSlot, LeftSlot, TitleSlot, WeightSlot, PortraitSlot). With Editor closed, the agent rebuilt LambeerEditor Win64 Development: Result Succeeded, exit 0, 6.67 seconds; Lambeer DLL linked successfully. Automation assertions were compiled but not executed. Reopen Editor before owner PIE; visual acceptance remains pending.
Historical drag regression — corrected; owner interaction pass 2026-09-14. The reference-fidelity pass changed Button_Slot from HitTestInvisible to Visible in ULambeerInventorySlotWidget::NativeConstruct. The hit-testable child button consumed the left mouse press before the parent slot's NativeOnMouseButtonDown could call DetectDragIfPressed. Source restores HitTestInvisible and records the input-ownership reason beside that assignment. The closed-Editor LambeerEditor Win64 Development rebuild passed, the affected Widget Blueprints compiled/saved, and the owner later confirmed the retained drag routes passed.
Owner correction 2026-09-13 — Q1/Q2 are physical back storage; Game and Editor builds passed; automation 2/2 passed; owner PIE pending. The owner rebuilt and retested the earlier direct-drag fix but the Sledgehammer remained visible in Q1/Q2 after moving into a hand. The prior assumption that hotkey draws may keep a logical item reference in Q was incorrect. Source audit found held-origin projection in GetAssignedBackWeaponStack, Inventory and HUD, plus reservation-based routing in drag planners, container/magazine actions and equip guards. Slot occupancy and slot actions now use physical EquippedItems only. Q1/Q2 drag moves/swaps physical stacks; an empty Q cannot act on a held item even if its OriginBackSlot names Q. A vacated slot can accept a different item while the former item remains held. Q3–Q0 retain shortcut behavior. OriginBackSlot is a non-owning return hint only. Added Lambeer.HUD.PhysicalBackSlots to test real component getters after two-handed hammer moves from both Q slots to both hand targets, stale return hints and slot reuse, plus updated BackWeaponReturn assertions. Both Lambeer Win64 Development and LambeerEditor Win64 Development built successfully. Headless non-PIE automation executed Lambeer.HUD.PhysicalBackSlots and Lambeer.HUD.BackWeaponReturn: 2/2 Success, process exit 0. Evidence: Saved/Logs/G42PhysicalBackSlots.log and Saved/Automation/G42PhysicalBackSlots/index.json. Owner Dedicated Server + two-client PIE remains pending. Previous declarations that the regression was fixed were premature; no runtime pass is recorded.

The owner supplied Inventory_UI_NEW.png and requested a full presentation replacement while preserving behavior and layout. The reference does not add its sample inventory, capacities, clothing, character or key hints to runtime state.

Night Ops visual restyle, focus/opacity correction and retained interactions passed owner PIE 2026-09-14. Close/Sort stay compact; item artwork remains centered and clipped; the live portrait recreates after close/reopen; Worn/Quick title rows remain collapsed; Q1/Q2 and both hands retain flexible width; container cells remain left-packed; Drop stays a frameless arrow-to-tray action; item titles remain 12-point white Overlay text; and Dimmer/SafeZone_Inventory retain the 10%–90% viewport anchors with 0/15 px offsets. The new pass changes those elements only from Rescue off-white/orange chrome to Night Ops dark surfaces, steel outlines, white/muted text and cyan state accents. The owner confirmed drag, split, sort, drop, hand/Q1/Q2 and Player/Target transfer passed; Search was removed rather than retained.
Latest owner visual correction — owner-reported PIE pass 2026-09-14. The first Night Ops PIE screenshot showed the Head equipment slot with cyan focus corners before any pointer hover because it was the screen's initial CommonUI focus target. Initial focus now routes to the valid Close button instead; keyboard navigation to a slot still exposes its cyan focus state. Background, surface and raised fill colors use 0.80 alpha while borders, text, icons and semantic accents remain fully opaque. The closed-Editor LambeerEditor Win64 Development rebuild, all four Inventory Widget Blueprint compiles/save/readback and three focused non-PIE Inventory tests passed with zero warnings/errors. The owner then reported the corrected PIE presentation passed. Layout and command behavior are unchanged.
  • Saved Editor changes — 2026-09-14: all four Inventory Widget Blueprints compile/save against the rebuilt native class and carry the Night Ops resource-less chrome. Readback reported zero former Rescue texture paths, 46 RoundedBox brush occurrences across the four assets and the renamed Night Ops focus mask on WBP_InventorySlot. Lambeer.HUD.InventoryActivatable, Lambeer.HUD.InventoryCommandRules and Lambeer.HUD.InventoryPresentationFallback passed 3/3 with zero warnings/errors.
  • Removed former theme: all seven /Game/Lambeer/UI/Inventory/Textures/RescueEquipment/ assets, their source pack and the superseded RawResource/ConceptReference/Inventory_UI.png were deleted after empty referencer checks. They remain recoverable from version control. The neutral focus-corner mask was moved and renamed under NightOps; it is not used with the former palette.
  • Item artwork: all 13 discovered ULambeerItemDefinition assets had no Icon. Generated, inspected, imported and assigned all 13 icons under /Game/Lambeer/UI/Inventory/Textures/Items/. Sources and full built-in prompts: Icons/generation.json. L1810, its magazine and Sledgehammer used MCP asset-thumbnail references; the other icons are representative art for existing definitions whose inspected world mesh was a placeholder. The icons deliberately use an opaque navy background. No item quantities, ownership or gameplay values were changed.
  • Latest owner correction — 2026-09-14; native build passed; owner PIE pending: The prior WrapBox still received only its desired width because its HorizontalBox slot used HAlign_Left. The saved asset and native layout now use HAlign_Fill on that parent slot, while the WrapBox contents remain left-aligned. NativeGetDesiredFocusTarget now returns the first equipment slot instead of its non-focusable layout panel. This corrects the earlier explanation of the focus warning. WBP_Inventory compiled/saved and parent alignment readback passed; LambeerEditor Win64 Development rebuilt successfully on 2026-09-14 (DLL 00:21:19). Focused non-PIE Lambeer.HUD.InventoryCommandRules passed 1/1 with zero warnings/errors; report: Saved/Automation/InventoryWornWidthFocus/index.json. Owner client PIE must still verify row fill and absence of the focus warning.

  • Newest Worn flow source built: The 2026-09-14 accepted layout used fixed 126×126 Worn/container/loot squares, 150% of the prior 84×84 baseline. The 2026-09-15 owner request compacted those cells to 88×88 (~30% smaller) without changing WrapBox flow, action-slot heights, or command routes. Owner PIE rejected the fixed five-column UniformGridPanel because it moved four cells down despite remaining right-side width. WBP_Inventory now contains a left-aligned, allotted-width Wrap_WornSlots; it places as many cells as fit on the current row and wraps only the remainder. Q3–Q0 and Drop remain 104×104 action targets; Q1/Q2 and Left/Right Hand remain 104 high and stretch horizontally to consume the remaining row width. Item titles and quantities are separate floating Overlay layers; neither contributes a VerticalBox layout height or pushes the icon. Every item brush remains centered at its authored aspect, and the square root clips residual overflow. Container grids use left alignment. Worn/Quick title rows are collapsed. Drop is a frameless navy arrow-to-tray icon with tooltip and color-state feedback. Slot and item titles use 12-point white text over the navy well with ellipsis/full tooltip and no label plate. Close and per-container Sort retain the 14-point compact token; Search is removed. Unreal MCP replaced the Worn UniformGrid with WrapBox, compiled/saved the Widget Blueprint, and readback confirmed responsive allotted-width flow with 4 px spacing. With Editor and Live Coding closed, LambeerEditor Win64 Development rebuilt successfully. Focused non-PIE Lambeer.HUD.InventoryCommandRules passed without warnings/errors.
  • Character portrait source built; runtime acceptance pending: a transient local SceneCapture2D shows the owning character and attached actors only while Inventory is active in character mode; it releases capture/target/material on close or transfer. Activation now recreates it immediately, invalid resources are rebuilt as a unit, and the portrait Image material brush is rebound on each update so the empty brush left by deactivation cannot persist across reopen. Framing derives from the pawn capsule and preview aspect. The UI material /Game/Lambeer/UI/Inventory/Materials/M_UI_InventoryPortrait was created, wired, compiled and saved via MCP (SceneColor RGB, inverted capture alpha). Lighting, pose, attachment visibility, gamma, framing and capture cost have not been observed in PIE.

Acceptance result and remaining gate check

[OWNER-REPORTED G4.2 PASS 2026-09-14] The owner accepted the final Night Ops PIE presentation and confirmed drag, split, sort, drop, hand/Q1/Q2 and Player/Target transfer passed. Search failed and was explicitly removed as unsuitable for this game. After removal, Development Game/Editor builds, WBP_Inventory compile/save/readback and focused non-PIE Inventory automation 3/3 passed; the saved widget tree has 43 widgets and no Search widget. The owner then confirmed the field-free header, Title/Weight/Close layout and complete item presentation passed. G4.2 / UI-CORE-003 is closed.

Legacy UMG source texture packs — removed

The earlier olive/brass pack was removed on 2026-09-13. The superseded seven-texture Rescue Equipment pack and its Inventory_UI.png reference were removed on 2026-09-14 after empty referencer checks. Night Ops now uses resource-less brushes plus one neutral focus-corner mask.

Approved layout contract

  • Reference and safe zone: author against the 1920×1080 reference canvas inside the project Safe Zone. FHD is the reference density; 2K/4K use DPI scaling. 16:10 gains vertical container space; 21:9/32:9 gain outer gutters without stretching slot proportions.
  • Header: compact row with Inventory title, carried weight and Close. Inventory Search is intentionally absent by owner decision.
  • Main split: Character region 36% and Inventory region 64%. Character preview fills the left region; Left Hand, Right Hand and Drop are fixed below it.
  • Worn: Head, Eyewear, Hands, Backpack, Torso, Body Armor, Vest, Legs and Feet remain fully visible above the right-side container list as fixed 88×88 squares. Worn does not share the container scroll.
  • Containers: one panel per authoritative player storage container. Player and loot cells are the same 88×88 squares. Only this region scrolls. Each panel header exposes used/capacity and its own Sort action; empty equipment may remove a storage panel but never removes its Worn target.
  • Quick Slots: exactly one fixed Q1–Q0 row spans the bottom. Q1–Q2 exclusively represent Back Weapon 1–2; Q3–Q0 are use-quick references. There is no duplicate Back Weapon panel.
  • Actions and state: one footer hosts device-dependent action hints, including Drag, RMB menu, Ctrl+RMB Equip, Ctrl+LMB Transfer and Tab close. Focus/selection uses the Night Ops cyan accent plus a corner/shape indicator so meaning is not color-only. Visual state changes must not resize the slot.
  • Transfer mode: corpse, death bag, crate and storage replace the character preview area with Player Inventory / Target Inventory side-by-side. Player container headers expose Transfer All; the target header exposes Take All. Q1–Q0 and action hints remain in their normal positions.

Implementation sequence — UI-CORE-003

  1. Widget/binding audit: inspect WBP_Inventory, WBP_InventoryContainer and WBP_InventorySlot through Unreal MCP before editing. Preserve the existing parent classes and C++ BindWidget names: CharacterPreview, Slot_HeldRight, Slot_HeldLeft, Slot_Drop, Box_UseQuickSlots, Scroll_Containers, optional Box_WornSlots, Text_Weight and Button_Close. Edit_Search was removed 2026-09-14.
  2. Reusable presentation pieces: apply the resource-less shell/panel/slot/button/input/scrollbar brushes and single Night Ops focus mask defined in the current theme contract. Keep text, quantities, item icons and focus markers as live UMG layers. Do not use the full-screen concept PNG as the runtime background.
  3. Normal inventory hierarchy: rebuild WBP_Inventory as Safe Zone → header → 36/64 main split → fixed Q1–Q0 row → action footer. Bind the existing nine Worn slots above Scroll_Containers; keep only the container list scrollable. The optional character capture may retain a placeholder until its capture actor is authored.
  4. Container panels: update WBP_InventoryContainer so title, used/capacity and per-container Sort remain visible while its slot grid is rebuilt. Preserve C++ generation and server-authoritative container capacity; do not infer slots from the concept image.
  5. Transfer screen: create proposed /Game/Lambeer/UI/Inventory/WBP_ContainerTransfer only after confirming the required parent/factory path through Unreal MCP. Reuse the existing LinkedTransferInventory seam and existing Take All / Transfer All commands; the widget must not own or duplicate either inventory.
  6. Context and split presentation: replace the temporary C++ split-amount window only when an activatable modal can expose Split 1, Split half and validated typed amount without changing ExpectedItemId semantics. Context, Sort, Use, Equip, Drop, magazine actions and failure reasons remain projections of existing C++ commands. Search is excluded.
  7. Input/focus: define deterministic visual and CommonUI navigation order Worn → Containers → Hands/Drop → Quick Slots, with explicit escape routes to Header/Close. Drag-and-drop must have click/context and keyboard/controller equivalents; changing input method must preserve the same semantic focus.
  8. Responsive/localization pass: validate English and Thai at supported Text Scale, HUD/UI Scale and Safe Zone settings. Do not bake labels into PNG textures. Long labels may wrap or use a verified tooltip, but may not clip silently.
  9. Editor verification: compile and save every changed Widget Blueprint through Unreal MCP when its tools cover the required hierarchy/properties. If a required property cannot be authored through MCP, stop at that exact step and provide the owner with the manual procedure; do not use computer-use.
  10. Owner PIE: the owner runs Dedicated Server + two client Preview windows and records the G4.2 matrix. The agent may inspect logs and saved assets but may not start or control PIE.
Editor reopen complete — 2026-09-13: Unreal MCP reparented WBP_ContainerTransfer to /Script/Lambeer.LambeerContainerTransferWidget, added designer Transfer_Target (collapsed until transfer mode; Scroll_Loot remains the collapsed fallback), and compiled/saved WBP_Inventory, WBP_InventorySlot, WBP_InventoryContainer and WBP_ContainerTransfer. Chrome follow-through (same day, PIE stopped): designer Button_Slot is NoDrawType so Image_Frame 9-slice is visible; Worn labels are 10 pt wrapped FF_UI_Primary; CharacterPreview uses T_UI_Inventory_Panel_9Slice. Remaining close work is owner KBM PIE after a closed-Editor C++ rebuild if Live Coding still serves an old inventory DLL. Character capture remains a placeholder panel.

Owner PIE checklist — Dedicated Server + two client Preview windows

User-only. Do not mark any item passed from agent actions. Type in a client Preview window (NetMode: Client). Owner PIE 2026-09-13 first showed <MISSING STRING TABLE ENTRY> on inventory chrome while Close already resolved from Navigation.Close. Root cause: StringTableTools.set_entry did not mark packages dirty. Follow-through: 28 Inventory.* keys are saved in ST_UI_Common_EN/TH (force-dirty + save). A later owner capture showed those labels, HUD mostly hidden, and the 36/64 split, but still not the approved concept: default gray RoundedBox UButton chrome covering Image_Frame 9-slice; Worn labels at designer 24 pt Bold without wrap (EYEWEARHANDSPACK); CharacterPreview a NoImage fill that matched the dimmer. Designer follow-through (PIE stopped): Button_Slot NoDrawType, 10 pt wrapped FF_UI_Primary, panel 9-slice on CharacterPreview, slot 9-slice on Close/Sort, widgets compiled/saved. C++ ApplySplitSizing and SynchronizeProperties still need a closed-Editor LambeerEditor Win64 Development rebuild if Live Coding left an old DLL. Empty space under a short container list is expected (only that region fills/scrolls). The concept PNG is not a runtime background. Character capture remains a placeholder panel, not a MetaHuman render.
  1. Tab opens inventory: Safe Zone header shows title, weight and Close with no Search field; Character 36% / Inventory 64%; Hands/Drop under the preview; nine Worn slots fully visible above the container list; only container panels scroll; one Q1–Q0 row; no duplicate Back Weapon panel.
  2. Every non-empty player/target stack remains visible; no client-side Search filter exists.
  3. Per-container Sort still sorts that container; merge/split/drop/use/equip still use ExpectedItemId. Split uses the in-widget overlay (Split confirm/cancel); Escape closes the overlay first.
  4. Focus/selection shows cyan plus the corner overlay, not color alone. Hover/focus does not resize slots.
  5. English and Thai labels remain live text (not baked into PNG). Long labels wrap or remain readable.
  6. Interact a crate/storage/corpse: character preview hides; Player | Target side-by-side; Take All on the target; Transfer All only on player containers that may deposit.
  7. Death bag: loot on the target side; Take All works; depositing / Transfer All into the death bag stays blocked.
  8. Opening inventory in this dedicated-server PIE does not pause the world. Xbox/PlayStation remain deferred.

Exit criteria

  • WBP_Inventory, child widgets and WBP_ContainerTransfer compile/save with every required BindWidget resolved and no duplicate Back Weapon UI.
  • All nine Worn targets, Hands, Drop, Weight, Close, one Q1–Q0 row and action hints remain readable at FHD, 2K, 4K, 16:10, 21:9 and 32:9 without overlap or clipping; only the container list scrolls.
  • Normal inventory and side-by-side transfer mode expose the same authoritative merge/split/drop/sort/use/equip/take/transfer commands through drag, click/context and keyboard paths; Inventory Search is absent.
  • Take All fills eligible player containers; Transfer All acts on one selected player container; stale indices continue to reject through ExpectedItemId; opening the screen in multiplayer never pauses the world.
  • Selection/focus/denied/drop-target states remain distinguishable without color alone, and switching English/Thai or scaling text does not hide required actions.
  • Owner-reported KBM PIE evidence is required to close the implemented slice. Physical Xbox/PlayStation checks remain deferred/unverified until hardware is available and are not recorded as pass or failure.

Gate G4.3 HUD UMG Artwork & Presentation Pass

Gate state: COMPLETE — owner-reported full PIE acceptance 2026-09-14. The owner previously passed checklist 3 Prompt/Status, 4 Minimap, 5 Reticles, 6 Screen Effects and 7 Multiplayer, then confirmed the revision-3 checklist passed in full, including 1 overall presentation, 2 Hands/Quick Slots presentation and 8 responsive English/Thai layout. Revision 3 enforces fixed equal-size hand cards, square Quick Slots, four equal Stat segments with exact current values, a themed weight node and a shorter/tighter compass based on the owner's annotated runtime screenshots. UI-HUD-018 and G4.3 are closed.

Night Ops HUD redesign — Option A / Stats V2 approved and implemented

All three concepts keep the confirmed HUD information contract and use Inventory_UI_NEW.png only as the palette, surface, border, typography and cyan-state reference. Option A / Stats V2 is the owner-approved implementation reference. Options B and C remain reference-only. Images are layout/presentation concepts, not screenshots or approved gameplay data. Exact prompts, provenance, selection and implementation state are recorded in generation.json.

Owner-selected Option A Peripheral Grid Night Ops HUD with eight segmented survival gauges at lower left, quick slots at lower center and hand cards at lower right

Option A — Peripheral Grid / Stats V2

Owner-approved and implemented. Maximum open view. Eight Stats use the compact 2×4 live icon-node system with four equal shaped segments, threshold ticks, angular current-level markers, exact current values and restrained semantic fills. Q1–Q0 are square; single-hand, empty-hand and both-hands cards share one fixed size.

Option B Lower Command Rail Night Ops HUD retained as an unselected reference

Option B — Lower Command Rail

Unselected reference. All persistent controls form one low-profile bottom rail while compass, minimap and statuses stay above.

Option C Split Wings Night Ops HUD retained as an unselected reference

Option C — Split Wings

Unselected reference. Stats and slots form opposing lower wings with a deliberate center opening.

Acceptance result — owner-reported pass 2026-09-14: Option A / Stats V2 is the approved and accepted direction, with RawResource/ConceptReference/HUD_UI.png, the selected concept image and the owner's annotated runtime screenshots serving as the revision-3 visual targets. The owner confirmed the full G4.3 PIE checklist passed. Concept item art, quantities, status examples and background remain illustrative; runtime item/state data continues to come from the existing snapshot and item definitions.

Night Ops source-to-Unreal register

Source PNGSource sizeProposed Unreal targetWidget / Brush role
ui_hud_night_ops_focus_corners.png1254×1254 RGBA/Game/Lambeer/UI/HUD/Textures/NightOps/T_UI_HUD_NightOps_FocusReused G4.2 neutral mask for HipRelaxed, smaller ShoulderAim and cyan Interaction corners; Interaction adds a live Slate diamond
ui_hud_night_ops_reticle_melee.png1254×1254 RGBA/Game/Lambeer/UI/HUD/Textures/NightOps/T_UI_HUD_NightOps_Reticle_MeleeFlat white alpha mask; melee brackets plus hollow center ring
ui_hud_night_ops_reticle_throw.png1254×1254 RGBA/Game/Lambeer/UI/HUD/Textures/NightOps/T_UI_HUD_NightOps_Reticle_ThrowFlat white alpha mask; segmented readiness arc plus hollow center ring, not trajectory prediction
ui_hud_night_ops_low_health_vignette.png1672×941 RGBA/Game/Lambeer/UI/HUD/Textures/NightOps/T_UI_HUD_NightOps_FX_LowHealthWBP_ScreenEffects; existing 30/20/10 opacity tiers
ui_hud_night_ops_blood_lens.png1672×941 RGBA/Game/Lambeer/UI/HUD/Textures/NightOps/T_UI_HUD_NightOps_FX_BloodLensWBP_ScreenEffects; existing 2-second hold / 5-second fade; legacy root overlay is collapsed to avoid double rendering
ui_hud_night_ops_wet_lens.png1672×941 RGBA/Game/Lambeer/UI/HUD/Textures/NightOps/T_UI_HUD_NightOps_FX_WetLensWBP_ScreenEffects; existing rain/swim source and 5-second fade

Import and Brush contract

  • All six textures: imported as Texture2D using UE 5.8's UI compression setting (TC_EditorIcon), TEXTUREGROUP_UI, NoMipmaps, Never Stream, Clamp X/Y, sRGB and preserved alpha.
  • Runtime texture caps: focus/melee/throw are 256; low-health/blood/wet are 2048. Source PNGs remain unresampled and alpha-capable.
  • Resource-less chrome: stat gauges, hand cards, quick slots, contextual status rows, prompt card and minimap ring use Night Ops Box/RoundedBox/Slate geometry with 0.94–0.97 blue-black fills, 1 px steel outlines and restrained cyan live emphasis. The stronger opacity prevents bright world color from washing the HUD green. No old olive/brass frame bitmap is imported.
  • Image overlays: reticles and full-screen effects use ordinary Image Brushes and remain Hit Test Invisible. The minimap ring is drawn above its north-up map image and below marker/heading projection.
  • Semantic state: health/stamina/etc. fills, quick-slot selection, denied state, focus and availability stay live UMG color/opacity/visibility layers. Do not duplicate PNGs just to bake state colors.
Revision-2 native and asset validation — 2026-09-14: Unreal MCP confirmed PIE false and closed the Editor normally; process readback confirmed Editor and Live Coding absent. LambeerEditor Win64 Development compiled and linked successfully. Headless non-PIE Lambeer.HUD automation passed 24/24 with zero warnings/failures. Evidence: Saved/Logs/G43ReferenceAlignmentPass2.log and Saved/Automation/G43ReferenceAlignmentPass2/index.json. After reopening UE 5.8, Unreal MCP compiled/saved WBP_HUDRoot (12 widgets), WBP_StatusBars (1), WBP_Hands (6), WBP_QuickSlots (1), WBP_Compass (3) and WBP_Minimap (3) with expected native parents. HUD-root readback confirms Stats 440×240 at 24/64 inset, Quick Slots 1040×130 at 56 bottom inset, Hands 300×260 at 32/60 inset, and Minimap 264×264 at 32/24 inset. This is not PIE acceptance.
Revision-3 native and asset validation — 2026-09-14: Unreal MCP confirmed PIE false before normal Editor close; process readback confirmed Editor and Live Coding absent. LambeerEditor Win64 Development compiled and linked successfully after one corrected incomplete-type include. Headless non-PIE Lambeer.HUD automation passed 24/24 with zero warnings/failures. Evidence: Saved/Logs/G43OwnerFeedbackPass3.log and Saved/Automation/G43OwnerFeedbackPass3/index.json. After reopening UE 5.8, Unreal MCP compiled, saved and read back WBP_HUDRoot, WBP_Hands, WBP_QuickSlots, WBP_StatusBars and WBP_Compass. HUD-root readback confirms Quick Slots 1020×102, Compass 720×48 and the themed Weight copy slot at 58 px left; Stats, Hands and Minimap retain their established root extents. This is not PIE acceptance.

Widget implementation contract

  • Status cluster: ULambeerStatusBarsWidget consumes eight snapshot values that preserve normalized, exact current and maximum values and caches the eight verified stat textures. Its resource-less custom paint draws the 2×4 icon nodes, four equal shaped segments, three threshold ticks, continuous angular markers and the exact current value at right. Filled-segment count, marker, icon, shape and number encode state without color-only meaning.
  • Hands / Quick Slots / Prompt / Status rows: empty and occupied single-hand cards and the both-hands card share a fixed 300×116 logical presentation, with 9 pt titles over larger item art while retaining localized detail, UNKNOWN ammunition knowledge and durability semantics. Q1–Q0 cards are 96×96 logical squares with compact 9 pt Q labels; Q1–Q2 retain physical Back Weapon behavior and are distinguished by a shaped top-edge notch, while active state uses the accepted cyan corner mask. BACK/in-hand detail remains in tooltips rather than crowding the visible key label. The prompt uses a bordered E keycap plus separate action/detail copy while quantity/denied/hold data remains unchanged.
  • Reticle: map HipRelaxed, Melee, Throw and Interaction to the four PNGs. ShoulderAim reuses HipRelaxed with a narrower live presentation. ADS collapses the reticle entirely. Do not create a HitMarker path.
  • Compass / Minimap: the compass paints compact cardinal/intercardinal labels, ticks, baseline and cyan center caret instead of the oversized heading readout. Facing N, W is screen-left and E is screen-right; looking right from N centers E. WorldYawToHudYaw maps Unreal look-right onto HUD east for the tape, compass markers and north-up heading chevrons. Minimap/full-map X follow HUD east (Unreal −X) so symbols rotate with the camera. Preserve the north-up temporary map, 8 px player pip, 50 m clamp and authority; this owner correction changes only E/W screen mapping.
  • Screen effects: preserve existing low-health 30/20/10 behavior, blood 2-second hold plus 5-second fade, wet-lens 5-second fade and Sleeping dim alpha 0.22. Keep the center readable and retain reticle/prompt visibility ordering. Blood remains non-directional.
  • Responsive layout: respect HUD Scale, Safe Zone and Text Scale. Edge HUD follows physical viewport edges on ultrawide; reticle and prompt stay centered. PNG artwork must not be used as a fixed full-screen coordinate layout.

Implementation sequence — UI-HUD-018

  1. Use Unreal MCP to inspect the current WBP_HUDRoot, WBP_StatusBars, WBP_Hands, WBP_QuickSlots, WBP_Reticle, WBP_Minimap, WBP_ContextStatusList and WBP_ScreenEffects hierarchy, parent classes and BindWidget names before editing.
  2. Done 2026-09-14: inspect the eight HUD Widget Blueprints through Unreal MCP with PIE stopped.
  3. Done 2026-09-14: import the six Night Ops PNG sources into /Game/Lambeer/UI/HUD/Textures/NightOps/, apply/read back the import contract and record caps.
  4. Done 2026-09-14: implement the owner-approved Option A anchors and Stats V2 live paint. The status designer keeps only its root canvas; no fixed full-screen concept image, baked values or duplicated state textures are used.
  5. Done 2026-09-14: apply frame/card/quick-slot/minimap presentation without changing data providers, replicated state, command routing or marker projection.
  6. Done 2026-09-14: map the reticle sources to the existing state machine; ShoulderAim reuses the focus mask at a narrower live size, ADS collapses, Interaction adds a live diamond and no hit-confirmation state exists.
  7. Done 2026-09-14: replace procedural/placeholder screen-effect art with the three overlays while keeping the existing timers, thresholds, Sleeping dim and respawn reset behavior.
  8. Non-PIE scope done 2026-09-14: Unreal MCP readback verifies physical-edge anchors and fixed panel extents without changing center anchors. MCP does not provide an authoritative rendered FHD/2K/4K, 16:10/21:9/32:9 and English/Thai matrix, so the visible responsive/language result remains owner checklist 8.
  9. Done 2026-09-14: with Editor/Live Coding closed, final LambeerEditor Win64 Development passed and headless non-PIE Lambeer.HUD automation passed 24/24. After reopening, Unreal MCP compiled/saved/read back the four Option A-affected Widget Blueprints against the rebuilt DLL; all packages are clean.
  10. Revision 2 built 2026-09-14: after owner visual rejection of the first runtime screenshot, align scale, insets, opacity and hierarchy directly to HUD_UI.png; fix the white Stats render path; rebuild compass/minimap/prompt/hands/slots presentation. Editor build and HUD automation 24/24 pass; Unreal MCP compiles/saves the six affected Widget Blueprints. Owner PIE acceptance remains pending.
  11. Revision 3 built and owner-accepted 2026-09-14: apply the owner's annotated runtime corrections: equal fixed-size hand cards, smaller titles, square Quick Slots, four equal Stat segments with exact current values, themed weight icon-node and compact compass spacing. Editor build and HUD automation 24/24 pass; Unreal MCP compiles/saves/reads back the five affected Widget Blueprints. The owner reported the complete G4.3 PIE matrix passed.
  12. Owner PIE done 2026-09-14: the owner ran the required G4.3 matrix and reported all checks passed. The agent did not start or control PIE.
  13. Owner correction 2026-09-14 — compass/map E/W: after the G4.3 close, the owner reported the tape mirrored E/W, then that looking right toward E showed W on both the tape and map/minimap symbols. WorldYawToHudYaw maps Unreal look-right onto HUD east; minimap disc X, full-map UV X and the north-up island image follow that convention. This does not reopen G4.3. Closed-Editor LambeerEditor Win64 Development compiled and linked; headless non-PIE Lambeer.HUD passed 24/24 (0 failed / 0 not run). Evidence: Saved/Logs/CompassEWFix.log and Saved/Automation/CompassEWFix/index.json. Owner PIE remains pending.

Exit criteria

  • The implemented, owner-approved Option A / Stats V2 HUD passes deferred owner PIE checklist 1, 2 and 8; Options B and C remain reference-only.
  • All six Night Ops Texture2D assets exist at the documented targets with alpha and UI import settings verified; resource-less chrome and final runtime caps are recorded.
  • All changed HUD Widget Blueprints compile/save with their existing BindWidget contract intact and no C++ gameplay or authority regression.
  • Owner PIE confirms eight live segmented gauges, hand/quick-slot state, prompt quantity/denied, north-up minimap/markers and reticle states; ADS stays hidden and no HitMarker appears.
  • Owner PIE confirms low-health 30/20/10 edges, nearby non-directional blood, rain/swim wet lens, Sleeping dim and respawn clearing still follow the G3/G4 timings and lifecycle.
  • At supported aspect ratios and scales, edge art does not clip required content, center effects do not obscure prompt/reticle readability, Thai/English text is not baked or clipped, and multiplayer remains unpaused.
  • Satisfied 2026-09-14: G4.3 is closed from the owner's full checklist pass. G4.4 subsequently passed and closed. Xbox/PlayStation physical verification remains deferred until hardware is available and is not included in either closure claim.

Gate G4.4 Pause & Settings Night Ops Presentation

Gate state: COMPLETE — owner-reported full PIE acceptance 2026-09-14. The owner selected Option B — Tactical Side Rail, corrected its language selector and Pause copy, then reported the complete G4.4 checklist passed. Native implementation, LambeerEditor Win64 Development, headless non-PIE Lambeer.HUD automation 24/24 and both Widget Blueprint validations also pass. UI-MENU-001 and G4.4 are closed.

Menu concept decision

The three concept boards preserve the completed UI-CORE-007/UI-CORE-008 behavior. Option B is the implementation reference; A and C remain unselected references. Generated examples, provenance and prompt constraints are recorded in generation.json.

Unselected centered command panel concept for Pause and Settings

Option A — Centered Command

Unselected reference. A centered modal composition with balanced symmetry.

Owner-selected tactical side rail concept for Pause and Settings

Option B — Tactical Side Rail

Owner-selected and implemented. Pause uses a narrow left command rail; Settings expands the same rail into a wide operator workbench.

Unselected minimal operator overlay concept for Pause and Settings

Option C — Minimal Overlay

Unselected reference. Sparse overlay chrome that keeps more of the world visible.

Implementation contract — UI-MENU-001

  • Pause: a 340×820 logical left rail uses the Night Ops blue-black surface stack, steel-blue outline, cool-white hierarchy and cyan interaction state. Standalone still pauses the world and multiplayer still leaves the world running, but the owner-directed current presentation does not display the former world-continues warning.
  • Settings: a centered 1480×820 logical workbench uses a 300 px category rail, broad content area, framed setting rows, selected-category cyan state, bottom Apply/Revert/Back strip and a matching display-confirm modal. The language selector displays white self-language names English and ภาษาไทย; persisted culture IDs remain en/th.
  • Runtime strategy: scalable resource-less RoundedBox geometry and the shared Google Sans/Night Ops style are used; no concept screenshot is baked into the runtime and no new texture import is required.
  • Scope boundary: preserve UI-CORE-007/UI-CORE-008, keep Text Scale locked at 1.0, keep unsupported categories unavailable, and do not add Exit-to-main or any G5 feature.
Owner-feedback revision non-PIE validation — 2026-09-14: Unreal MCP confirmed PIE false before a normal Editor close. LambeerEditor Win64 Development rebuilt and linked successfully. Headless Lambeer.HUD passed 24/24 with 0 failed and 0 not run, including display-name/culture mapping assertions; report: Saved/Automation/G44MenuFeedbackLanguageWarning/index.json. After reopening UE 5.8, Unreal MCP compiled, saved and read back WBP_PauseMenu and WBP_Settings; both retain their expected native parents, empty designer trees and clean saved state. Their authoritative runtime layouts remain the native EnsureLayout implementations. This is not PIE acceptance.

Owner-only PIE acceptance — passed 2026-09-14

  1. In Dedicated Server + two client Preview windows, open Pause and confirm the left tactical rail, no world-continues warning text, local input blocking, other client/server continuity, Resume, Escape and Back behavior.
  2. In Standalone, open Pause and confirm PAUSED/session presentation, real world pause and resume.
  3. Open Settings and confirm HUD/Display content, category selection styling, unavailable categories, HUD Scale, Safe Zone, white English/ภาษาไทย language options, Apply/Revert/Back and the display-confirm modal.
  4. Verify English and Thai at supported FHD/2K/4K and 16:10/21:9/32:9 layouts: no clipped required copy, overlap, focus trap or off-safe-zone action.
  5. Confirm Inventory/Map/Death stacking and Back priority still behave exactly as the closed G4 contracts specify.
Exit satisfied — owner-reported pass 2026-09-14: all five G4.4 owner-only PIE checks passed. The strict order G4 → G4.2 → G4.3 → G4.4 is closed; G5 is now the next eligible UI gate, but has not been started by this acceptance update.

Gate G5 Frontend & Session Flow

Gate state: PARTIAL — Single Player owner pass 2026-09-16; dedicated follow-camera, Pause/Exit/restore and Server Browser Refresh/Join owner pass 2026-09-16; Steam/Feedback/production-map still blocked. Dedicated and listen persistable worlds advertise an OnlineSubsystemNull LAN session. One-process PIE cannot discover that host through LAN FindSessions because Null OSS uses a single beacon; Server Browser lists in-process dedicated/listen worlds by listen port and joins them with ClientTravel. Pause Exit to Main Menu is visible on dedicated clients; Save stays standalone-only. Server Logout still flushes the leaving player. Join travel appends the durable LambeerPlayerKey. Development Server Browser defaults to the Community tab because unmarked Null/LAN dedicated sessions are Community unless -LambeerOfficial is set. Owner reported first-time Character Creation on an extra dedicated client restores the gameplay follow camera behind the pawn, then Refresh/Join from the returned client. Steam metadata, Feedback URL and the packaged production gameplay destination remain blocked on TBD-HUD-UI-004/UI-FE-008. No agent PIE claim is made.
Save Worlds / Server Browser reference refresh — built 2026-09-16; owner PIE visual acceptance pending. ULambeerSaveWorldScreen now builds the owner-supplied sidebar/card/action-rail composition from RawResource/ConceptReference/P08_UI_Save_world.png. ULambeerServerBrowserScreen now builds the matching sidebar/search/refresh/table-row composition from P08_UI_Server_browser.png, including row-level Favorite and Join actions. ULambeerFrontendRowButton carries opaque world/server IDs through parameterless UButton clicks; presentation never parses those IDs. Existing create/rename/two-step delete/open, refresh/cancel/search/filter/favorite/join and error-state routes are retained. Closed-Editor LambeerEditor Win64 Development passed; focused Lambeer.Frontend automation passed 4/4; Unreal MCP compiled/saved/read back both Widget Blueprint children with expected native parents and no dirty packages. This is non-PIE evidence only.

Owner-only dedicated join / disconnect / rejoin

UE 5.8 Play menu: there is no Net Mode labeled Dedicated Server. Play As Client is that topology: the editor starts a dedicated server behind the scenes and connects the requested client windows. With the default one-process PIE that dedicated instance is hidden; window titles are Client 1 / Client 2. Do not use Play Standalone for this checklist, and do not use Play As Listen Server (the first window would be the host). Number of Players 2 on L_Dev_Sandbox. After Exit to Main Menu, do not stop PIE. Open Server Browser from that returned client (Community tab) while the hidden dedicated world and the other client keep running. Expected row name is the open world id, usually default. Output Log should contain P08 in-process host on Refresh; P08 advertised session start GameSession (ok) is still expected when the dedicated world begins play.
  1. After the closed-Editor native rebuild, open this project in UE 5.8. Play: Net Mode Play As Client, Number of Players 2, map L_Dev_Sandbox. Type in a client Preview window. The dedicated world is started automatically and is hidden under one-process PIE.
  2. Confirm Output Log contains P08 advertised session or P08 advertised session start GameSession (ok) on the dedicated server. The dedicated world and the other client must keep running for the rest of this checklist.
  3. Owner-reported pass 2026-09-16: On a client with no saved character, finish Character Creation and starter-town selection. The follow camera sits behind the pawn, not inside the mesh. A new extra client such as pie-3 is the required first-time-creation check; returning clients that skip creation do not cover this.
  4. Owner-reported pass 2026-09-16: On client 1, finish Character Creation if this window has no character, then move. Open Pause: title is MENU / ONLINE SESSION; SAVE is hidden; EXIT TO MAIN MENU is visible. The dedicated world and client 2 keep running.
  5. Owner-reported pass 2026-09-16: Choose EXIT TO MAIN MENU. Client 1 returns to Main Menu. The dedicated server stays up. Client 2 remains in the world and can still move.
  6. Owner-reported pass 2026-09-16: On client 1 Main Menu, open Server Browser. Keep the Community tab (default). Refresh. A Community dedicated row appears. Join it. An empty list would still be a listing/join bug, not a missing Net Mode option.
  7. Owner-reported restore pass 2026-09-16, including after Server Browser Join: returning to the same dedicated world restores the same character/position/inventory instead of opening a replacement Character Creation.
  8. Optional failure checks: Cancel during Refresh; Join while the list is stale after a long wait should show an explicit reason. Steam discovery is out of this checklist.

Optional session name/type for local dedicated: -LambeerServerName="Bangkok Test", -LambeerOfficial, -LambeerFriendlyFire=1. Unmarked dedicated sessions stay Community and omit friendly-fire metadata rather than inventing a value.

Target Architecture [CONFIRMED 2026-09-06]

Owner approved. The Hybrid CommonUI + UMG architecture, one root per local player, four-layer ownership model, compatibility-facade migration, and SP/MP input-state policy below are frozen for G1 implementation.

Authoritative gameplay stateLocal presentation adaptersUI snapshots/delegatesUMG/CommonUI widgets
ULambeerUIManagerSubsystem : ULocalPlayerSubsystem
└─ WBP_UIRoot : ULambeerUIRootWidget / UCommonUserWidget
   ├─ Layer_GameHUD : Overlay                         // passive UMG
   │  ├─ WBP_HUDRoot : ULambeerHUDWidget
   │  ├─ WBP_ContextStatusList
   │  ├─ WBP_NotificationFeed
   │  └─ WBP_InteractionPromptHost
   ├─ Layer_Screens : UCommonActivatableWidgetStack  // one primary screen
   ├─ Layer_Modals  : UCommonActivatableWidgetStack  // context/split/errors
   └─ Layer_Toast   : WBP_ToastQueue                 // non-blocking notices

Gameplay components replicate canonical state.
UI manager owns only local presentation, activation, focus, safe-zone and device state.
Every server mutation is requested through the owning gameplay component/service and re-rendered from accepted state.

C++ ownership rules

  • ULambeerUIManagerSubsystem is the only layer/router owner per local player.
  • ULambeerActivatableWidget centralizes CommonUI input config, back behavior, initial focus and restoration.
  • Passive widgets remain UUserWidget; screens/modals derive from CommonUI activatable bases.
  • Presentation structs are local read models, not new replicated gameplay databases.
  • Widgets subscribe in construct/activate and unsubscribe in destruct/deactivate; no gameplay polling on Tick unless a specific visual interpolation needs it.
  • Blueprint owns layout/style and calls exposed C++ commands; authoritative logic remains in C++.

Input-state policy

LayerInputCursor/focusWorld
HUD onlyGameNo cursor; viewport focusRuns
Primary screen in MPMenuCursor for KBM; deterministic CommonUI focus for controllerRuns; movement/action contexts blocked
Pause screen in SPMenuSame navigation contractPaused by session authority
ModalMenuFocus trapped inside top modal; Back closes modal firstInherits underlying SP/MP rule
RadialAllStick/mouse selection; cancel restores game focusRuns

Target Files, Assets & Migration Map

Paths marked Proposed do not exist yet. Existing Blueprint assets must be edited by the user.

Source/Lambeer/UI/
├─ Common/                                      [Proposed]
│  ├─ LambeerUIManagerSubsystem.h/.cpp
│  ├─ LambeerUIRootWidget.h/.cpp
│  ├─ LambeerActivatableWidget.h/.cpp
│  ├─ LambeerUIActionTypes.h
│  └─ LambeerUITypes.h
├─ HUD/                                         [Proposed organization]
│  ├─ LambeerHUDWidget.*                        [move only in planned migration]
│  ├─ LambeerStatusBarsWidget.*
│  ├─ LambeerCompassWidget.*
│  ├─ LambeerInteractionPromptWidget.*
│  └─ LambeerScreenEffectsWidget.*
├─ Screens/                                     [Proposed]
│  ├─ LambeerInventoryWidget.*                  [G4 UI-CORE-001/002 owner pass 2026-09-12; G4.2 Night Ops visual pass 2026-09-14, interaction acceptance pending]
│  ├─ LambeerMapScreen.* / LambeerMapSubsystem.* / LambeerMapPresentation.*  [G4 UI-CORE-004 owner pass 2026-09-13 including zoom clip; frozen 50 m fallback while open; north-up minimap; owner north-up/frozen-death pass 2026-09-12]
│  ├─ LambeerDeathScreen.* / LambeerDeathSubsystem.*  [G4 UI-CORE-005 owner pass 2026-09-13; UI-CORE-006 owner pass 2026-09-13 Last Bed / four-town Fresh Spawn; also LambeerDeathBag.*, LambeerSpawnRegion.*, LambeerDeathTypes/Rules; owner nested-dump / loot-panel / HUD-refresh pass 2026-09-12; four sandbox spawn regions on L_Dev_Sandbox]
│  ├─ LambeerSpawnScreen.*
│  ├─ LambeerCraftingScreen.* / LambeerWorkbenchScreen.*
│  ├─ LambeerPauseScreen.* / LambeerPauseSubsystem.* / LambeerPauseRules.h  [G4 UI-CORE-007 behavior pass; G4.4 Night Ops Option B owner-accepted]
│  ├─ LambeerSettingsScreen.* / LambeerSettingsSubsystem.* / LambeerUserSettings.* / LambeerSettingsRules.h  [G4 UI-CORE-008 behavior pass; G4.4 Night Ops Option B owner-accepted; Text Scale locked 1.0]
│  └─ LambeerServerBrowserScreen.* / LambeerGroupScreen.*
└─ Legacy/                                      [optional transitional namespace, no asset move]

Content/Lambeer/UI/
├─ Common/Styles/  DA_UITheme, CommonButton/Text styles        [Proposed]
├─ Common/Icons/   T_UI_* imported from RawResource/UI/Icons/  [Proposed]
├─ Common/Input/   CommonInput controller data + action data    [Proposed]
├─ HUD/            WBP_UIRoot, WBP_HUDRoot, HUD child widgets; Textures/T_UI_HUD_* [G4.3 Night Ops revision 3 integrated and owner-accepted]
├─ Menus/          WBP_PauseMenu + WBP_Settings [G4 behavior pass; G4.4 Night Ops Option B owner-accepted]; Main/Save/Server/Character/Spawn remain later gates
├─ Inventory/      existing assets + context/transfer screens   [Mixed]
├─ Map/            WBP_WorldMap, T_WorldMap_Temporary (1024×576 temp image), WBP_DeathRespawn [G4 UI-CORE-004 2026-09-12; UI-CORE-006 WBP_DeathRespawn 2026-09-12]
├─ Crafting/, Building/, Weapons/, Social/, Settings/           [Proposed]
└─ ControllerGlyphs/                                             [Verified existing; preserve]

Config: Lambeer.uproject, Lambeer.Build.cs, DefaultEngine.ini, DefaultGame.ini
Input: Content/Lambeer/Core/Input/Actions/ and IMC_Default
Safe migration: do not rename/delete WBP_HUD, WBP_Inventory or legacy subsystems until the new root loads, screen activation works, asset references are redirected, cook succeeds, and the user records the matching PIE gate as passed.

Data Model, Interfaces & Events

ชื่อด้านล่างเป็น target contract จาก feature spec; implementation must first search for an existing gameplay-owned equivalent and reuse it where semantics match.

ContractProducer / authorityConsumerImplementation rule
FUIHUDSnapshotLocal adapter reading GAS/inventory/aimHUD rootNormalized values + availability flags; no replicated duplicate.
FUIWeaponHandStateHeld/combat components + client knowledge maskHand cardsObserved chamber/mag data is separate from hidden server truth and invalidated on unknowable changes.
FInteractionPromptStateUInteractionComponentPrompt widgetActor/target ID, action, label, quantity, hold, denied reason, alternatives; server still validates execution.
FUIMapMarkerMarker service; server for shared, local for filter stateCompass/minimap/map/spawnStable MarkerId, category, world position, visibility scope, source entity, expiry.
FCraftingQueueEntryPlayer/station crafting authorityCrafting screen/queuePersistent server record with reserved inputs and recovery state.
FMagazineLoadPlanWeapon/magazine authorityPlanner modalServer validates ammo compatibility/capacity; pure function builds preview fire order.
FWorldSaveSummaryLocal save index serviceSave select/Main ContinueSummary only; corrupt/incompatible state is explicit.
FServerBrowserEntryOnline session/backend adapterServer browserSession IDs remain opaque; favorite is local/user preference.
FUIAchievementEntryPer-character/server progression authorityAchievement screen/toastCatalog/reward payload blocked by TBD-E2F4910C.
FGroupActivityLogEntryServer group registryGroup screenActor/action/target/event type; retention blocked by TBD-HUD-UI-007.

Required event surface

OnHUDSnapshotChanged(const FUIHUDSnapshot&)
OnInteractionPromptChanged(const FInteractionPromptState&)
OnObservedWeaponInfoChanged(ELambeerHeldHand, const FUIWeaponHandState&)
OnMapMarkersChanged(const TArray<FUIMapMarker>&)
OnCraftQueueChanged(FGuid QueueId)
OnAchievementUnlocked(FName AchievementId, const FRewardPayload&)
OnGroupActivityLogged(const FGroupActivityLogEntry&)
OnInputMethodChanged(ECommonInputType, FName GamepadName)

Error contract

  • Every asynchronous screen has Loading, Ready, Empty, Error and Stale/Retry states where applicable.
  • Rejected server action returns a localizable reason code; widgets do not parse arbitrary server strings.
  • Missing optional backend displays unavailable state and logs once; it must not crash or fabricate data.
  • Top modal receives errors that block the current operation; non-blocking results use toast.

Roadmap dependency split — owner confirmed 2026-09-13

PIPE-ROADMAP P00–P31 is the cross-system production schedule. Preserve the strict sequence G4 → G4.2 → G4.3 → G4.4 → G5. G4.4 was added after the owner selected the Pause/Settings Option B presentation on 2026-09-14; its early implementation does not bypass G4.3 acceptance. After G5, G6 and G7 are scheduled per system/backend dependency; squad and boss cooperation can be delivered before Skills/Vehicles. This supersedes an interpretation that every G6 task must close before any G7 task starts.

G6 weapon work maps to P11, crafting to P15, building to P16, boss to P18, progression to P21 and vehicle to P23. G7 squad/chat/voice maps to P19; remaining clan administration/territory scope maps to P22. UI-SOC-001/002 retain their IDs and full scope: a squad-only increment is partial until the clan work is accepted. G6/G7 aggregate completion still requires every task’s evidence; a backend-blocked shell is not an implemented gameplay system. G8 final acceptance follows aggregate closure.

Task statuses below remain authoritative for their recorded evidence. The roadmap separately reports concurrent source changes as unverified implementation, never as a PIE or gate pass.

Ordered Milestone Gates

ไม่มี calendar dates ตาม roadmap หลัก แต่ละ gate ต้องผ่าน exit criteria ก่อนเปิดงานที่พึ่งพา gate ถัดไป งาน screen ที่ไม่พึ่ง backend สามารถทำ visual shell ล่วงหน้าได้โดยแสดง unavailable/preview state เท่านั้น

G0

Decision & Baseline Lock PASS 2026-09-06

เก็บ evidence, approve visual direction, ระบุ TBD blockers และ freeze migration targets.

Exit complete: asset backup/redirect strategy และ acceptance matrix reviewed; known Quick Slot drag gap routed to G3.
G1

CommonUI Foundation PASS 2026-09-07

Plugin/modules, viewport client, C++ root/layers, activatable base, routing, legacy CommonUI Accept/Back input data, Editor/Game compile, Windows cook and all three G1 Widget Blueprints are implemented. Unreal MCP verified the saved assets and the owner confirmed the complete requested PIE matrix, including modal-first Back behavior.

Exit: satisfied; proceed to G2.
G2

Shared Design System PASS 2026-09-08

Theme, typography, buttons, icons, fonts and localization are implemented. Owner confirmed 5.2 glyphs, HUDScale, SafeZoneScale, TextScale and Thai Gallery culture switching.

Exit: satisfied for KBM/design-system; Xbox/PlayStation hardware checks remain deferred/unverified. Proceed to G3.
G3

Gameplay HUD Slice PASS 2026-09-10

8-stat layout, reticle, hands, quick slots, compass/minimap, prompt and screen effects. Owner reported HUD close checklist 1–8. Rain presentation is HUD droplets + UI_G3SetRain.

Exit: satisfied for the G3 HUD slice. HOLD text waits for a real hold action. Xbox/PlayStation remain deferred. G3.2 skeletal L1810 and magazine-as-item later passed on 2026-09-11; wet-look remains deferred.
G3.2

HUD Visual Follow-through PASS 2026-09-11

Owner reported skeletal L1810 world/held/back visuals and magazine load/install/remove. Wet-look remains deferred until materials expose WetAmount. Rain VFX stays out. Does not reopen G3.

Exit: satisfied for UI-HUD-015 and UI-HUD-016. UI-HUD-017 stays deferred.
G4

Core Survival Screens PASS 2026-09-13

Inventory command/lifecycle foundation, world map, death/spawn, pause and settings. Owner reported UI-CORE-001 and UI-CORE-002 passed 2026-09-12 (Tab toggle, Worn slots, clothing pickups; commands already passed 2026-09-11). Owner-approved Inventory presentation moved under preserved UI-CORE-003 to G4.2. Owner reported UI-CORE-004 passed 2026-09-13 including the zoom-clip retest. Owner reported UI-CORE-005 passed 2026-09-13. Owner reported UI-CORE-006 Last Bed and four-town Fresh Spawn passed 2026-09-13. Owner reported UI-CORE-007 dedicated-server pause 2026-09-12 and standalone PAUSED 2026-09-13. Owner reported UI-CORE-008 passed 2026-09-13 (Thai settings labels, Display Revert, HUD Scale/Safe Zone, no Text Scale control). Xbox/PlayStation remain deferred.

Exit: satisfied for G4; continue G4.2. Do not start G4.3 or G5 yet.
G4.2

Inventory Presentation & Container Transfer COMPLETE 2026-09-14

Night Ops designer chrome and its single focus-mask texture are saved; the former Rescue texture pack was removed after referencer checks. Source corrections preserve the existing layout, Q1/Q2 and hand/back routes. The owner passed the final presentation plus drag, split, sort, drop, hand/Q1/Q2 and Player/Target transfer. Search failed and was removed by explicit owner decision. Development Game/Editor builds, the field-free Widget Blueprint compile/save/readback and focused non-PIE automation 3/3 passed. The owner then confirmed the Search-free header and retained layout passed.

Exit: closed; proceed to G4.3.
G4.3

HUD UMG Artwork & Presentation COMPLETE 2026-09-14

Runs after G4.2 and before G4.4. Owner-correction revision 3 preserves the completed G3/G4 behavior contracts; native build, HUD automation 24/24 and five affected Widget Blueprint compile/save/readback checks pass. The owner reported the full PIE checklist passed.

Exit: satisfied; UI-HUD-018 and G4.3 are closed.
G4.4

Pause & Settings Night Ops Presentation COMPLETE 2026-09-14

Owner-selected Option B is implemented as a left tactical Pause rail and wide Settings workbench. Native build, HUD automation 24/24 and both Widget Blueprint compile/save/readbacks pass without changing the closed G4 behavior contracts. The owner reported the full PIE checklist passed.

Exit: satisfied; UI-MENU-001 and G4.4 are closed, making G5 the next eligible gate.
G5

Frontend & Session Flow PARTIAL — SP PASS 2026-09-16; DEDICATED NULL/LAN JOIN PASS 2026-09-16

Owner selected Option C “Survivor Dossier.” Native implementation and Widget Blueprint readback remain in place. On 2026-09-16 the owner reported UI-FE-001, UI-FE-003, UI-FE-004, UI-FE-005, UI-FE-006, UI-FE-007 and UI-FE-009 passed, including remaining Character Creation visual checks, remaining persistence/restart/rejoin checks, dedicated Pause/Exit/restore and Server Browser Refresh/Join. UI-FE-002 was already complete. Dedicated/listen persistable worlds advertise a Null/LAN session; Pause Exit to Main Menu is visible on dedicated clients; join appends LambeerPlayerKey. Owner reported extra-client first-time Character Creation restores the hip follow camera. UE 5.8 Play As Client is the dedicated topology; one-process PIE lists that host by listen port. Steam metadata, Feedback URL and the production gameplay destination remain blocked on UI-FE-008. This does not close G5.

Exit: every branch handles missing/corrupt/offline/full/incompatible states and owner PIE validates the complete flow, including the remaining Steam/Feedback/production-map remainder.
G6

System Screens

Crafting, building, workbench/mag planner, skills, achievements, vehicle and boss.

Exit: each screen is wired to authoritative interface or visibly backend-blocked.
G7

Social & Communication

Group management, logs, chat and voice controls.

Exit: permissions, privacy controls and channel/failure states validated.
G8

Accessibility & Ship Hardening

English/Thai, semantic palettes, rebinds, scalability, automated checks, cook/package.

Exit: DoD matrix complete; user records final PIE evidence.

Detailed Task Register

IDGateStatusLaneWork itemFiles / assetsDependencyExit evidence
UI-PLN-001G0CompleteDesignResolve Quick Slot 1–2 vs Back Weapon 1–2 collision/restore semantics.FEAT-HUD-UIOwner decision recorded 2026-09-06.Slots 1–2 are exclusively reserved for Back Weapon 1–2; no alternate binding or manual-binding restore state.
UI-PLN-002G0CompleteDesignApprove visual tokens, layouts and 64-icon solid/silhouette kit.RawResource/UI/Icons/Owner approval recorded 2026-09-06.Visual system and complete 64-icon kit marked confirmed in FEAT-HUD-UI.
UI-PLN-003G0CompleteDesignSelect Thai-capable font file and verify license/repository path.RawResource/Fonts/Google_Sans//Game/Lambeer/UI/Common/Fonts/FF_UI_PrimaryOwner approval, local glyph audit, embedded OFL metadata, official source repository, and retained OFL.txt.Google Sans Regular/Medium/SemiBold/Bold approved; Thai coverage and SIL OFL 1.1 evidence verified.
UI-PLN-004G0CompleteC++Capture current compile state, asset references and UI configuration before migration.Lambeer.uproject, Build.cs, Config, existing UI C++/assetsNoneUnreal MCP reference audit and Development Game build succeeded; owner reported the clean Editor rebuild passed after the prior DLL lock was removed.
UI-PLN-005G0CompleteQARecord current HUD/inventory/interaction behavior in PIE for regression reference.Existing maps/widgets; screenshots under Documentation/assets/evidence/hud-ui-g0/Only user may run PIEThree owner-supplied captures retained; Hand 1/Hand 2/Pocket drag succeeds, Quick Slot drag fails, and the unverified interaction/input cases are explicitly bounded.
UI-FND-001G1CompleteC++Enable CommonUI plugin and add CommonUI/CommonInput module dependencies.Lambeer.uproject, Source/Lambeer/Lambeer.Build.csG0 baselineEditor and Development targets compile without missing module errors.
UI-FND-002G1CompleteC++Configure UCommonGameViewportClient and verify project startup uses it.Config/DefaultEngine.iniUI-FND-001Viewport class verified in the owner-run G1 runtime matrix.
UI-FND-003G1CompleteC++Create ULambeerUIManagerSubsystem : ULocalPlayerSubsystem.Source/Lambeer/UI/Common/LambeerUIManagerSubsystem.*UI-FND-001Root creation and layer ownership passed the owner-run G1 runtime matrix.
UI-FND-004G1CompleteC++Create root class and typed layer accessors.LambeerUIRootWidget.*UI-FND-003HUD/Screen/Modal/Toast layers resolve and operate in verified paint order.
UI-FND-005G1CompleteEditorCreate WBP_UIRoot with named layer hierarchy./Game/Lambeer/UI/HUD/WBP_UIRootUI-FND-004Blueprint compiles; every BindWidget name matches C++.
UI-FND-006G1CompleteC++Create ULambeerActivatableWidget with input config, Back and initial-focus contract.LambeerActivatableWidget.*UI-FND-001Top screen/modal focus and deterministic modal-first Back order passed PIE.
UI-FND-007G1CompleteC++Implement push/pop APIs by layer tag and soft class reference.LambeerUIManagerSubsystem.*, LambeerUIActionTypes.hUI-FND-004/006Screen/modal push-pop and duplicate-modal policy passed the requested G1 checks.
UI-FND-008G1CompleteC++Centralize cursor, gameplay mapping suppression, focus restoration and SP/MP pause request.UI manager + LambeerPlayerController.*UI-FND-007Final-layer input restoration and the requested standalone/multiplayer pause checks passed.
UI-FND-009G1CompleteC++Turn existing HUD/inventory/character subsystems into temporary facades that route to UI manager.Source/Lambeer/UI/Lambeer*Subsystem.*UI-FND-007/008The requested G1 compatibility/regression checks passed.
UI-FND-010G1CompleteQAPIE smoke: dummy primary screen + modal with KBM/Xbox/PlayStation.WBP test screen/modalUI-FND-001–009Owner reported focus, Back, cursor, restoration and world-pause checks passing on 2026-09-07.
UI-DSN-001G2CompleteEditorImport approved 64 SVG icons as tintable UI textures.RawResource/UI/Icons//Game/Lambeer/UI/Common/Icons/T_UI_*Approved source kit; Unreal MCP import via 256×256 transparent raster intermediatesUnreal MCP verified all 64 assets and required UI texture settings.
UI-DSN-002G2CompleteEditorCreate theme, button, text, tab, list-row, progress and modal style assets./Game/Lambeer/UI/Common/Styles/, WBP_G2_ComponentGalleryUI-PLN-002/003Assets compile; Google Sans Thai rendering passed owner PIE step 5.2 on 2026-09-08.
UI-DSN-003G2DeferredEditorCreate CommonInput controller data for Xbox and PlayStation from verified glyph assets./Game/Lambeer/UI/Common/Input/, existing ControllerGlyphsUI-FND-001Assets are saved; physical controller validation is deferred until hardware is available.
UI-DSN-004G2DeferredC++Expose input-method change event and preserve focused semantic control on device switch.UI manager/common widgetsUI-DSN-003Development Game compiles; physical Xbox/PlayStation focus evidence is deferred.
UI-DSN-005G2CompleteEditorImport approved Google Sans faces and configure composite/fallback font.RawResource/Fonts/Google_Sans//Game/Lambeer/UI/Common/Fonts/FF_UI_PrimaryResolved TBD-HUD-UI-002Font assets/bindings verified; owner PIE step 5.2 and Thai Gallery culture switching passed on 2026-09-08.
UI-DSN-006G2CompleteC++Implement centralized DPI, HUD scale, safe-zone and text-scale application.UI manager + root presentation settingsUI-FND-005Owner confirmed HUDScale, SafeZoneScale and TextScale on 2026-09-08. No approved maximum HUD scale or overlap policy is established.
UI-DSN-007G2CompleteDesignCreate English source string table keys for all navigation, states and errors; add Thai translations.ST_UI_Common_EN, ST_UI_Common_THApproved copy/font24 keys and locres are complete; owner confirmed the four bound Gallery samples switch English/Thai on 2026-09-08.
UI-HUD-001G3CompleteC++Create UI snapshot types and event-driven HUD adapter.LambeerUITypes.h, HUD adapter/subsystemG1Snapshot changes only when source state changes; unavailable fields are explicit. Owner reported eight GAS-colored bars 2026-09-10.
UI-HUD-002G3CompleteBackendAdd gameplay-owned Energy, Sleep and Immunity attributes/events.LambeerAttributeSet.* and survival systemCanonical survival designAttributes replicate this session; approved drain/regen ticks; owner reported bed-sleep PIE 2026-09-09; persistence was not invented.
UI-HUD-003G3CompleteC++Refactor status bars from Tick polling to attribute delegates; support eight bars.LambeerStatusBarsWidget.*, WBP_StatusBarsUI-HUD-001/002No persistent gameplay polling; 8 normalized values render without numbers. Owner reported bars no longer gray 2026-09-10.
UI-HUD-004G3CompleteC++Remove HitMarker field/API and all bindings.LambeerHUDWidget.*, WBP_HUDConfirmed no-hit-feedback ruleC++ path removed; WBP_HUD HitMarker deleted via MCP; owner reported no HitMarker 2026-09-10.
UI-HUD-005G3CompleteEditorCreate WBP_HUDRoot and child hierarchy with actual viewport-edge anchors./Game/Lambeer/UI/HUD/WBP_HUDRootG2, UI-HUD-001Root and child WBPs compiled/saved via MCP after Editor reopen; all BindWidget names bound. Owner HUD close checklist 1–7 used this root.
UI-HUD-006G3CompleteC++Implement contextual status list ordering by severity/time and non-hidden critical overflow.Status presentation model/widget baseGameplay status tags/eventsC++ sort/overflow exists; onset uses replicated server world time. Owner reported status injectors 2026-09-08.
UI-HUD-007G3CompleteC++Replace heading text with compass tape and shared marker projection.LambeerCompassWidget.*, map marker serviceFUIMapMarker contractC++ tape + MCP Overlay_Tape; owner reported marker diamonds 2026-09-08. Owner correction 2026-09-14: look-right from N is HUD east on tape and map/minimap symbols; WorldYawToHudYaw plus east-is-right disc/UV X. Owner PIE of that mapping is pending.
UI-HUD-008G3CompleteC++Implement minimap view model, filters and player heading.Map service + minimap widget baseUI-HUD-007C++ heading disc + shared markers; WBP_Minimap compiled/saved. G3 used a direction ring. G4 scales distance with a 50 m implementation clamp and paints a north-up temporary map image; still not an approved radar radius. Owner reported marker diamonds 2026-09-08 and the north-up / walk-only diamond retest 2026-09-12.
UI-HUD-009G3CompleteBackendAdd item handedness to Data Asset contract and enforce atomic two-handed occupancy.LambeerItemDefinition.h, held/equipment components, item assetsPer-item Data Asset rule; user asset editsC++ default OneHanded + occupancy; sledgehammer TwoHanded owner-reported 2026-09-09. Remaining production DA tagging is not a G3 HUD blocker.
UI-HUD-010G3CompleteC++Migrate Quick Slots 8→10, reserve display slots 1–2 for Back Weapon 1–2, bind 1–0 actions and present both hands.Equipment types/component, PlayerController, input assets, HUD/inventoryUI-HUD-009 + resolved TBD-HUD-UI-001C++ contract and Wood assignment are implemented; owner reported unified Q1–Q0 on 2026-09-08 and UI_G3GiveBackWeapons keys 1/2 on 2026-09-10.
UI-HUD-011G3CompleteC++Implement reticle state machine; ADS hidden; no damage confirmation.Aim/combat events + reticle widget baseExisting aim componentDeterministic mapping in C++; owner reported ADS hides reticle 2026-09-10 and throw/sledgehammer melee 2026-09-09.
UI-HUD-012G3CompleteC++Replace text-only prompt event with structured prompt state and projected placement.InteractionComponent.*, prompt host/widgetG2 glyphsStructured state + HUD PromptHost compiled; owner reported quantity/denied 2026-09-10. HOLD waits for a real hold action; no G3 debug fixture.
UI-HUD-013G3CompleteC++Implement low-health thresholds and blood/wet screen-effect timelines.LambeerScreenEffectsWidget.*, effect eventsHealth/blood/wetness sourcesConfirmed 30/20/10 and 2s/5s/5s timelines in C++; Sleeping dim alpha 0.22 owner-reported pass 2026-09-09. Nearby 2 m / LOS blood, low-health edges and rain-lens droplets owner-reported 2026-09-10. Rain VFX is out of G3.
UI-HUD-014G3CompleteC++Implement observed chamber/magazine knowledge mask and invalidation rules.Combat/weapon component + hand presentationWeapon backendL1810 instance ammo and timed field inspection are in source. Owner reported inspect pass 2026-09-10. Magazine-as-item is G3.2 UI-HUD-016. [CONFIRMED 2026-09-14] Observation is not persisted. Every fired round must clear chamber and magazine knowledge to UNKNOWN; hook that into the P10 fire path. Current invalidation still covers item/quantity identity changes.
UI-HUD-015G3.2CompleteC++Extend item visual pipeline from StaticMesh-only to skeletal L1810 for world, held and back presentation.Item definition visual fields, held/back visual components, SKM_L1810G3 L1810 item + existing StaticMesh pipelineMCP readback 2026-09-11: DA_Item_L1810 skeletal fields point at SKM_L1810; Engine cube remains the pickup collision proxy. Owner reported world/held/back skeletal visuals 2026-09-11. Grip pose remains unpolished content.
UI-HUD-016G3.2CompleteBackendMagazine-as-item install for L1810 using the existing magazine mesh.Firearm stack, magazine item, L1810_MagazineG3 chamber/magazine counts on the firearm stackNew L1810 stacks have no mag. MCP created/saved magazine and 9x19 Data Assets and sandbox pickups 2026-09-11. Owner reported load, 3 s install, move-cancel, unload and remove on 2026-09-11.
UI-HUD-017G3.2Blocked — deferredEditorMap confirmed WetAmount scalar onto materials for a visible wet look.Character/item materials that expose WetAmountConfirmed wetness scalar; mapping values remain TBDOwner deferred: current L1810/magazine/MetaHuman materials have no WetAmount parameter. Do not invent roughness/albedo/drip numbers.
UI-CORE-001G4Complete — owner-reported Tab open/close 2026-09-12; Escape still works; no RegisterUIActionBinding crashC++Convert inventory screen to activatable lifecycle without losing existing assignment logic.LambeerInventoryWidget.*, subsystem facadeG1Open/close, delegate cleanup and focus restoration pass; no direct input-mode ownership.
UI-CORE-002G4Complete — owner-reported commands 2026-09-11; worn slots and clothing pickup/equip 2026-09-12. Search was removed by owner decision 2026-09-14. Take All/Transfer All presentation stays UI-CORE-003 in G4.2BackendAdd validated Split, quantity Drop, Use, Equip, Sort, Take All and Transfer All commands; Inventory Search is excluded.Inventory/equipment components, LambeerInventoryCommandRules.h, inventory widget context menuInventory feature rulesServer rejects invalid/stale indices via ExpectedItemId and preserves item-instance state.
UI-CORE-004G4Complete — owner-reported pan/zoom/center, ping, filters, Tab switching and zoom-clip retest 2026-09-13; north-up minimap / frozen death diamond 2026-09-12C++Build shared map screen/view model with category toggles, pan, zoom, center and ping.LambeerMapScreen.*, LambeerMapSubsystem.*, LambeerMapPresentation.*, WBP_WorldMap, WBP_Minimap, T_WorldMap_Temporary, marker service, ALambeerPlayerState pingUI-HUD-007/008Full map starts revealed; filters are local; shared ping is server validated; zoomed paint stays inside the map panel.
UI-CORE-005G4Complete — owner-reported pass 2026-09-13; nested dump / loot-panel / HUD refresh already passed 2026-09-12BackendProvide death/respawn state and death-marker lifecycle events.LambeerDeathTypes.h, LambeerDeathRules.h, LambeerDeathBag.*, ALambeerPlayerState death record, ULambeerAttributeSet lethal Health, ULambeerSurvivalComponent last slept bedGameplay backendMarker clears on despawn or empty bag; killer/cause/location are authoritative. Worn-container contents stay nested in the dropped item. Interact opens loot panels. Respawn clears blood/low-HP overlays. G4 had no authored despawn timer. P07 2026-09-14: death bags persist with a 24-hour remaining world-up despawn; see TECH-NETWORK-ARCH. Last bed is last Sleep start.
UI-CORE-006G4Complete — owner-reported Last Bed after Sleep and four-town Fresh Spawn 2026-09-13; immediate-respawn close 2026-09-12C++Create full-map spawn/death screen with last bed or Fresh Spawn and four-town flow.LambeerDeathScreen.*, LambeerDeathSubsystem.*, LambeerSpawnRegion.*, WBP_DeathRespawnUI-CORE-004/005No sleeping-bag option; invalid/occupied choice reports reason and remains selectable only when valid. Sandbox towns are not production geography. P07 2026-09-14: loading a dead player record reopens this screen instead of a locked corpse.
UI-CORE-007G4Complete — owner-reported dedicated-server pause 2026-09-12; standalone PAUSED/world-pause 2026-09-13C++Create pause/menu policy using session type rather than client assumption.LambeerPauseRules.h, LambeerPauseScreen.*, LambeerPauseSubsystem.*, WBP_PauseMenuG1SP pauses; MP shows “WORLD CONTINUES…” and only blocks local controls. World pause is NM_Standalone only, not a client/host assumption.
UI-CORE-008G4Complete — owner-reported 2026-09-13: language/font, categories, stacking, HUD Scale/Safe Zone, Display Revert; Text Scale removed from G4 Settings (locked 1.0) and confirmed absent after rebuildC++Create settings model with staged apply/revert and per-category adapters.LambeerUserSettings.*, LambeerSettingsRules.h, LambeerSettingsScreen.*, LambeerSettingsSubsystem.*, WBP_SettingsG2Invalid unsupported settings cannot persist; risky display changes can revert safely. G4 does not persist player Text Scale.
UI-CORE-003G4.2Complete — owner-reported Night Ops visual, retained-interaction and field-free header PIE pass 2026-09-14EditorImplement Character + Container Focus inventory, context/split presentation and side-by-side Player/Target transfer layout using the Night Ops visual source while preserving retained behavior; Inventory Search is excluded.WBP_Inventory, WBP_InventoryContainer, WBP_InventorySlot, WBP_ContainerTransfer, LambeerInventoryWidget.*, LambeerInventoryPresentation.h, LambeerContainerTransferWidget.*, RawResource/ConceptReference/Inventory_UI_NEW.png, RawResource/UI/Inventory/UMG/NightOps/ui_inventory_night_ops_focus_corners.pngEvery G4 task and G4 exit criterion completeNight Ops brush tokens and focus mask saved with no Rescue references; Development Game/Editor builds, field-free WBP_Inventory compile/save/readback and three focused non-PIE tests pass. Owner KBM PIE accepted the corrected presentation, retained drag/command/transfer interactions and Search-free header. Search was removed after its sole failure. Controllers are deferred until hardware.
UI-HUD-018G4.3Complete — owner-reported full revision-3 PIE pass 2026-09-14EditorImplement HUD frame, segmented Stats, minimap, reticle and screen-effect presentation without changing the completed G3/G4 gameplay contracts.WBP_HUDRoot and HUD child widgets; RawResource/UI/HUD/UMG/NightOps/*.png; /Game/Lambeer/UI/HUD/Textures/NightOps/T_UI_HUD_NightOps_*G4.2 complete; G4.3 precedes G4.4Six accepted textures have verified UI settings/alpha/runtime caps; revision-3 native build and HUD automation 24/24 pass; five affected widgets compile/save/read back cleanly; the owner reported the complete G4.3 PIE checklist passed. Controllers remain deferred until hardware and are outside this closure.
UI-MENU-001G4.4Complete — owner-reported full Option B PIE pass 2026-09-14C++Apply the Night Ops Tactical Side Rail presentation to Pause and Settings while preserving their completed behavior.LambeerPauseScreen.*, LambeerSettingsRules.h, LambeerSettingsScreen.*, WBP_PauseMenu, WBP_Settings, RawResource/UI/Menus/Concepts/NightOps/G4 behavior and G4.3 complete340×820 Pause rail and 1480×820 Settings workbench are built with resource-less Night Ops chrome. The former world-continues warning is absent; language choices render white as English/ภาษาไทย while persisting en/th. Editor build, HUD automation 24/24 and both Widget Blueprint compile/save/readbacks pass. The owner reported the complete dedicated-server/Standalone Pause, Settings, stacking and responsive EN/TH PIE checklist passed.
UI-FE-001G5Complete — owner-reported PIE pass 2026-09-16C++Create frontend root and Main Menu activatable screen.LambeerFrontendSubsystem.*, LambeerMainMenuScreen.*, WBP_MainMenuG1/G2; selected Option CContinue and unavailable Feedback expose explicit reasons; Feedback can open only a configured HTTP(S) URL. Native build and Widget Blueprint compile/save/readback pass. Configured Feedback URL remains deferred on UI-FE-008.
UI-FE-002G5Complete — P07 backend and owner restart/rejoin PIE 2026-09-14BackendImplement local world/save index and last-world pointer.USaveSubsystem, USQLiteSaveBackend, FLambeerWorldSaveSummary, ULambeerUserSettingsResolved TBD-HUD-UI-003: embedded NM_Standalone; P07 SQLite world storeCreate/list/rename/delete/open and missing/corrupt/incompatible probes work without UI owning save bytes. Remembered world lives in client settings. Headless Lambeer.Persistence 6/6. Screens that consume the index stay UI-FE-001/UI-FE-003.
UI-FE-003G5Complete — functional owner PIE pass 2026-09-16; reference-refresh visual PIE pendingC++Create Save World Select screen and Continue routing.LambeerSaveWorldScreen.*, USaveSubsystem, USQLiteSaveBackend, WBP_SaveWorldSelectUI-FE-002Start SP opens selection; Continue validates the remembered P07 world before travel. Create/list/rename/two-step delete and explicit invalid reasons are wired. The aliased probe path that falsely marked healthy worlds Missing is fixed. The owner-supplied P08_UI_Save_world.png refresh adds the Night Ops sidebar, visible selectable world cards and separate action rail without changing persistence authority. Native/automation/Widget Blueprint validation passes; refreshed visual PIE acceptance remains pending. Packaged production gameplay destination remains deferred on UI-FE-008/ROAD-P08-04.
UI-FE-004G5Complete — owner-reported Null/LAN PIE pass 2026-09-16BackendCreate online session/server-browser adapter.LambeerSessionSubsystem.*, LambeerSessionRules.h, FLambeerServerBrowserEntryOnline platform integrationOfficial/community, favorites, ping, population, search/filter metadata, cancellable refresh and join failures are supplied. Dedicated/listen persistable worlds advertise a Null/LAN session. One-process PIE lists those hosts by listen port instead of Null FindSessions. Owner reported Refresh/Join. Development uses OnlineSubsystemNull; Steam metadata/provider acceptance stays with TBD-HUD-UI-004/UI-FE-008.
UI-FE-005G5Complete — functional owner PIE pass 2026-09-16; reference-refresh visual PIE pendingC++Create Server Browser screen with cancellable refresh/join flow.LambeerServerBrowserScreen.*, WBP_ServerBrowser, LambeerPauseScreen.*UI-FE-004Refresh/cancel, tabs, favorites, search/filter and join routing are wired; stale/full/version/timeout errors are explicit. The owner-supplied P08_UI_Server_browser.png refresh presents visible Favorite/Server/Players/Ping/Action rows with row-level Join while retaining advanced filters and provider-neutral opaque IDs. Native/automation/Widget Blueprint validation passes; refreshed visual PIE acceptance remains pending. Join appends LambeerPlayerKey. Pause Exit to Main Menu is visible on dedicated clients; Save stays standalone-only. Default browser tab is Community because unmarked Null/LAN dedicated sessions are Community. Owner reported dedicated Pause/Exit/restore and Server Browser Refresh/Join 2026-09-16. UE 5.8 Play As Client starts the dedicated world automatically. Optional Cancel/stale-join checks were not required for this close. Steam discovery stays with UI-FE-008.
UI-FE-006G5Complete — owner-reported spawn recovery/rejoin PIE pass 2026-09-16BackendExpose character-per-server existence, creation commit and persisted-position entry state.ALambeerPlayerState, ALambeerGameMode, ULambeerWorldPersistenceSubsystem, ULambeerUIManagerSubsystemNetwork/persistence backendServer validates first appearance, then requires starter-town selection; existing characters skip creation and restore persisted state/position. bInitialSpawnChosen round-trips in P07 storage. Fresh entry explicitly requests Character Creation; the LocalPlayer rebuilds a root whose PlayerController or world changed across travel; pre-creation/Error states do not create player rows; and incomplete legacy rows re-enter creation. Player-scoped writes capture, commit and read back the supplied character. Early reads ensure storage readiness independently of BeginPlay; teardown preserves the final pawn record. See lifecycle correction. Owner reported Continue skip, spawn recovery, town/move/save/restart and rejoin passed.
UI-FE-007G5Complete — owner-reported visual PIE pass 2026-09-16EditorCreate WBP_CharacterCreation child and preview hierarchy.ULambeerCharacterCreationWidget, ULambeerUIManagerSubsystem, /Game/Lambeer/UI/Menus/WBP_CharacterCreationExisting C++ base + G2Config soft path resolves; native layout exposes gender/preset/hair, skin HSV, eye RGB, live portrait and server-owned initial commit. Widget Blueprint compiles/saves/readbacks cleanly. Owner reported remaining visual checks passed, including lighting/framing, travel-flash, streamed-stage presentation, Escape-to-Main confirmation, exposure parity and commit/rejoin presentation. Final environment assets and art lighting/time of day remain later content.
UI-FE-008G5Blocked — deferred later 2026-09-16C++Configure Steam metadata and external Feedback URL.Config/platform settingsTBD-HUD-UI-004Invalid/missing URL is disabled with reason; no custom launcher/patcher. Owner postponed remaining Steam/Feedback/production-destination work after accepting the Single Player frontend slice.
UI-FE-009G5Complete — owner-reported PIE pass 2026-09-16C++Add Single Player Save and Exit to Main Menu actions to Pause; require a fresh save before exit when the latest durable snapshot is older than 30 seconds.LambeerPauseScreen.*, LambeerPersistenceRules.h, ULambeerWorldPersistenceSubsystem, WBP_PauseMenuUI-CORE-007, P07 required-player snapshot pathSave always captures and read-verifies the owning player and remains standalone-only. A required-save failure cancels travel and remains visible in the Pause status line. Owner reported the Single Player Pause Save/Exit behavior passed. Dedicated Exit to Main Menu (no local save) later passed as UI-FE-005 on 2026-09-16.
UI-SYS-001G6BlockedBackendImplement persistent player/station crafting queues with immediate reservation and cancel refund.Crafting components/servicesTBD-HUD-UI-005 for destruction overflowEarlier queue entries reduce availability; logout/leave does not stop queue.
UI-SYS-002G6Not startedC++Create searchable recipe/detail/queue screen.LambeerCraftingScreen.*, WBP_CraftingUI-SYS-001Player source uses carried inventory; station source uses only station storage.
UI-SYS-003G6Not startedBackendExpose building catalog, placement preview state, cost/tier/snap/rotation and failure code.Building system interfacesBuilding backendCommit is server validated; UI preview cannot authorize placement.
UI-SYS-004G6User-onlyEditorCreate build selection/action radial widgets.WBP_BuildRadial, WBP_BuildActionRadialUI-SYS-003Cost/tier/snap/rotation/failure and Upgrade/Repair/Demolish/Authorize visible contextually.
UI-SYS-005G6Not startedBackendImplement pure magazine-plan expansion and authoritative load validation.Weapon/magazine types and testsWeapon backendHead→Loop→Tail order; capacity may stop mid-loop pattern; incompatible ammo rejected.
UI-SYS-006G6Not startedC++Create workbench screen, 3D preview contract and magazine planner modal.LambeerWorkbenchScreen.*, target widgetsUI-SYS-005 + weapon actionsDefault drag order and advanced planner preview match server sequence.
UI-SYS-007G6Not startedBackendExpose skill XP, level, progress and next-bonus data per character/server.Skill progression serviceP21 skill backendExact XP is authoritative; missing next bonus has explicit state.
UI-SYS-008G6BlockedC++Create achievement catalog/progress/reward screen and unlock toast.Achievement screen/toastTBD-E2F4910CCannot finalize catalog/reward action until canonical decision resolves.
UI-SYS-009G6Not startedC++Create vehicle HUD adapter and widget.FVehicleHUDState, WBP_VehicleHUDVehicle backendDiegetic speed/RPM; overlay fuel/damage/gear/seats/access; storage via Inventory.
UI-SYS-010G6Not startedC++Create boss health and inspected respawn-state presentation.WBP_BossHUD, marker interactionBoss backend + marker serviceTimer hidden before inspection; occupied state uses exact approved copy.
UI-SOC-001G7BlockedBackendFinalize and implement clan naming/tag, promote/kick authority and log retention.Group registry/serviceTBD-HUD-UI-007Leader/Officer/Member permissions have server tests and audit semantics.
UI-SOC-002G7Not startedC++Create group screen: Create, Invite Inbox, roster, roles, activity log; no Search/Join.LambeerGroupScreen.*, WBP_ClanSquadUI-SOC-001Actor/action/target and death/online/offline entries render; permissions disable with reason.
UI-SOC-003G7Not startedBackendProvide text chat channels Server/Proximity/Squad with moderation/error state.Chat serviceOnline backendChannel membership and rejected sends are authoritative.
UI-SOC-004G7User-onlyEditorCreate chat panel/entry/channel widgets.WBP_TextChatUI-SOC-003Keyboard/controller entry, unread state and channel switching work without focus trap.
UI-SOC-005G7Not startedBackendExpose voice channel/PTT/speaker/per-player volume/mute/block state.Voice servicePlatform voice integrationPrivacy actions persist at intended scope; unavailable microphone is explicit.
UI-SOC-006G7Not startedC++Create voice panel and world speaking indicator; retain no squad roster HUD.WBP_VoicePanel, speaking marker widgetUI-SOC-005Speaking state appears near character/map context without persistent roster panel.
UI-ACC-001G8Not startedC++Implement semantic palette presets; never recolor raw meanings ad hoc.Theme/settings serviceG2 stylesColorblind modes preserve icon/text/shape redundancy.
UI-ACC-002G8Not startedC++Implement subtitle presentation for English/Thai; no environmental captions.Subtitle widget/settingsLocalization/audio eventsSpeaker/text timing wraps without clipping at scale extremes.
UI-ACC-003G8Not startedC++Connect Reduce Camera Shake and Disable Flashing (black instead of white) settings.User settings + camera/effect systemsGameplay VFX integrationEvery flash source follows centralized policy; critical information remains visible.
UI-ACC-004G8Not startedC++Implement full rebind model, conflict detection and hold/toggle aim/crouch/sprint.Enhanced Input settings service/screensInput action inventoryBindings survive restart and glyph display updates from resolved mapping.
UI-QA-001G8ReadyQAAdd C++ automation tests for pure contracts: magazine expansion, marker lifecycle, quick-slot validation, setting serialization and queue math.New test translation units under Source/LambeerCorresponding backend functionsTests pass in non-PIE automation run; no UI screenshot claim.
UI-QA-002G8ReadyQAAdd static checks for forbidden HitMarker bindings, hard-coded user strings and invalid soft widget paths.Validation script/build checksG3–G7CI/local validation reports actionable file/path and exits non-zero on violation.
UI-QA-003G8User-onlyQARun complete manual PIE matrix from FEAT-HUD-UI.PIE checklist UI-001–012Only user may run PIEUser records results, build/config, screenshots and defect IDs.
UI-QA-004G8Not startedQACompile Editor/Game/Server targets and run content validation + cook/package smoke.Project targets/contentAll required gatesNo missing classes/assets, redirector errors or uncooked UI dependencies.
UI-QA-005G8User-onlyQAVerify FHD/2K/4K, 16:10/21:9/32:9, EN/TH and KBM/Xbox/PlayStation matrix.Packaged/PIE buildsOnly user performs interactive verificationNo clipping, overlap, focus trap or unreadable semantic state; evidence retained.

No tasks match the current filters.

Screen-to-Task Coverage Crosswalk

Screen IDs และหน้าที่เป็น canonical ใน FEAT-HUD-UI; ตารางนี้ชี้เฉพาะ implementation owner task และ gate เพื่อไม่ทำซ้ำ behavior specification

Screen IDTarget WidgetPrimary task(s)GateBackend condition
UI-SCR-MAINWBP_MainMenuUI-FE-001, UI-FE-008G5Local-world summary + configured Feedback URL
UI-SCR-SAVESWBP_SaveWorldSelectUI-FE-002, UI-FE-003G5Local save index
UI-SCR-SERVERWBP_ServerBrowserUI-FE-004, UI-FE-005G5Online session adapter
UI-SCR-CHARWBP_CharacterCreationUI-FE-006, UI-FE-007G5Character-per-server service
UI-SCR-SPAWNWBP_SpawnMapUI-CORE-004006G4/G5Authoritative spawn eligibility
UI-HUD-ROOTWBP_HUDRootUI-HUD-001014, UI-HUD-018G3 / G4.3Per-source availability flags; G4.3 presentation must preserve completed adapters
UI-HUD-PROMPTWBP_InteractionPromptUI-HUD-012G3Structured interaction state
UI-HUD-BOSSWBP_BossHUDUI-SYS-010G6Boss/marker events
UI-HUD-VEHICLEWBP_VehicleHUDUI-SYS-009G6Vehicle state provider
UI-SCR-INVENTORYWBP_InventoryUI-CORE-001003, UI-HUD-010G4 / G4.2Inventory/equipment/held commands
UI-SCR-CONTAINERWBP_ContainerTransferUI-CORE-002, UI-CORE-003G4.2Two authoritative inventories
UI-SCR-CRAFTWBP_CraftingUI-SYS-001, UI-SYS-002G6Queue/reservation service
UI-SCR-BUILDWBP_BuildRadialUI-SYS-003, UI-SYS-004G6Placement preview/provider
UI-SCR-BUILD-ACTIONWBP_BuildActionRadialUI-SYS-003, UI-SYS-004G6Server-authorized target actions
UI-SCR-WORKBENCHWBP_WeaponWorkbenchUI-SYS-005, UI-SYS-006G6Weapon action/compatibility service
UI-SCR-MAGWBP_MagazineLoadPlannerUI-SYS-005, UI-SYS-006G6Magazine load validation
UI-SCR-MAPWBP_WorldMapUI-CORE-004, UI-HUD-007, 008G3/G4Marker registry
UI-SCR-SKILLSWBP_SkillsUI-SYS-007G6Skill progression service
UI-SCR-ACHIEVEWBP_AchievementsUI-SYS-008G6TBD-E2F4910C
UI-SCR-GROUPWBP_ClanSquadUI-SOC-001, UI-SOC-002G7TBD-HUD-UI-007
UI-SCR-CHATWBP_TextChatUI-SOC-003, UI-SOC-004G7Chat service
UI-SCR-VOICEWBP_VoicePanelUI-SOC-005, UI-SOC-006G7Platform voice service
UI-SCR-DEATHWBP_DeathRespawnUI-CORE-005, UI-CORE-006G4Death/loot/spawn services
UI-SCR-PAUSEWBP_PauseMenuUI-CORE-007, UI-MENU-001, UI-FE-009G4 / G4.4 / G5Session-type authority; Single Player required-player persistence; presentation cannot alter pause policy
UI-SCR-SETTINGSWBP_SettingsUI-CORE-008, UI-MENU-001, UI-ACC-001004G4 / G4.4 / G8User settings/input services; G4.4 adds presentation only

Replication, Persistence & Security Rules

Client-only

  • Screen activation, focus and cursor
  • Map category visibility
  • HUD scale/safe zone/text size
  • Observed ammunition knowledge cache (not persisted; cleared to UNKNOWN after every fired round)
  • Transient blood/wet timelines

Server-authoritative

  • Inventory/equipment/held item mutation
  • Craft reservation/queue/cancel
  • Building commit/actions
  • Spawn eligibility and location
  • Group roles/logs
  • Achievements/rewards/statistics

Persistent scope

  • Character/server stats and achievements
  • Character/server persisted position
  • Player/station crafting queues
  • Local Single Player world index
  • User settings and rebinds
  • UI RPC requests carry stable IDs where stale-selection risk exists; never trust client index alone. Inventory stack commands in G4 UI-CORE-002 send ExpectedItemId with the index and reject when that stack is missing or a different item. There is no generation token.
  • Server rejection must trigger refresh from authoritative state and show a localizable reason.
  • Owner-only/private data is not replicated to unrelated players merely to simplify UI.
  • Death marker lifetime follows loot-bag entity state; it is not a separate permanent client marker.
  • Achievement unlock is idempotent; toast appears only after durable/authoritative acceptance.
  • Crafting reserve/refund must be transaction-safe against reconnect, retry and station destruction.

Performance & Failure Handling

For capture commands, UI/inventory diagnosis, per-process multiplayer profiling and before/after evidence, follow TECH-PERFORMANCE-PROFILING. This runbook adds no approved numeric budget or new PIE result.

ไม่มี numeric performance budget ที่อนุมัติ จึงใช้ structural rules และวัดจริงโดยไม่ตั้งตัวเลขเป้าหมายเอง

RiskImplementation controlEvidence
Per-frame HUD pollingBind GAS/component delegates; use Tick only for visual interpolation and only while visible.Unreal Insights trace + source review; no actor scans in widget Tick.
Large inventory/list rebuildDiff by stable IDs, virtualize long lists where supported, defer thumbnails and cancel stale requests.Profile worst verified inventory/catalog data when backend exists.
Map marker volumeCentral registry, category filtering before widget creation, pooled marker widgets and distance/viewport projection.Marker-count scenario derived from actual content; no invented count.
Soft asset load failureAsync load; loading/error state; no null dereference; log asset path once.Missing-asset test with one intentionally invalid development fixture.
Device hot-swapUpdate glyphs without rebuilding screen; restore focus by semantic control ID.User PIE device-switch matrix.
Network disconnect/stale actionCancel pending UI operation, return to safe frontend state, invalidate cached selection.Disconnect/reconnect test with recorded result.
Thai text expansionNo fixed text-width assumptions; wrapping/min-width/ellipsis only where full label is recoverable.EN/TH pseudo-long-string screen sweep.

Verification Strategy & Required Evidence

Automated/non-interactive checks

  • Editor/Game/Server C++ compile after each C++ gate.
  • Pure C++ automation tests for deterministic contracts and server validation boundaries.
  • Asset path/config validation for root, screen registry, input data, fonts and icons.
  • Repository search proving forbidden hit/headshot/kill marker APIs and bindings are absent.
  • Localization gather/report shows no unkeyed player-facing strings in the changed scope.
  • Cook/package smoke detects editor-only or missing soft references.

User-only Unreal Editor checks

  • Compile/save each Widget Blueprint after C++ parent change; resolve BindWidget names.
  • G3 Editor rebuild completed 2026-09-08 after owner reopen; run PIE-UI-001005 on WBP_HUDRoot.
  • Run PIE checklist from PIE-UI-001…012.
  • Record resolution/aspect, language, device, SP/MP mode, result and evidence.
  • Only mark a gate verified after user-reported results are captured; agent must not infer a PIE pass.

Regression matrix

DimensionRequired variantsCore assertions
Resolution1920×1080, 2560×1440, 3840×2160Scale, readability, no clip/overlap
Aspect16:9, 16:10, 21:9, 32:9HUD uses actual viewport edges; center content remains stable
InputKBM now; Xbox/PlayStation deferred until hardware is availableGlyph, focus, Back, context and tabs; deferred device rows remain unverified
LanguageEnglish, ThaiWrapping, fallback glyphs, subtitle readability
SessionSingle Player, listen/local development if applicable, dedicated multiplayerPause/input blocking, authority, reconnect
StateLoading, Ready, Empty, Error, Stale, DeniedNo blank or dead-end screen

Definition of Done per Screen

  • Screen ID and class/asset path match FEAT-HUD-UI; proposed asset is verified after creation.
  • All authoritative commands route through C++ service/component and handle rejection.
  • Loading/empty/error/denied states are designed where applicable.
  • Mouse, keyboard, Xbox and PlayStation navigation work; focus has a visible state and no trap.
  • English and Thai copy comes from localizable text; no clipping at supported scale/aspect.
  • Semantic state is conveyed by icon/shape/text as well as color.
  • Delegates are removed on deactivation/destruction; latent loads/callbacks cannot update a dead screen.
  • Automated checks pass where applicable; user-run PIE evidence is recorded.
  • Related canonical HTML docs are updated when implementation changes the contract.
  • Legacy asset/code is removed only after redirect/cook/regression gates pass.

Technical Decisions / Blocking TBDs

IDStatusAffects / decisionDoes not block
TBD-HUD-UI-001Resolved 2026-09-06Back Weapon 1–2 exclusively reserve display slots 1–2/internal indices 0–1; alternate bindings are rejected and no manual-binding restore state exists.
TBD-HUD-UI-002Resolved 2026-09-06Google Sans is approved; 16 local TTFs have verified Thai coverage, embedded OFL metadata matches the official source, and RawResource/Fonts/Google_Sans/OFL.txt is retained. Target: /Game/Lambeer/UI/Common/Fonts/FF_UI_Primary.
TBD-HUD-UI-003Resolved 2026-09-14Shipping SP uses embedded NM_Standalone authority. Save-list UI stays session-agnostic. Canonical persistence contract: TECH-NETWORK-ARCH.
TBD-HUD-UI-004Open — Steam/Feedback still blockedSteam metadata and working Feedback actionAccepted Single Player Main Menu layout, Continue/Save World Select, Character Creation visual, persistence/restart and Pause Save/Exit. Owner-reported Null/LAN dedicated Pause/Exit/restore and Server Browser Refresh/Join do not resolve this TBD.
TBD-HUD-UI-005OpenStation-destruction refund overflow transactionQueue UI and ordinary cancel/refund path
TBD-E2F4910COpenFinal achievement entries, thresholds, reward payload/actionCatalog shell, progress component and unlock-toast contract
TBD-HUD-UI-007OpenClan naming/tag, promote/kick and log retention implementationGroup screen layout and confirmed invite roles
TBD-HUD-UI-008Resolved 2026-09-06Documented visual tokens, layouts, and 64-icon kit are approved for implementation.

Dependencies & Source of Truth

Plan source of truth: เอกสารนี้กำหนด implementation order, file impacts, gates และ verification evidence ส่วนพฤติกรรม player-facing ยังคง canonical ใน FEAT-HUD-UI และ gameplay authority/value อยู่ใน feature/technical docs ของระบบนั้น