Tetris mit structs neu bauen #23

Closed
opened 2026-09-12 15:03:54 +02:00 by admin · 0 comments

Tetris Game mit Structs neu bauen
...und mit neuen Get variables / Set variables node


Gebaut (2026-09-10). Beides, in zwei Durchgängen: erst die Structs, dann die Plural-Knoten.

vorher jetzt
shapes 224 lose Zahlen 112 {x, y}-Bündel
Zellindex ((shape·4+rot)·8 + corner·2), zweimal gelesen ((shape·4+rot)·4 + corner), einmal
deklarierte Behavior-Ports 49 35
Variablen im Master 18 13
Master-Graph 84 Knoten / 94 Kanten 44 / 64
next-move 44 Knoten 30
clear-lines 29 Knoten 23

piece und der Kandidat next sind Structs aus shape/rot/x/y. Next move gibt einen ganzen
Kandidaten zurück, Fits beurteilt ihn, der Master übernimmt ihn mit einem Set variable.
Jeder Bewegungsstrang packt nur das Feld, das er ändert (Pack{rot}) — „dasselbe Teil, eine Reihe
tiefer" ist dadurch wörtlich ein Feld.

Zwei Verträge, an denen die Zusammenlegung hängt

Beide gemessen, beide als Unit-Test gepinnt (tests/core/variable-ports.test.ts), beide mit
Gegenprobe abgesichert:

  • Set variables schreibt je Port mit writeTyped, genau wie der Einzelknoten. Ein
    Pack{rot} wird deshalb weiterhin per mergeStruct eingemischt statt das Bündel zu
    überschreiben. Ohne das hätte Drehen die anderen drei Felder gelöscht.
  • Ein Datenknoten wird einmal pro Puls ausgewertet und behält die Antwort (dataCache,
    geleert je Schleifenrunde). Ein Get variables darf deshalb keine Schreibung einer seiner
    Variablen überspannen — sonst liest der spätere Verbraucher den Wert von davor. Deshalb sind
    grid/outgrid in clear-lines weiterhin zwei Knoten, und take/keep bleiben getrennt.

Die Cache-Regel ist im Spiel nicht messbar: eine absichtliche Verletzung ließ den Smoke grün,
weil OnUpdate jeden Frame neu liest und der Fehler sich einen Frame später selbst heilt. Der
Unit-Test fällt dagegen sauber (py: 7 statt 1).

Was bewusst nicht passiert ist

Das Brett bleibt eine flache Zahlenliste. -1/Formnummer ist bereits die kompakte Kodierung;
ein {shape}-Struct pro Zelle wären 200 Bündel für ein einziges Feld.

Eine Listen-Variable kann ihre Item-Art im Editor nicht wählen — eine Liste aus Structs
entsteht heute nur aus einer Projektdatei. Steht in struct-und-listen-restposten.md.


Übernommen aus todo-notes/done/tetris-mit-structs-neu-bauen.md beim Umzug auf das Issue-System (2026-09-12).

  • Angelegt: 2026-09-10 · 0449218 — Let a variable declare struct fields
  • Abgeschlossen: 2026-09-10 · fe3c63c — Collapse Tetris' variable clusters, and give the long runs a home
  • Commits dazwischen: f60358c Let a list hold structs, and read or write variables in bundles
  • Gemeldet von: admin
Tetris Game mit Structs neu bauen ...und mit neuen `Get variables` / `Set variables` node --- **Gebaut (2026-09-10).** Beides, in zwei Durchgängen: erst die Structs, dann die Plural-Knoten. | | vorher | jetzt | |---|---|---| | `shapes` | 224 lose Zahlen | 112 `{x, y}`-Bündel | | Zellindex | `((shape·4+rot)·8 + corner·2)`, zweimal gelesen | `((shape·4+rot)·4 + corner)`, einmal | | deklarierte Behavior-Ports | 49 | 35 | | Variablen im Master | 18 | 13 | | Master-Graph | 84 Knoten / 94 Kanten | 44 / 64 | | `next-move` | 44 Knoten | 30 | | `clear-lines` | 29 Knoten | 23 | `piece` und der Kandidat `next` sind Structs aus shape/rot/x/y. `Next move` gibt einen ganzen Kandidaten zurück, `Fits` beurteilt ihn, der Master übernimmt ihn mit *einem* `Set variable`. Jeder Bewegungsstrang packt nur das Feld, das er ändert (`Pack{rot}`) — „dasselbe Teil, eine Reihe tiefer" ist dadurch wörtlich ein Feld. ## Zwei Verträge, an denen die Zusammenlegung hängt Beide gemessen, beide als Unit-Test gepinnt (`tests/core/variable-ports.test.ts`), beide mit Gegenprobe abgesichert: - **`Set variables` schreibt je Port mit `writeTyped`**, genau wie der Einzelknoten. Ein `Pack{rot}` wird deshalb weiterhin per `mergeStruct` eingemischt statt das Bündel zu überschreiben. Ohne das hätte Drehen die anderen drei Felder gelöscht. - **Ein Datenknoten wird einmal pro Puls ausgewertet und behält die Antwort** (`dataCache`, geleert je Schleifenrunde). Ein `Get variables` darf deshalb keine Schreibung einer seiner Variablen überspannen — sonst liest der spätere Verbraucher den Wert von davor. Deshalb sind `grid`/`outgrid` in `clear-lines` weiterhin zwei Knoten, und `take`/`keep` bleiben getrennt. Die Cache-Regel ist im **Spiel** nicht messbar: eine absichtliche Verletzung ließ den Smoke grün, weil `OnUpdate` jeden Frame neu liest und der Fehler sich einen Frame später selbst heilt. Der Unit-Test fällt dagegen sauber (`py: 7` statt `1`). ## Was bewusst nicht passiert ist Das **Brett bleibt eine flache Zahlenliste**. `-1`/Formnummer ist bereits die kompakte Kodierung; ein `{shape}`-Struct pro Zelle wären 200 Bündel für ein einziges Feld. Eine **Listen-Variable kann ihre Item-Art im Editor nicht wählen** — eine Liste aus Structs entsteht heute nur aus einer Projektdatei. Steht in `struct-und-listen-restposten.md`. --- *Übernommen aus `todo-notes/done/tetris-mit-structs-neu-bauen.md` beim Umzug auf das Issue-System (2026-09-12).* - **Angelegt:** 2026-09-10 · `0449218` — Let a variable declare struct fields - **Abgeschlossen:** 2026-09-10 · `fe3c63c` — Collapse Tetris' variable clusters, and give the long runs a home - **Commits dazwischen:** `f60358c` Let a list hold structs, and read or write variables in bundles - **Gemeldet von:** admin
admin added the todo-note label 2026-09-12 15:03:54 +02:00
admin closed this issue 2026-09-12 15:03:54 +02:00
admin added this to the Development project 2026-09-13 13:43:26 +02:00
admin moved this to Done in Development on 2026-09-13 13:44:43 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#23