Grilling: Auslöse-System für Ultimate und Card-Fähigkeiten #12

Closed
opened 2026-08-10 11:04:52 +00:00 by RDietermann · 1 comment
Owner

Part of #1
Blocked by: #6

Ultimate (#9) und Card-Fähigkeiten (#11) feuern beide automatisch nach Regel. Es soll ein Auslöse-System geben, nicht zwei. Dieses System hat bisher kein Ticket — es steht als Nebensatz in #9 und #11 und würde bei #10 erfunden statt entschieden.

Warum es ein eigenes Ticket verdient: die Stat-Pipeline aus #6 ist an einem Nachmittag umgebaut — ein Turm, sechs bis acht Stats, zwei Ebenen. Das Auslöse-System dagegen sitzt zwischen Ultimate, jeder Fähigkeiten-Card und dem gesamten Kern-Gefühl „Idle". Es ist das Stück, das man später am schwersten rausoperiert, und genau deshalb gehört es entschieden, bevor die erste Fähigkeit gebaut wird.

Der Kern

Der Slice hat keinen Knopf. Der Spieler stellt ein, der Turm handelt. Damit ist die Auslöse-Regel das Gameplay der Fähigkeiten — sie ersetzt vollständig, was in anderen Spielen der Spieler entscheidet. Eine Ultimate, die feuert, sobald der Cooldown abgelaufen ist, fühlt sich dumm an. Eine, die auf den richtigen Moment wartet, fühlt sich klug an. Der Unterschied ist die Regel, und die ist Design, kein Implementierungsdetail.

  • Woraus besteht eine Bedingung? Cooldown allein, oder auch Weltzustand (N Gegner in Reichweite, Turm-HP unter X, Boss am Leben)? Wenn Weltzustand: welche Prädikate gibt es, und wie teuer sind sie bei 10 000 Gegnern jeden Frame?
  • Wer wertet aus? Ein System, das über alle aktiven Fähigkeiten läuft, oder ein System pro Fähigkeit? Bei fünf Card-Slots plus Ultimate sind das maximal sechs — die Frage ist nicht Performance, sondern wo die Regel steht und wie man sie liest.
  • Was passiert bei Konflikt? Zwei Fähigkeiten wollen im selben Frame feuern. Egal, oder Priorität? Gibt es eine globale Sperre, damit nicht alles gleichzeitig losgeht?
  • Ist die Regel sichtbar oder einstellbar? Wenn der Spieler nur zuschaut, muss er wenigstens verstehen, warum etwas gefeuert hat — sonst wirkt es zufällig. Das ist eine UI-Frage mit Rückwirkung auf das Datenmodell.
  • Wie hängt das an #6? Eine Fähigkeit ist laut Council-Verdikt eine Component, die an den Turm geheftet wird. Trägt sie ihre Auslöse-Bedingung selbst, oder liegt die getrennt?

Randbedingung aus der Cap-Entscheidung

Bedingungen, die den Weltzustand abfragen („N Gegner in Reichweite"), laufen gegen bis zu 10 000 Entities. Bei sechs Fähigkeiten jeden Frame ist das kein Selbstläufer — #4 hat gemessen, dass tower_fire mit seinem naiven O(n)-Zielscan der nächste Hotspot nach dem Rendering ist. Eine Auslöse-Bedingung, die dasselbe nochmal tut, verdoppelt ihn. Die Antwort ist wahrscheinlich, den Reichweiten-Scan einmal zu machen und das Ergebnis zu teilen — aber das ist eine Architektur-Entscheidung, keine Optimierung von später.

Fertig, wenn die Form der Auslöse-Bedingung festgelegt ist, das Konflikt-Verhalten benannt ist und klar ist, wo die Regel im Datenmodell lebt — sodass die Spec (#10) sie nur noch mit konkreten Fähigkeiten füllen muss.

Part of #1 Blocked by: #6 Ultimate (#9) und Card-Fähigkeiten (#11) feuern beide **automatisch nach Regel**. Es soll **ein** Auslöse-System geben, nicht zwei. Dieses System hat bisher kein Ticket — es steht als Nebensatz in #9 und #11 und würde bei #10 erfunden statt entschieden. Warum es ein eigenes Ticket verdient: die Stat-Pipeline aus #6 ist an einem Nachmittag umgebaut — ein Turm, sechs bis acht Stats, zwei Ebenen. Das Auslöse-System dagegen sitzt zwischen Ultimate, jeder Fähigkeiten-Card und dem gesamten Kern-Gefühl „Idle". Es ist das Stück, das man später am schwersten rausoperiert, und genau deshalb gehört es entschieden, bevor die erste Fähigkeit gebaut wird. ## Der Kern Der Slice hat keinen Knopf. Der Spieler stellt ein, der Turm handelt. Damit ist die Auslöse-Regel **das** Gameplay der Fähigkeiten — sie ersetzt vollständig, was in anderen Spielen der Spieler entscheidet. Eine Ultimate, die feuert, sobald der Cooldown abgelaufen ist, fühlt sich dumm an. Eine, die auf den richtigen Moment wartet, fühlt sich klug an. Der Unterschied ist die Regel, und die ist Design, kein Implementierungsdetail. - **Woraus besteht eine Bedingung?** Cooldown allein, oder auch Weltzustand (N Gegner in Reichweite, Turm-HP unter X, Boss am Leben)? Wenn Weltzustand: welche Prädikate gibt es, und wie teuer sind sie bei 10 000 Gegnern jeden Frame? - **Wer wertet aus?** Ein System, das über alle aktiven Fähigkeiten läuft, oder ein System pro Fähigkeit? Bei fünf Card-Slots plus Ultimate sind das maximal sechs — die Frage ist nicht Performance, sondern wo die Regel steht und wie man sie liest. - **Was passiert bei Konflikt?** Zwei Fähigkeiten wollen im selben Frame feuern. Egal, oder Priorität? Gibt es eine globale Sperre, damit nicht alles gleichzeitig losgeht? - **Ist die Regel sichtbar oder einstellbar?** Wenn der Spieler nur zuschaut, muss er wenigstens *verstehen*, warum etwas gefeuert hat — sonst wirkt es zufällig. Das ist eine UI-Frage mit Rückwirkung auf das Datenmodell. - **Wie hängt das an #6?** Eine Fähigkeit ist laut Council-Verdikt eine Component, die an den Turm geheftet wird. Trägt sie ihre Auslöse-Bedingung selbst, oder liegt die getrennt? ## Randbedingung aus der Cap-Entscheidung Bedingungen, die den Weltzustand abfragen („N Gegner in Reichweite"), laufen gegen bis zu 10 000 Entities. Bei sechs Fähigkeiten jeden Frame ist das kein Selbstläufer — #4 hat gemessen, dass `tower_fire` mit seinem naiven O(n)-Zielscan der nächste Hotspot nach dem Rendering ist. Eine Auslöse-Bedingung, die dasselbe nochmal tut, verdoppelt ihn. Die Antwort ist wahrscheinlich, den Reichweiten-Scan **einmal** zu machen und das Ergebnis zu teilen — aber das ist eine Architektur-Entscheidung, keine Optimierung von später. **Fertig, wenn** die Form der Auslöse-Bedingung festgelegt ist, das Konflikt-Verhalten benannt ist und klar ist, wo die Regel im Datenmodell lebt — sodass die Spec (#10) sie nur noch mit konkreten Fähigkeiten füllen muss.
RDietermann added the wayfinder:grilling label 2026-08-10 11:04:52 +00:00
Author
Owner

Entschieden.

Frage Entscheidung
Bedingung Cooldown UND ein Weltzustand — z. B. „N Gegner in Reichweite". Kein reiner Timer.
Einstellbar Nein. Jede Fähigkeit bringt ihre Bedingung mit; der Spieler wählt nur über das Loadout.
Konflikt Alle feuern. Keine Sperre, keine Priorität.
Sichtbarkeit Cooldown-Anzeige in einem eigenen Ultimate-Tab neben den Shops.

Was daraus folgt

Der Reichweiten-Scan wird einmal gemacht und geteilt. Das ist keine Optimierung für später, sondern die Bedingung, unter der diese Entscheidung überhaupt tragfähig ist. #4 hat gemessen, dass tower_fire mit seinem naiven O(n)-Zielscan der nächste Hotspot nach dem Rendering ist — bei 10 000 Gegnern und bis zu sechs Fähigkeiten, die jeweils „N Gegner in Reichweite" prüfen, wäre das derselbe Scan siebenmal pro Frame. Ein System ermittelt den Reichweiten-Zustand, alle Auslöse-Bedingungen und tower_fire lesen das Ergebnis.

„Alle feuern" ist bewusst gewählt, nicht vergessen. Bei maximal sechs gleichzeitigen Fähigkeiten ist ein gemeinsamer Auslöser kein Balancing-Problem, sondern ein Belohnungsmoment. Sollte sich später zeigen, dass der Bildschirm unlesbar wird, ist eine globale Sperre nachrüstbar — sie ändert nichts am Datenmodell, nur am auswertenden System.

Fest verdrahtete Bedingungen bleiben trotzdem Daten. Die Bedingung gehört laut ADR-0002 zur Fähigkeits-Component und kommt wie alle Zahlen aus Res<Balance>. Sie im Code zu vergraben wäre ein Verstoß gegen ADR-0001. Damit ist „später einstellbar machen" ohnehin nur noch UI-Arbeit, ohne dass wir das jetzt bauen.

Eine Entscheidung, die hier zusätzlich gefallen ist

Die Sichtbarkeitsantwort legt nebenbei fest, dass der Slice eine tab-basierte UI-Hülle bekommt: In-Run-Upgrades, Workshop, Cards und jetzt ein eigener Tab für Ultimates. Das ist die erste UI-Struktur-Entscheidung im Projekt und stand vorher nirgends.

Sie hat eine Konsequenz, die benannt gehört: ein Cooldown in einem geschlossenen Tab ist während des Kampfes unsichtbar. Wer die Arena beobachtet, sieht ihn nicht. Für ein Idle-Spiel ist das vertretbar — man muss nicht zusehen, und der radiale Sweep erklärt sich beim Feuern selbst. Aber es heißt auch: die Auslösung ist im laufenden Spiel nicht vorhersehbar, nur nachvollziehbar, wenn man nachschaut. Falls sich das im Spielgefühl als Verlust zeigt, ist die kleinste Korrektur ein Ring am Turm zusätzlich zum Tab, nicht statt seiner.

Die restliche Tab-Struktur — welche Tabs es gibt, was Default ist, ob sie im Run und zwischen Runs dieselben sind — gehört in die Spec (#10) und bekommt kein eigenes Ticket: UI-Layout ist billig zu ändern, im Gegensatz zum Auslöse-System selbst.

Offen für die Spec (#10): die konkrete Schwelle je Fähigkeit, die Cooldown-Dauern, und ob der Weltzustand pro Fähigkeit unterschiedlich ist oder alle dasselbe Prädikat benutzen. Das sind Zahlen und gehören zu #8.

**Entschieden.** | Frage | Entscheidung | |---|---| | Bedingung | **Cooldown UND ein Weltzustand** — z. B. „N Gegner in Reichweite". Kein reiner Timer. | | Einstellbar | **Nein.** Jede Fähigkeit bringt ihre Bedingung mit; der Spieler wählt nur über das Loadout. | | Konflikt | **Alle feuern.** Keine Sperre, keine Priorität. | | Sichtbarkeit | **Cooldown-Anzeige in einem eigenen Ultimate-Tab** neben den Shops. | ## Was daraus folgt **Der Reichweiten-Scan wird einmal gemacht und geteilt.** Das ist keine Optimierung für später, sondern die Bedingung, unter der diese Entscheidung überhaupt tragfähig ist. #4 hat gemessen, dass `tower_fire` mit seinem naiven O(n)-Zielscan der nächste Hotspot nach dem Rendering ist — bei 10 000 Gegnern und bis zu sechs Fähigkeiten, die jeweils „N Gegner in Reichweite" prüfen, wäre das derselbe Scan siebenmal pro Frame. Ein System ermittelt den Reichweiten-Zustand, alle Auslöse-Bedingungen und `tower_fire` lesen das Ergebnis. **„Alle feuern" ist bewusst gewählt, nicht vergessen.** Bei maximal sechs gleichzeitigen Fähigkeiten ist ein gemeinsamer Auslöser kein Balancing-Problem, sondern ein Belohnungsmoment. Sollte sich später zeigen, dass der Bildschirm unlesbar wird, ist eine globale Sperre nachrüstbar — sie ändert nichts am Datenmodell, nur am auswertenden System. **Fest verdrahtete Bedingungen bleiben trotzdem Daten.** Die Bedingung gehört laut ADR-0002 zur Fähigkeits-Component und kommt wie alle Zahlen aus `Res<Balance>`. Sie im Code zu vergraben wäre ein Verstoß gegen ADR-0001. Damit ist „später einstellbar machen" ohnehin nur noch UI-Arbeit, ohne dass wir das jetzt bauen. ## Eine Entscheidung, die hier zusätzlich gefallen ist Die Sichtbarkeitsantwort legt nebenbei fest, dass der Slice eine **tab-basierte UI-Hülle** bekommt: In-Run-Upgrades, Workshop, Cards und jetzt ein eigener Tab für Ultimates. Das ist die erste UI-Struktur-Entscheidung im Projekt und stand vorher nirgends. Sie hat eine Konsequenz, die benannt gehört: **ein Cooldown in einem geschlossenen Tab ist während des Kampfes unsichtbar.** Wer die Arena beobachtet, sieht ihn nicht. Für ein Idle-Spiel ist das vertretbar — man *muss* nicht zusehen, und der radiale Sweep erklärt sich beim Feuern selbst. Aber es heißt auch: die Auslösung ist im laufenden Spiel nicht vorhersehbar, nur nachvollziehbar, wenn man nachschaut. Falls sich das im Spielgefühl als Verlust zeigt, ist die kleinste Korrektur ein Ring am Turm zusätzlich zum Tab, nicht statt seiner. Die restliche Tab-Struktur — welche Tabs es gibt, was Default ist, ob sie im Run und zwischen Runs dieselben sind — gehört in die Spec (#10) und bekommt kein eigenes Ticket: UI-Layout ist billig zu ändern, im Gegensatz zum Auslöse-System selbst. **Offen für die Spec (#10)**: die konkrete Schwelle je Fähigkeit, die Cooldown-Dauern, und ob der Weltzustand pro Fähigkeit unterschiedlich ist oder alle dasselbe Prädikat benutzen. Das sind Zahlen und gehören zu #8.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RDietermann/InfiniTower#12