Die Boosterwahl kostete jede Runde eine eigene Phase mit 30 Sekunden Frist. Zwischen Wurf und Ansage lag damit eine Wartezeit, die den Ablauf zerriss. Jetzt gibt es Karten statt einer Phase: * Wer einen Wuerfel abgibt, zieht eine Karte. Das ist der einzige Nachschub, also bekommt der etwas zurueck, der gerade hinten liegt. * Gespielt wird jederzeit waehrend der Ansagen, nicht nur am eigenen Zug. * Hoechstens drei Karten auf der Hand. * Die Hand liegt offen unten links, ein Klick spielt. Nur Feinschliff und Gluecksgriff fragen noch nach dem Wuerfel. Der Katalog ist angepasst, weil jede Karte jetzt sofort wirken muss: neu sind Erhoehen (Ansage +1), Widerruf (hebt Nebel, Stoerfeuer und Maulkorb auf dir auf) und Nachschub (ein Wuerfel dazu). Zwilling und Ruetteln sind raus - beide brauchten den festen Zeitpunkt vor dem Wurf. Bots spielen ihre Karten am eigenen Zug, bei voller Hand immer. Zwei Karten gleichzeitig wuerden sich beim Wuerfeln in die Quere kommen, deshalb wird immer nur eine aufgeloest. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
86 lines
2.4 KiB
GDScript
86 lines
2.4 KiB
GDScript
extends Node
|
|
## Katalog aller Karten.
|
|
##
|
|
## Karten gibt es nicht mehr rundenweise zur Auswahl. Wer einen Würfel
|
|
## verliert, zieht eine. Gespielt wird jederzeit während der Ansagen - deshalb
|
|
## wirkt jede Karte sofort und braucht keine eigene Phase mehr.
|
|
|
|
enum Kind { BUFF, DEBUFF }
|
|
|
|
## Mehr als das passt nicht auf die Hand; sonst hortet man bis zum Schluss.
|
|
const HANDLIMIT := 3
|
|
|
|
const ALL := [
|
|
{
|
|
"id": "reroll_all", "kind": Kind.BUFF, "target": false,
|
|
"name": "Neuwurf",
|
|
"desc": "Wirf alle deine Würfel noch einmal neu.",
|
|
},
|
|
{
|
|
"id": "reroll_one", "kind": Kind.BUFF, "target": true,
|
|
"name": "Feinschliff",
|
|
"desc": "Wirf einen selbst gewählten Würfel neu.",
|
|
},
|
|
{
|
|
"id": "set_six", "kind": Kind.BUFF, "target": true,
|
|
"name": "Glücksgriff",
|
|
"desc": "Ein gewählter Würfel wird zur 6.",
|
|
},
|
|
{
|
|
"id": "gain_die", "kind": Kind.BUFF, "target": false,
|
|
"name": "Nachschub",
|
|
"desc": "Du bekommst einen Würfel dazu.",
|
|
},
|
|
{
|
|
"id": "cancel", "kind": Kind.BUFF, "target": false,
|
|
"name": "Widerruf",
|
|
"desc": "Hebt Nebel, Störfeuer und Maulkorb auf, die auf dir liegen.",
|
|
},
|
|
{
|
|
"id": "peek", "kind": Kind.BUFF, "target": false,
|
|
"name": "Spähen",
|
|
"desc": "Von jedem Gegner wird dir ein zufälliger Würfel aufgedeckt.",
|
|
},
|
|
{
|
|
"id": "bid_up", "kind": Kind.DEBUFF, "target": false,
|
|
"name": "Erhöhen",
|
|
"desc": "Die laufende Ansage steigt um 1.",
|
|
},
|
|
{
|
|
"id": "enemy_lower", "kind": Kind.DEBUFF, "target": false,
|
|
"name": "Absenken",
|
|
"desc": "Bei jedem Gegner sinkt ein zufälliger Würfel um 1 (1 bleibt 1).",
|
|
},
|
|
{
|
|
"id": "fog", "kind": Kind.DEBUFF, "target": false,
|
|
"name": "Nebel",
|
|
"desc": "Jeder Gegner verliert die Sicht auf einen seiner eigenen Würfel.",
|
|
},
|
|
{
|
|
"id": "raise_min", "kind": Kind.DEBUFF, "target": false,
|
|
"name": "Störfeuer",
|
|
"desc": "Alle Gegner müssen diese Runde um mindestens 2 erhöhen.",
|
|
},
|
|
{
|
|
"id": "gag", "kind": Kind.DEBUFF, "target": false,
|
|
"name": "Maulkorb",
|
|
"desc": "Wer gerade dran ist, muss bieten und darf nicht anfechten.",
|
|
},
|
|
]
|
|
|
|
|
|
func get_booster(id: String) -> Dictionary:
|
|
for b in ALL:
|
|
if b.id == id:
|
|
return b
|
|
return {}
|
|
|
|
|
|
func needs_target(id: String) -> bool:
|
|
return get_booster(id).get("target", false)
|
|
|
|
|
|
## Eine zufällige Karte, für den, der gerade einen Würfel verloren hat.
|
|
func zieh(rng: RandomNumberGenerator) -> String:
|
|
return String(ALL[rng.randi_range(0, ALL.size() - 1)].id)
|