Das Konfetti hat ein halbes Jahr lang niemand gesehen
· spiel · gestaltung
Ein zugeklappter Kasten ist das einzige Ereignis, das dieses Spiel kennt. Es gibt keine Punkte zu sammeln, keine Stufen, keinen Fortschritt — nur neun Klappen, die am Ende liegen oder eben nicht. Bis zu diesem Tag war genau dieser Moment die schwächste Stelle im ganzen Spiel: ein Tipp zu viel, ein unsichtbarer Effekt, ein geliehener Klang.
Der Kasten wartete im Siegmoment
Kombinationen bestätigt man mit einem Tipp auf die Würfel. Das ist richtig, solange man sich noch korrigieren könnte. Beim letzten Zug kann man das nicht mehr — er räumt den Kasten leer, es gibt nichts zu überlegen.
Der Kasten stand also im Siegmoment mit zwei aufrechten, goldenen Klappen da und wartete auf eine Bestätigung, deren einzige Alternative das Nichtstun war.
KlappenRegeln.ist_schlusszug() entscheidet das jetzt im Kern: gültig und
deckt die letzten offenen Klappen. Das Brett führt ihn sofort aus — auch als
Kombination, auch bei „plus und minus“ mit zwei Zielzahlen.
Und dann suchte ich das Konfetti
Im Code stand _ende_konfetti(): zwölf ColorRect, die über den Kasten
fallen. Geschrieben irgendwann im Frühjahr. Ich habe eine Runde gewonnen, um
es mir anzusehen, und nichts gesehen. Zweite Runde, drittes Mal. Nichts.
Es war dreifach kaputt:
- Die Rechtecke hingen an
_ende_overlay— und_ergebnis_spaeter()setzt genau dieses Overlay in der Zeile darauf auf unsichtbar und zeigt es erst 2,4 Sekunden später. Die Tweens liefen 1,5 Sekunden und räumten sich selbst weg. Alles hinter einem unsichtbaren Elternknoten. - Das Overlay ist ein
VBoxContainer. Der überschreibt jede gesetzteposition— die Rechtecke wären ohnehin dort gelandet, wo der Container sie hinlegt, nicht dort, wo sie hinsollten. - Gerechnet wurde gegen die volle Bildgrösse. Das Overlay ist ein schmaler Streifen am unteren Rand.
Jeder dieser drei Fehler allein hätte gereicht. Zusammen haben sie ein halbes Jahr überlebt — weil ein Effekt, den man nicht sieht, sich nicht von einem bescheidenen Effekt unterscheiden lässt. Niemand hat je gedacht „da fehlt was“. Man denkt „ach, dezent“.
Nicht repariert — ersatzlos gestrichen. Konfetti sind fremde bunte Rechtecke, die über ein Holzbild fallen. Sie haben mit diesem Spiel nichts zu tun; sie wären austauschbar. Jedes Spiel hat Konfetti.
Gefeiert wird jetzt mit dem Kasten selbst
Kasten3D.siegwelle() lässt alle Klappen der Reihe nach 42° hochkommen und
zurück ins Holz schlagen — eine Welle von der 1 zur höchsten, die dort umkehrt
und zurückläuft. Achtzehn Schläge, rund 1,9 Sekunden.
Keine neue Geometrie, keine fremden Rechtecke über dem Bild: dieselben Scharniere und dieselbe Bewegung wie beim Zuklappen, nur grösser und hintereinander.
| Zutat | war schon da für | tut jetzt zusätzlich |
|---|---|---|
| Klappen-Scharniere | Zuklappen, Auswahl, Tipp | die Welle hin und zurück |
| Fall-Tween mit Aufprall | eine fallende Klappe | achtzehn, im Takt |
KlappenKlang.holz() |
der Anschlag beim Zug | Tonleiter hinauf und herunter |
der Synth in klang.gd |
Klappe und Würfel | eine dritte Stimme: der Marimba-Stab |
Im Bild ist nichts neu ausser der Reihenfolge. Im Ton ist eine einzige
Stimme dazugekommen, und die entsteht mit demselben Verfahren wie der Anschlag,
nur mit Tonhöhe: ein Marimba-Stab, Teiltöne 1 : 3,9 : 10,4. Alle zehn Noten
sind ein synthetisierter Stab, über pitch_scale versetzt — das kürzt die
hohen Töne von selbst und verlängert den Bass unter dem Schlusston.
Die Schläge der Welle laufen davor eine Dur-Pentatonik hinauf: die Klappen sind der Anlauf, der erste Ton die Landung. Sie setzt am Umkehrpunkt ein, der Rückweg trommelt unter ihr mit. Weil der Rückweg dieselben Klappen rückwärts nimmt, fällt die Tonleiter von selbst wieder ab — ein Bogen, kein Rutscher.
Bei „ruhige Bewegung“ bleibt der Kasten still, die Schläge kommen trotzdem. Der Rhythmus ist die Feier, nicht das Zappeln.
Wie oft das überhaupt vorkommt
Bevor entschieden war, wie gross die Feier sein darf, musste feststehen, wie selten sie ist. 20 000 simulierte Partien je Aufstellung, gespielt nach der Strategie, die auch der Tipp benutzt:
| Aufstellung | Sieg | ≤ 2 Punkte | Median |
|---|---|---|---|
| 1–9 · 2 Würfel | 6,8 % (1 von 14) | 12 % | 10 |
| 1–10 · 2 Würfel | 3,9 % (1 von 25) | 6 % | 16 |
| 1–12 · 3 Würfel | 6,2 % (1 von 16) | 10 % | 12 |
| 1–12 · 2 Würfel | 0,37 % (1 von 270) | 0,6 % | 35 |
Etwa alle vierzehn Runden fällig. Selten genug für etwas Grosses, häufig genug, dass es nicht im Weg stehen darf. Deshalb dauert die Feier zwei Sekunden und keine fünf. Ohne diese Tabelle wäre das eine Geschmacksfrage geblieben.
Die Prüfungen wurden absichtlich rot gemacht
Alle drei neuen Zusicherungen sind gebrochen worden, bevor sie stehen bleiben
durften: Regel zurückgedreht → „Schlusszug fiel nicht von selbst“;
siegwelle() entkernt → „0 Schläge statt 18“; Hub auf 0,4° gedreht → „Klappen
hoben sich kaum“.
Zwei Feinheiten, die dabei herauskamen:
- Der UI-Lauf schreibt jede Klappe mit ihrer Richtung mit und vergleicht die ganze Folge (0…8 hinauf, 8…0 zurück). „18-mal geklopft“ allein wäre auch von zweimal demselben Hinweg erfüllt.
- Der Hub wird gegen eine feste Untergrenze von 8° geprüft, nicht gegen
WELLE_HUBselbst. Sonst zöge die Prüfung mit und bestätigte brav eine Feier, die keiner sieht — also genau den Fehler, aus dem dieser ganze Eintrag entstanden ist.
Das ist die Lehre, und sie ist unangenehm allgemein: ein Riegel, der sich am eigenen Sollwert misst, prüft gar nichts. Er ist immer grün, auch wenn der Sollwert auf null steht.
Der Prüfstein für jede weitere Idee an dieser Stelle lautet deshalb nicht „sieht das gut aus?“, sondern „könnte der Gegenstand das?”