diff --git a/CHANGELOG.md b/CHANGELOG.md index d9e6fe9..432781f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog -Latest published Workshop version: **0.0.126** +Latest published Workshop version: **0.0.127** + +## 2026-10-30 — Results panel visibility + +- Fixed the blank end-of-mission panel so victory, failure and mission statistics are visible before restart. ## 2026-10-30 — Community mission statistics diff --git a/addons/core/UI/layouts/ERR/RoundResults.layout b/addons/core/UI/layouts/ERR/RoundResults.layout index 3ea3cb0..a394325 100644 --- a/addons/core/UI/layouts/ERR/RoundResults.layout +++ b/addons/core/UI/layouts/ERR/RoundResults.layout @@ -1,29 +1,34 @@ SizeLayoutWidgetClass { Name "ERR_RoundResults" + AllowWidthOverride 1 WidthOverride 1100 + AllowHeightOverride 1 HeightOverride 620 - Slot LayoutSlot { HorizontalAlign 1 VerticalAlign 1 } + Slot OverlayWidgetSlot { HorizontalAlign 1 VerticalAlign 1 } components { SCR_GameOverScreenContentUIComponent "{6E81CD1BC83BE245}" { } } { FrameWidgetClass { Name "ResultFrame" - Slot AlignableSlot { HorizontalAlign 3 VerticalAlign 3 } + Slot OverlayWidgetSlot { HorizontalAlign 3 VerticalAlign 3 } { TextWidgetClass { Name "GameOver_State" Slot FrameWidgetSlot { Anchor 0 0 1 0 OffsetLeft 20 OffsetTop 0 OffsetRight 20 SizeY 52 OffsetBottom -52 } Color 1 1 1 1 "Font Size" 36 "Min Font Size" 36 Text "Round ended" + FontProperties FontProperties { Font "{EABA4FE9D014CCEF}UI/Fonts/RobotoCondensed/RobotoCondensed_Bold.fnt" } } TextWidgetClass { Name "GameOver_Description" Slot FrameWidgetSlot { Anchor 0 0 1 0 OffsetLeft 20 OffsetTop 58 OffsetRight 20 SizeY 64 OffsetBottom -122 } Color 0.9 0.92 0.94 1 "Font Size" 22 "Min Font Size" 22 Wrap 1 + FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } } TextWidgetClass { Name "StatisticsHeading" Slot FrameWidgetSlot { Anchor 0 0 1 0 OffsetLeft 20 OffsetTop 132 OffsetRight 20 SizeY 36 OffsetBottom -168 } Color 0.9 0.8 0.5 1 "Font Size" 26 "Min Font Size" 26 Text "Mission statistics" + FontProperties FontProperties { Font "{EABA4FE9D014CCEF}UI/Fonts/RobotoCondensed/RobotoCondensed_Bold.fnt" } } ScrollLayoutWidgetClass { Name "StatisticsScroll" diff --git a/docs/evidence/community-statistics-2026-10-30/geometrybefore.log b/docs/evidence/community-statistics-2026-10-30/geometrybefore.log new file mode 100644 index 0000000..d6ec551 --- /dev/null +++ b/docs/evidence/community-statistics-2026-10-30/geometrybefore.log @@ -0,0 +1,13 @@ +14:37:48.098 SCRIPT : ERR SMOKE PASS: community private credential saved +14:37:48.099 SCRIPT : ERR SMOKE PASS: community native credential serialization preserves installation secret +14:37:48.099 SCRIPT : ERR SMOKE PASS: community native JSON roundtrip and current map/result validation +14:37:48.099 SCRIPT : ERR SMOKE PASS: community another map is rejected +14:37:48.241 SCRIPT : ERR SMOKE PASS: community native defeat screen requested +14:37:51.708 SCRIPT : ERR RESULT GEOMETRY: Base_ContentHolder x=0 y=0 width=501 height=225 visible=1 opacity=0.690736 +14:37:51.709 SCRIPT : ERR RESULT GEOMETRY: ERR_RoundResults x=250.5 y=95 width=0 height=35 visible=1 opacity=1 +14:37:51.709 SCRIPT : ERR RESULT GEOMETRY: ResultFrame x=250.5 y=95 width=0 height=35 visible=1 opacity=1 +14:37:51.709 SCRIPT : ERR RESULT GEOMETRY: GameOver_State x=254.667 y=95 width=-8.33334 height=10.8333 visible=1 opacity=1 +14:37:51.709 SCRIPT : ERR RESULT GEOMETRY: StatisticsScroll x=254.667 y=132.083 width=-8.33334 height=-4.58333 visible=1 opacity=1 +14:37:51.709 SCRIPT : ERR RESULT GEOMETRY: RoundStatistics x=254.667 y=132.083 width=-14.1667 height=449.375 visible=1 opacity=1 +14:37:51.710 SCRIPT : ERR SMOKE PASS: community open defeat screen refreshes after late community result +14:37:56.799 SCRIPT : ERR SMOKE COMPLETE: community defeat native credentials, JSON validation and result screen refresh diff --git a/docs/evidence/community-statistics-2026-10-30/geometryfixed.log b/docs/evidence/community-statistics-2026-10-30/geometryfixed.log new file mode 100644 index 0000000..4b092bc --- /dev/null +++ b/docs/evidence/community-statistics-2026-10-30/geometryfixed.log @@ -0,0 +1,19 @@ +14:39:58.721 SCRIPT : ERR SMOKE PASS: community private credential saved +14:39:58.724 SCRIPT : ERR SMOKE PASS: community native credential serialization preserves installation secret +14:39:58.724 SCRIPT : ERR SMOKE PASS: community native JSON roundtrip and current map/result validation +14:39:58.724 SCRIPT : ERR SMOKE PASS: community another map is rejected +14:39:58.841 SCRIPT : ERR SMOKE PASS: community native defeat screen requested +14:40:02.313 SCRIPT : ERR RESULT GEOMETRY: Base_ContentHolder x=0 y=0 width=501 height=225 visible=1 opacity=0.681523 +14:40:02.314 SCRIPT : ERR SMOKE PASS: community Base_ContentHolder has positive rendered dimensions +14:40:02.314 SCRIPT : ERR RESULT GEOMETRY: ERR_RoundResults x=135.917 y=47.9167 width=229.167 height=129.167 visible=1 opacity=1 +14:40:02.314 SCRIPT : ERR SMOKE PASS: community ERR_RoundResults has positive rendered dimensions +14:40:02.315 SCRIPT : ERR RESULT GEOMETRY: ResultFrame x=135.917 y=47.9167 width=229.167 height=129.167 visible=1 opacity=1 +14:40:02.315 SCRIPT : ERR SMOKE PASS: community ResultFrame has positive rendered dimensions +14:40:02.315 SCRIPT : ERR RESULT GEOMETRY: GameOver_State x=140.083 y=47.9167 width=220.833 height=10.8333 visible=1 opacity=1 +14:40:02.315 SCRIPT : ERR SMOKE PASS: community GameOver_State has positive rendered dimensions +14:40:02.315 SCRIPT : ERR RESULT GEOMETRY: StatisticsScroll x=140.083 y=85 width=220.833 height=89.5833 visible=1 opacity=1 +14:40:02.316 SCRIPT : ERR SMOKE PASS: community StatisticsScroll has positive rendered dimensions +14:40:02.316 SCRIPT : ERR RESULT GEOMETRY: RoundStatistics x=140.083 y=85 width=215 height=52.1875 visible=1 opacity=1 +14:40:02.316 SCRIPT : ERR SMOKE PASS: community RoundStatistics has positive rendered dimensions +14:40:02.316 SCRIPT : ERR SMOKE PASS: community open defeat screen refreshes after late community result +14:40:07.386 SCRIPT : ERR SMOKE COMPLETE: community defeat native credentials, JSON validation and result screen refresh diff --git a/docs/evidence/community-statistics-2026-10-30/geometryvictory.log b/docs/evidence/community-statistics-2026-10-30/geometryvictory.log new file mode 100644 index 0000000..a500362 --- /dev/null +++ b/docs/evidence/community-statistics-2026-10-30/geometryvictory.log @@ -0,0 +1,18 @@ +14:42:23.611 SCRIPT : ERR SMOKE PASS: community private credential saved +14:42:23.612 SCRIPT : ERR SMOKE PASS: community native credential serialization preserves installation secret +14:42:23.612 SCRIPT : ERR SMOKE PASS: community native JSON roundtrip and current map/result validation +14:42:23.612 SCRIPT : ERR SMOKE PASS: community another map is rejected +14:42:23.701 SCRIPT : ERR SMOKE PASS: community native victory screen requested +14:42:27.136 SCRIPT : ERR RESULT GEOMETRY: Base_ContentHolder x=0 y=0 width=501 height=225 visible=1 opacity=0.71436 +14:42:27.136 SCRIPT : ERR SMOKE PASS: community Base_ContentHolder has positive rendered dimensions +14:42:27.136 SCRIPT : ERR RESULT GEOMETRY: ERR_RoundResults x=135.917 y=47.9167 width=229.167 height=129.167 visible=1 opacity=1 +14:42:27.136 SCRIPT : ERR SMOKE PASS: community ERR_RoundResults has positive rendered dimensions +14:42:27.137 SCRIPT : ERR RESULT GEOMETRY: ResultFrame x=135.917 y=47.9167 width=229.167 height=129.167 visible=1 opacity=1 +14:42:27.137 SCRIPT : ERR SMOKE PASS: community ResultFrame has positive rendered dimensions +14:42:27.137 SCRIPT : ERR RESULT GEOMETRY: GameOver_State x=140.083 y=47.9167 width=220.833 height=10.8333 visible=1 opacity=1 +14:42:27.137 SCRIPT : ERR SMOKE PASS: community GameOver_State has positive rendered dimensions +14:42:27.137 SCRIPT : ERR RESULT GEOMETRY: StatisticsScroll x=140.083 y=85 width=220.833 height=89.5833 visible=1 opacity=1 +14:42:27.137 SCRIPT : ERR SMOKE PASS: community StatisticsScroll has positive rendered dimensions +14:42:27.137 SCRIPT : ERR RESULT GEOMETRY: RoundStatistics x=140.083 y=85 width=215 height=52.1875 visible=1 opacity=1 +14:42:27.138 SCRIPT : ERR SMOKE PASS: community RoundStatistics has positive rendered dimensions +14:42:27.138 SCRIPT : ERR SMOKE PASS: community open victory screen refreshes after late community result diff --git a/docs/evidence/community-statistics-2026-10-30/isolated-runner.py b/docs/evidence/community-statistics-2026-10-30/isolated-runner.py index 9e0e8bf..be16c80 100644 --- a/docs/evidence/community-statistics-2026-10-30/isolated-runner.py +++ b/docs/evidence/community-statistics-2026-10-30/isolated-runner.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """Frozen local Workbench community-statistics fixture; no live server or installed asset writes.""" from pathlib import Path -import hashlib,json,shutil,subprocess,sys,os,time +import hashlib,json,shutil,subprocess,sys,os,time,re ROOT=Path(__file__).resolve().parents[3] sys.path.insert(0,str(ROOT/'tools')) from source_manifest import addon_manifest @@ -40,8 +40,20 @@ with (profile/'runner-output.log').open('w') as output: result=subprocess.Popen(command,stdout=output,stderr=subprocess.STDOUT) captured=False while result.poll() is None: - if not captured and any('ERR STATS UI READY' in log.read_text(errors='replace') for log in (profile/'logs').glob('*/console.log')): + if not captured and ((profile/'profile/results-ready.json').exists() or any('ERR STATS UI READY' in log.read_text(errors='replace') for log in (profile/'logs').glob('*/console.log'))): + # The owned runner logs its private Gamescope display. Wine may rewrite its + # command line, so /proc project-path matching alone can miss the renderer. + launch=profile/'headless-launch.log' + displays=re.findall(r'Starting Xwayland on (:\d+)',launch.read_text(errors='replace')) if launch.exists() else [] + if displays: + try: + capture=subprocess.run(['import','-display',displays[-1],'-window','root',str(profile/'results-desktop.png')],stdout=subprocess.DEVNULL,stderr=subprocess.PIPE,timeout=5) + (profile/'capture.log').write_bytes(capture.stderr) + captured=capture.returncode==0 + except subprocess.TimeoutExpired: + (profile/'capture.log').write_text('Private display capture timed out.\n') for proc in Path('/proc').iterdir(): + if captured: break if not proc.name.isdigit(): continue try: args=(proc/'cmdline').read_bytes().decode(errors='replace').replace('\\', '/') diff --git a/docs/evidence/community-statistics-2026-10-30/layout-fix-results.json b/docs/evidence/community-statistics-2026-10-30/layout-fix-results.json new file mode 100644 index 0000000..960963e --- /dev/null +++ b/docs/evidence/community-statistics-2026-10-30/layout-fix-results.json @@ -0,0 +1,45 @@ +{ + "cause": "SizeLayout width/height overrides were specified but not enabled. Original root rendered with zero width and child text/scroll areas had negative dimensions.", + "fix": "Enable both size overrides, use overlay slots and explicit fonts for the result heading and description.", + "runs": { + "geometrybefore": { + "geometry": [ + "Base_ContentHolder x=0 y=0 width=501 height=225 visible=1 opacity=0.690736", + "ERR_RoundResults x=250.5 y=95 width=0 height=35 visible=1 opacity=1", + "ResultFrame x=250.5 y=95 width=0 height=35 visible=1 opacity=1", + "GameOver_State x=254.667 y=95 width=-8.33334 height=10.8333 visible=1 opacity=1", + "StatisticsScroll x=254.667 y=132.083 width=-8.33334 height=-4.58333 visible=1 opacity=1", + "RoundStatistics x=254.667 y=132.083 width=-14.1667 height=449.375 visible=1 opacity=1" + ], + "assertions_passed": 6, + "completed": true + }, + "geometryfixed": { + "geometry": [ + "Base_ContentHolder x=0 y=0 width=501 height=225 visible=1 opacity=0.681523", + "ERR_RoundResults x=135.917 y=47.9167 width=229.167 height=129.167 visible=1 opacity=1", + "ResultFrame x=135.917 y=47.9167 width=229.167 height=129.167 visible=1 opacity=1", + "GameOver_State x=140.083 y=47.9167 width=220.833 height=10.8333 visible=1 opacity=1", + "StatisticsScroll x=140.083 y=85 width=220.833 height=89.5833 visible=1 opacity=1", + "RoundStatistics x=140.083 y=85 width=215 height=52.1875 visible=1 opacity=1" + ], + "assertions_passed": 12, + "completed": true + }, + "geometryvictory": { + "geometry": [ + "Base_ContentHolder x=0 y=0 width=501 height=225 visible=1 opacity=0.71436", + "ERR_RoundResults x=135.917 y=47.9167 width=229.167 height=129.167 visible=1 opacity=1", + "ResultFrame x=135.917 y=47.9167 width=229.167 height=129.167 visible=1 opacity=1", + "GameOver_State x=140.083 y=47.9167 width=220.833 height=10.8333 visible=1 opacity=1", + "StatisticsScroll x=140.083 y=85 width=220.833 height=89.5833 visible=1 opacity=1", + "RoundStatistics x=140.083 y=85 width=215 height=52.1875 visible=1 opacity=1" + ], + "assertions_passed": 12, + "completed": false, + "completion_note": "All 12 geometry/text assertions passed. The 10-second capture hold crossed the mission restart before completion. The owned runner was interrupted for cleanup; the fixture hold was restored to 5 seconds." + } + }, + "limitations": "Scripted local Workbench geometry and text checks, not a remote multiplayer or full-resolution visual test. Native runners retain 13 engine asset errors. ImageMagick import failed to capture the private display.", + "publication": "User confirmed Workshop 0.0.127; local publishing manifest version recorded in CHANGELOG.md." +} diff --git a/docs/evidence/community-statistics-2026-10-30/native-fixture.c b/docs/evidence/community-statistics-2026-10-30/native-fixture.c index 1bd6a56..ecadc62 100644 --- a/docs/evidence/community-statistics-2026-10-30/native-fixture.c +++ b/docs/evidence/community-statistics-2026-10-30/native-fixture.c @@ -54,8 +54,18 @@ modded class ERR_GameMode { MenuBase menu = GetGame().GetMenuManager().GetTopMenu(); if (!menu) return; TextWidget text = TextWidget.Cast(menu.GetRootWidget().FindAnyWidget("RoundStatistics")); + foreach (string widgetName : {"Base_ContentHolder", "ERR_RoundResults", "ResultFrame", "GameOver_State", "StatisticsScroll", "RoundStatistics"}) + { + Widget measured = menu.GetRootWidget().FindAnyWidget(widgetName); + if (!measured) continue; + float width, height, x, y; + measured.GetScreenSize(width, height); measured.GetScreenPos(x, y); + PrintFormat("ERR RESULT GEOMETRY: %1 x=%2 y=%3 width=%4 height=%5 visible=%6 opacity=%7", widgetName, x, y, width, height, measured.IsVisible(), measured.GetOpacity()); + if (!ERR_CommunityCheck(width > 0 && height > 0, widgetName + " has positive rendered dimensions")) return; + } if (!ERR_CommunityCheck(text && text.IsVisible() && text.GetText() == ERR_RoundSummary() && text.GetText().Contains("All reporting servers: 7 wins | 3 failures | 70% win rate"), "open TEST_OUTCOME screen refreshes after late community result")) return; Print("ERR STATS UI READY: community TEST_OUTCOME screen"); + JsonSaveContext ready = new JsonSaveContext(); ready.WriteValue("ready", true); ready.SaveToFile("$profile:results-ready.json"); System.MakeScreenshot("$logs:community-TEST_OUTCOME"); m_ERRCommunityTestStage = 3; m_ERRCommunityTestWait = GetWorld().GetWorldTime() + 5000; return; }