Variablen und State Machines: Scope „scene“ #164

Closed
opened 2026-09-19 11:41:51 +02:00 by meleki · 2 comments
Owner

Aus #91 (Entscheidung G: „Scope scene — wird nicht gebaut. Ohne Load scene (#39) ist er zur Laufzeit nicht von global unterscheidbar — also erst mit #39, dann ist er messbar“). #39 ist inzwischen erledigt.

Befund

  • Variablen und State Machines kennen heute local und global (src/core/model/Scope.ts:6). Seit #39 geht beim Szenenwechsel genau der SharedState mit hinüber; alles Lokale wird neu gebaut.
  • Was pro Szene gelten soll (Gegner übrig in diesem Level, Schalter im Level), muss man heute global halten und beim Wechsel von Hand zurücksetzen.

Zu bauen (Vorschlag)

  • Dritter Scope scene: geteilt von allen Behaviors der Szene, beim Laden einer Szene frisch aus den Defaults, beim Wechsel weg.
  • Gilt für Variablen und State Machines, mit denselben Konfliktregeln wie global (#91, A2).
  • Tests: zwei Behaviors teilen den Wert; Load scene setzt ihn zurück; global bleibt dabei erhalten.

Offen (mit Vorschlag)

  1. Zurück in eine schon besuchte Szene: frisch oder alter Stand? Vorschlag: frisch — ein Gedächtnis pro Szene wäre schon Persistenz (siehe #166).
Aus #91 (Entscheidung **G**: „Scope `scene` — wird nicht gebaut. Ohne `Load scene` (#39) ist er zur Laufzeit nicht von `global` unterscheidbar — also erst mit #39, dann ist er messbar“). #39 ist inzwischen erledigt. ## Befund - Variablen und State Machines kennen heute `local` und `global` (`src/core/model/Scope.ts:6`). Seit #39 geht beim Szenenwechsel genau der `SharedState` mit hinüber; alles Lokale wird neu gebaut. - Was pro Szene gelten soll (Gegner übrig in diesem Level, Schalter im Level), muss man heute global halten und beim Wechsel von Hand zurücksetzen. ## Zu bauen (Vorschlag) - Dritter Scope **scene**: geteilt von allen Behaviors der Szene, beim Laden einer Szene frisch aus den Defaults, beim Wechsel weg. - Gilt für Variablen und State Machines, mit denselben Konfliktregeln wie `global` (#91, A2). - Tests: zwei Behaviors teilen den Wert; `Load scene` setzt ihn zurück; `global` bleibt dabei erhalten. ## Offen (mit Vorschlag) 1. **Zurück in eine schon besuchte Szene:** frisch oder alter Stand? Vorschlag: frisch — ein Gedächtnis pro Szene wäre schon Persistenz (siehe #166).
meleki added the new label 2026-09-19 11:41:51 +02:00

vorschlag passt

vorschlag passt
admin added low-priority and removed new labels 2026-09-19 12:31:47 +02:00
admin added this to the Development project 2026-09-19 12:31:50 +02:00
admin moved this to Next in Development on 2026-09-22 09:25:53 +02:00
Author
Owner

Umgesetzt in d7c0b7c, Wiki 9087225.

Was es jetzt gibt

Einen dritten Scope scene: geteilt wie global, aber mit jeder geladenen Szene frisch aus den Deklarationen gebaut. Für State Machines und Variables-Assets, wie oben vorgeschlagen und bestätigt.

  • Variables-Asset: neues Dropdown Scope mit Global (Vorgabe, wie bisher) und Scene. Ein fehlendes Feld heißt global, bestehende Projekte ändern sich nicht.
  • State Machine: das Dropdown hat eine dritte Stufe Scene. Ein fehlendes Feld heißt weiter local.
  • Zurück in eine schon besuchte Szene ist auch frisch (Antwort 1). Es gibt kein Gedächtnis pro Szene.
  • Nach einem Szenenwechsel wird der Startzustand wieder angekündigt, aber nur bei scene-Maschinen: On state entered in der neuen Szene hört ihn. Eine globale Maschine bleibt still, sie hat ihren Zustand nie verlassen.
  • Die Regel steckt in zwei reinen Funktionen in src/core/graph/sharedState.ts (carriedForward, restartedAssets).

Entscheidung ohne Rückmeldung

scene und persistent schließen sich aus (Variante A). Der Auswahldialog dazu wurde abgebrochen, deshalb ist das eine Annahme. Ein Asset mit Scope Scene zeigt den Persistent-Schalter nicht, und der Wechsel auf Scene löscht das Flag (Undo holt es zurück). Durchgesetzt wird das in isPersistent. Soll stattdessen B (beides erlaubt, der Scope gewinnt) oder C (Persistent gewinnt) gelten, ist das an drei Stellen schnell umgestellt.

Tests

./check.sh                      → 144 Files, 2142 Tests, CHECK EXIT 0   (vorher 143 / 2133)
GM_STEPS=32 (frisch)            → ALL PASSED – 17 checks
GM_STEPS=1-3,17,18,26,32,35     → ALL PASSED – 213 checks
  • 9 neue Unit-Tests in tests/core/scene-scope.test.ts.
  • 3 neue e2e-Checks: In 35 wird ein Variables-Asset mit Scope scene beim Szenenwechsel zurückgesetzt. In 32h geprüft: das Dropdown, die Notiz und dass der Persistent-Schalter verschwindet.
  • Gegenproben greifen: Wird restarted ignoriert, fallen 2 Unit-Tests und im Browser der neue Check in 35. Mit der alten Ankündigungsregel fällt 1 Unit-Test, ohne den Scope-Guard in isPersistent ebenfalls 1. Die Originale sind per cmp zurückgeholt.
  • Befund aus dem e2e: clickText('Scene') trifft den Scene-Tab statt den Menüeintrag. Das hat einen Check falsch grün gemacht. Beide Checks laufen jetzt über clickLast.
  • Die Check-Summe 1307 ist gerechnet. Zuletzt hat CI 1293 gemessen, und auf den Lauf zu diesem Commit wurde nicht gewartet.
Umgesetzt in `d7c0b7c`, Wiki `9087225`. ## Was es jetzt gibt Einen dritten Scope **`scene`**: geteilt wie `global`, aber mit jeder geladenen Szene frisch aus den Deklarationen gebaut. Für State Machines **und** Variables-Assets, wie oben vorgeschlagen und bestätigt. - **Variables-Asset:** neues Dropdown *Scope* mit **Global** (Vorgabe, wie bisher) und **Scene**. Ein fehlendes Feld heißt `global`, bestehende Projekte ändern sich nicht. - **State Machine:** das Dropdown hat eine dritte Stufe *Scene*. Ein fehlendes Feld heißt weiter `local`. - **Zurück in eine schon besuchte Szene ist auch frisch** (Antwort 1). Es gibt kein Gedächtnis pro Szene. - **Nach einem Szenenwechsel wird der Startzustand wieder angekündigt**, aber nur bei `scene`-Maschinen: `On state entered` in der neuen Szene hört ihn. Eine globale Maschine bleibt still, sie hat ihren Zustand nie verlassen. - Die Regel steckt in zwei reinen Funktionen in `src/core/graph/sharedState.ts` (`carriedForward`, `restartedAssets`). ## Entscheidung ohne Rückmeldung **`scene` und `persistent` schließen sich aus** (Variante A). Der Auswahldialog dazu wurde abgebrochen, deshalb ist das eine Annahme. Ein Asset mit Scope *Scene* zeigt den Persistent-Schalter nicht, und der Wechsel auf *Scene* löscht das Flag (Undo holt es zurück). Durchgesetzt wird das in `isPersistent`. Soll stattdessen B (beides erlaubt, der Scope gewinnt) oder C (Persistent gewinnt) gelten, ist das an drei Stellen schnell umgestellt. ## Tests ``` ./check.sh → 144 Files, 2142 Tests, CHECK EXIT 0 (vorher 143 / 2133) GM_STEPS=32 (frisch) → ALL PASSED – 17 checks GM_STEPS=1-3,17,18,26,32,35 → ALL PASSED – 213 checks ``` - 9 neue Unit-Tests in `tests/core/scene-scope.test.ts`. - 3 neue e2e-Checks: In **35** wird ein Variables-Asset mit Scope `scene` beim Szenenwechsel zurückgesetzt. In **32h** geprüft: das Dropdown, die Notiz und dass der Persistent-Schalter verschwindet. - **Gegenproben greifen:** Wird `restarted` ignoriert, fallen 2 Unit-Tests und im Browser der neue Check in 35. Mit der alten Ankündigungsregel fällt 1 Unit-Test, ohne den Scope-Guard in `isPersistent` ebenfalls 1. Die Originale sind per `cmp` zurückgeholt. - Befund aus dem e2e: `clickText('Scene')` trifft den Scene-Tab statt den Menüeintrag. Das hat einen Check falsch grün gemacht. Beide Checks laufen jetzt über `clickLast`. - Die Check-Summe **1307** ist gerechnet. Zuletzt hat CI 1293 gemessen, und auf den Lauf zu diesem Commit wurde nicht gewartet.
admin moved this to Done in Development on 2026-09-23 06:16:57 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#164