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 einemSet 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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Tetris Game mit Structs neu bauen
...und mit neuen
Get variables/Set variablesnodeGebaut (2026-09-10). Beides, in zwei Durchgängen: erst die Structs, dann die Plural-Knoten.
shapes{x, y}-Bündel((shape·4+rot)·8 + corner·2), zweimal gelesen((shape·4+rot)·4 + corner), einmalnext-moveclear-linespieceund der Kandidatnextsind Structs aus shape/rot/x/y.Next movegibt einen ganzenKandidaten zurück,
Fitsbeurteilt ihn, der Master übernimmt ihn mit einemSet variable.Jeder Bewegungsstrang packt nur das Feld, das er ändert (
Pack{rot}) — „dasselbe Teil, eine Reihetiefer" 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 mitGegenprobe abgesichert:
Set variablesschreibt je Port mitwriteTyped, genau wie der Einzelknoten. EinPack{rot}wird deshalb weiterhin permergeStructeingemischt statt das Bündel zuüberschreiben. Ohne das hätte Drehen die anderen drei Felder gelöscht.
dataCache,geleert je Schleifenrunde). Ein
Get variablesdarf deshalb keine Schreibung einer seinerVariablen überspannen — sonst liest der spätere Verbraucher den Wert von davor. Deshalb sind
grid/outgridinclear-linesweiterhin zwei Knoten, undtake/keepbleiben getrennt.Die Cache-Regel ist im Spiel nicht messbar: eine absichtliche Verletzung ließ den Smoke grün,
weil
OnUpdatejeden Frame neu liest und der Fehler sich einen Frame später selbst heilt. DerUnit-Test fällt dagegen sauber (
py: 7statt1).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.mdbeim Umzug auf das Issue-System (2026-09-12).0449218— Let a variable declare struct fieldsfe3c63c— Collapse Tetris' variable clusters, and give the long runs a homef60358cLet a list hold structs, and read or write variables in bundles