Skip to content

feat(presentation): Pausemenü und ein Riegel für modale Oberflächen (#105, #102) - #113

Merged
cubetribe merged 2 commits into
mainfrom
feat/s21-pause-and-gate
Aug 18, 2026
Merged

feat(presentation): Pausemenü und ein Riegel für modale Oberflächen (#105, #102)#113
cubetribe merged 2 commits into
mainfrom
feat/s21-pause-and-gate

Conversation

@cubetribe

Copy link
Copy Markdown
Collaborator

Schliesst #105 und #102. Paket 21.8 — das Beta-Tor: ohne sauberes Verlassen einer Runde findet kein Betatest statt.

Der Riegel ist die UI-Wurzel, kein Katalog

SetGameplayLayerActive blendete bisher zwei namentlich genannte Komponenten aus und verliess sich im Docstring darauf, dass jede andere HUD-Komponente "ohne laufendes Match früh zurückkehrt". Auf dem Rückweg stimmt das nicht: ReturnToMenu pausiert das Match, es beendet es nicht — Runner, Entitäten und Auswahl leben weiter, und die Baukarte zeichnet über das Menü.

Jetzt schaltet die Methode das GameObject, auf das der Szenengenerator ohnehin alle In-Match-Komponenten legt. Damit ist jede künftige HUD-Komponente automatisch abgedeckt, ohne je genannt zu werden — die Sorge im dortigen Docstring ist strukturell beantwortet statt bestätigt. Das Kamera-Rig bleibt ein eigener Schalter; es liegt auf der Main Camera, nicht auf der Wurzel.

Für den Pausezustand ein Flag, denn dort bleibt die Wurzel an

ModalSurfaceLink (Nova.Gameplay, nach dem HudPointerLink-Vorbild — keine neue Assembly-Kante) publiziert pro Frame "ein modales Fenster besitzt die Eingabe", ausdrücklich nicht "das Match läuft nicht". Die drei Zustände bleiben getrennt: kein Match, pausiert, gelaufen-und-zurück.

Kein Latch mit Gedächtnis, und OnDisable setzt zurück: ein hängendes true wäre ein Eingabe-Deadlock für den Rest der Sitzung — keine Auswahl, keine Befehle, kein Kamerarand, und keine laufende Komponente mehr, die es je klären könnte.

Drei Fehler fallen damit mit

  1. Der Ausstiegsklick armierte den Fehler selbst. Die modalen Panels standen nicht in IsPointerOverHud; ein Klick auf "Hauptmenü" lief zuerst durch die Auswahl-Logik und markierte eine Einheit hinter dem Panel — genau die Auswahl, die danach über dem Menü stand.
  2. Ein armierter Bau-Ghost überlebte den Menüwechsel und wanderte in die nächste Runde. Jetzt doppelt geräumt: beim Ingress-Rebind und beim Öffnen eines Modals.
  3. Die P-Pause hatte keinerlei Eingabe-Riegel. Hotkeys und Harvester-Eskorte feuerten in den gestoppten Kernel; die Befehle stauten sich bis zum Fortsetzen.

Das Pausemenü

ESC oder P. Fortsetzen, Zum Hauptmenü, Spiel beenden. ESC ist geschichtet: bricht erst eine armierte Geste ab, öffnet das Menü beim nächsten Druck — abgesichert über die vorhandene DefaultExecutionOrder(-200) von RtsDeviceInput. Resultat- und Netzwerk-Panel schlagen das Pausemenü; es stapelt sich nicht darauf.

"Einstellungen" ist bewusst nur ein Hinweis auf das Hauptmenü. Die Bestandsmaske hängt fest im Menü-Screen samt Vollbild-Key-Art; sie mitten im Match zu zeigen hiesse, den ganzen Menü-Screen über das Spiel zu legen. Lieber ein Eintrag weniger als eine zweite Maske, die auseinanderdriftet.

Die Szene ist mit drin — und das ist wesentlich

Bootstrap.unity lag vom 2026-08-08 bis heute unverändert im Repo, während der Generator sich dreimal bewegt hatte. Eine nur im Generator verdrahtete Komponente ist im Spiel nicht vorhanden — Code gemergt, CI grün, auf dem Schirm nichts. Die Szene ist einmal neu erzeugt und deckt jetzt alle vier Generator-Änderungen des Tages ab; geprüft, dass PauseMenuHud, VersionBadge und BuildZoneOverlayView darin stehen.

Der neue PauseMenuTests pinnt genau diese Falle plus den Deadlock-Fall.

Nachweis

  • Unity EditMode 605/605 grün
  • Unity PlayMode 12/13 — der eine rote (NetworkPanel_ValidatesMasks…) ist auf main bereits rot, Gegenprobe gefahren, siehe PlayMode-Test NetworkPanel_ValidatesMasks… ist auf main rot — und niemand sieht es, weil die CI keine Unity-Tests fährt #110
  • dotnet test tools/Nova.SimRunner.Tests726/726 grün
  • FieldReservePickTests angepasst: er startet das Match am Menü vorbei, wobei die HUD-Wurzel aus bleibt und RtsDeviceInput nie ein Update läuft. Der Test schaltet sie jetzt selbst ein und behauptet vorher, dass sie aus ist. Das Produktverhalten ist richtig und unverändert — eine Null-Absicherung im Produktivcode hätte echte Verdrahtungsfehler verschluckt

Schreibhoheit

Scripts/Presentation/UI/, Scripts/Gameplay/UI/, Assets/_Project/Editor/ — Maintainer-Strang. DebugHud.cs unangetastet und nachgesehen (#107 geschlossen).

🤖 Generated with Claude Code

cubetribe and others added 2 commits August 18, 2026 14:35
#105, #102)

Paket 21.8, das Beta-Tor: bisher kam ein Spieler aus einer laufenden Runde
nicht heraus, und wer ueber das Matchende ins Hauptmenue zurueckging, sah das
Cockpit ueber dem Menue stehen.

DER RIEGEL IST DIE UI-WURZEL, KEIN KATALOG. SetGameplayLayerActive schaltet
jetzt das GameObject, auf das der Szenengenerator ohnehin alle In-Match-
Komponenten legt, statt zweier namentlich genannter. Damit ist jede kuenftige
HUD-Komponente automatisch abgedeckt, ohne je genannt zu werden — die Sorge
im dortigen Docstring, ein Katalog verrotte mit der naechsten Komponente, ist
damit strukturell beantwortet statt bestaetigt. Das Kamera-Rig bleibt ein
eigener Schalter, es liegt auf der Main Camera und nicht auf der Wurzel.

FUER DEN PAUSEZUSTAND EIN FLAG, denn dort bleibt die Wurzel an. ModalSurfaceLink
publiziert pro Frame 'ein modales Fenster besitzt die Eingabe' — ausdruecklich
nicht 'das Match laeuft nicht', die drei Zustaende bleiben getrennt. Kein Latch
mit Gedaechtnis: ein haengendes true waere ein Eingabe-Deadlock, deshalb setzt
OnDisable zurueck.

Drei Fehler aus dem Audit fallen damit mit:
- Der Klick auf 'Hauptmenue' selektierte eine Einheit HINTER dem Panel und
  erzeugte damit selbst die Auswahl, die danach ueber dem Menue stand
- Ein armierter Bau-Ghost ueberlebte den Menuewechsel und wanderte in die
  naechste Runde
- Die P-Pause hatte keinerlei Eingabe-Riegel: Hotkeys und Harvester-Eskorte
  feuerten in den gestoppten Kernel

'Einstellungen' ist bewusst nur ein Hinweis auf das Hauptmenue statt einer
zweiten, driftenden Maske: die Bestandsmaske haengt fest im Menue-Screen samt
Key Art.

DebugHud unangetastet; nachgesehen und verhaltensgleich (siehe #107).

Umsetzung durch den Kimi-K3-Worker.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…e nachziehen

Bootstrap.unity neu erzeugt — deckt jetzt alle vier Generator-Aenderungen des
Tages ab (21.2, Versionsanzeige, Baubereich-Overlay, Pausemenue). Geprueft:
PauseMenuHud, VersionBadge und BuildZoneOverlayView sind in der Szene.

Neuer PlayMode-Test PauseMenuTests pinnt die zwei Fallen, die heute wirklich
zugeschnappt sind: dass das Pausemenue ueberhaupt in der committeten Szene
landet (sie war einmal acht Tage stale, waehrend der Generator dreimal zog),
und dass ModalSurfaceLink beim Weg ins Hauptmenue kein haengendes true
hinterlaesst — das waere ein Eingabe-Deadlock ohne laufende Komponente, die
ihn noch loesen koennte.

FieldReservePickTests angepasst: er startet das Match direkt an
MainMenuController vorbei, und seit dem Wurzel-Schalter ist RtsDeviceInput
dabei inaktiv — kein Update, kein gebundener Dispatcher, Null-Referenz in
jedem Pick-Pfad. Der Test schaltet die Wurzel jetzt selbst ein und behauptet
vorher, dass sie aus ist, damit die Zeile ehrlich bleibt, falls der Schalter
je woanders hinwandert. Das Produktverhalten ist richtig und bleibt
ungeaendert; eine Null-Absicherung im Produktivcode haette echte
Verdrahtungsfehler verschluckt.

Nachweis: EditMode 605/605, PlayMode 12/13 — der eine rote ist
NetworkPanel_ValidatesMasks..., auf main bereits rot (#110).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@cubetribe
cubetribe merged commit 31fdeba into main Aug 18, 2026
6 checks passed
@cubetribe
cubetribe deleted the feat/s21-pause-and-gate branch August 18, 2026 12:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant