Fix blank mission results panel; record Workshop 0.0.127
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-10-30 14:48:26 +01:00
parent 5453159867
commit 213c31dfb2
8 changed files with 131 additions and 5 deletions
+5 -1
View File
@@ -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
@@ -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"
@@ -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
@@ -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
@@ -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
@@ -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('\\', '/')
@@ -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."
}
@@ -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;
}