Booster-Phase raus, Karten auf die Hand

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>
This commit is contained in:
team3
2026-09-08 16:11:07 +02:00
parent 318f9f3159
commit 3f4532ad59
5 changed files with 219 additions and 240 deletions

View File

@@ -1,9 +1,15 @@
extends Node
## Katalog aller Booster. Jede Runde bekommt jeder Spieler 3 davon
## zufällig angeboten und wählt genau einen aus.
## 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,
@@ -21,9 +27,14 @@ const ALL := [
"desc": "Ein gewählter Würfel wird zur 6.",
},
{
"id": "twin", "kind": Kind.BUFF, "target": true,
"name": "Zwilling",
"desc": "Ein anderer deiner Würfel nimmt den Wert des gewählten an.",
"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,
@@ -31,9 +42,9 @@ const ALL := [
"desc": "Von jedem Gegner wird dir ein zufälliger Würfel aufgedeckt.",
},
{
"id": "enemy_reroll", "kind": Kind.DEBUFF, "target": false,
"name": "Rütteln",
"desc": "Jeder Gegner muss einen zufälligen Würfel neu werfen.",
"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,
@@ -53,7 +64,7 @@ const ALL := [
{
"id": "gag", "kind": Kind.DEBUFF, "target": false,
"name": "Maulkorb",
"desc": "Der nächste Spieler muss bieten und darf nicht anfechten.",
"desc": "Wer gerade dran ist, muss bieten und darf nicht anfechten.",
},
]
@@ -66,17 +77,9 @@ func get_booster(id: String) -> Dictionary:
func needs_target(id: String) -> bool:
var b := get_booster(id)
return b.get("target", false)
return get_booster(id).get("target", false)
func draw_offer(rng: RandomNumberGenerator, amount: int = 3) -> Array:
var pool := ALL.duplicate()
var out: Array = []
for i in amount:
if pool.is_empty():
break
var k := rng.randi_range(0, pool.size() - 1)
out.append(pool[k].id)
pool.remove_at(k)
return out
## 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)