112 lines
3.4 KiB
GDScript
112 lines
3.4 KiB
GDScript
extends Node
|
|
## Katalog aller Münzen.
|
|
##
|
|
## Münzen gibt es nicht rundenweise zur Auswahl. Wer einen Würfel verliert,
|
|
## bekommt eine. Gespielt wird jederzeit während der Ansagen - deshalb wirkt
|
|
## jede Münze sofort und braucht keine eigene Phase mehr.
|
|
##
|
|
## Beim Ausspielen wird die Münze geworfen. Wappen oben heißt verstärkt. Die
|
|
## Grundwirkung kommt immer, der Wurf legt nur eine Schippe drauf. Deshalb ist
|
|
## kein Zug verschenkt, und die Entscheidung bleibt beim Spieler.
|
|
|
|
enum Kind { BUFF, DEBUFF }
|
|
|
|
## Mehr als das passt nicht auf die Hand; sonst hortet man bis zum Schluss.
|
|
const HANDLIMIT := 3
|
|
|
|
## Eine Münze hat zwei Seiten, also die Hälfte.
|
|
const WAPPEN_CHANCE := 0.5
|
|
|
|
## Die Würfelzahl wird bewusst nie verstärkt. Sie ist die Kernressource -
|
|
## ein Würfel mehr aus Glück würde die Partie kippen.
|
|
const ALL := [
|
|
{
|
|
"id": "reroll_all", "kind": Kind.BUFF, "target": false,
|
|
"name": "Neuwurf",
|
|
"desc": "Wirf alle deine Würfel noch einmal neu.",
|
|
"stark": "Danach wird einer davon zur 6.",
|
|
},
|
|
{
|
|
"id": "reroll_one", "kind": Kind.BUFF, "target": true,
|
|
"name": "Feinschliff",
|
|
"desc": "Wirf einen selbst gewählten Würfel neu.",
|
|
"stark": "Ein zweiter, zufälliger Würfel kommt mit.",
|
|
},
|
|
{
|
|
"id": "set_six", "kind": Kind.BUFF, "target": true,
|
|
"name": "Glücksgriff",
|
|
"desc": "Ein gewählter Würfel wird zur 6.",
|
|
"stark": "Ein zweiter, zufälliger Würfel wird auch zur 6.",
|
|
},
|
|
{
|
|
"id": "gain_die", "kind": Kind.BUFF, "target": false,
|
|
"name": "Nachschub",
|
|
"desc": "Du bekommst einen Würfel dazu.",
|
|
"stark": "Der neue Würfel zeigt sofort eine 6.",
|
|
},
|
|
{
|
|
"id": "cancel", "kind": Kind.BUFF, "target": false,
|
|
"name": "Widerruf",
|
|
"desc": "Hebt Nebel, Störfeuer und Maulkorb auf, die auf dir liegen.",
|
|
"stark": "Die Münze bleibt dir erhalten.",
|
|
"behalten": true,
|
|
},
|
|
{
|
|
"id": "peek", "kind": Kind.BUFF, "target": false,
|
|
"name": "Spähen",
|
|
"desc": "Von jedem Gegner wird dir ein zufälliger Würfel aufgedeckt.",
|
|
"stark": "Es sind zwei Würfel je Gegner.",
|
|
},
|
|
{
|
|
"id": "bid_up", "kind": Kind.DEBUFF, "target": false,
|
|
"name": "Erhöhen",
|
|
"desc": "Die laufende Ansage steigt um 1.",
|
|
"stark": "Sie steigt um 2.",
|
|
},
|
|
{
|
|
"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).",
|
|
"stark": "Er sinkt um 2.",
|
|
},
|
|
{
|
|
"id": "fog", "kind": Kind.DEBUFF, "target": false,
|
|
"name": "Nebel",
|
|
"desc": "Jeder Gegner verliert die Sicht auf einen seiner eigenen Würfel.",
|
|
"stark": "Es sind zwei 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.",
|
|
"stark": "Es müssen mindestens 3 sein.",
|
|
},
|
|
{
|
|
"id": "gag", "kind": Kind.DEBUFF, "target": false,
|
|
"name": "Maulkorb",
|
|
"desc": "Wer gerade dran ist, muss bieten und darf nicht anfechten.",
|
|
"stark": "Alle Gegner müssen bieten.",
|
|
},
|
|
]
|
|
|
|
|
|
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)
|
|
|
|
|
|
## Münzen, die bei Wappen auf der Hand bleiben, statt in die Mitte zu wandern.
|
|
func keeps_on_wappen(id: String) -> bool:
|
|
return get_booster(id).get("behalten", false)
|
|
|
|
|
|
## Eine zufällige Münze, 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)
|