86 lines
2.8 KiB
GDScript
86 lines
2.8 KiB
GDScript
extends Node
|
|
## Katalog aller Münzen.
|
|
##
|
|
## Sechs Stück, jede mit einem klaren Zweck: entweder sie gibt Wissen, oder sie
|
|
## macht Druck, oder sie hilft der eigenen Hand nach. Keine würfelt an den
|
|
## Gegnern herum - das Lesen der anderen bleibt der Kern des Spiels.
|
|
##
|
|
## Geworfen wird nur am eigenen Zug, vor der Ansage. Die Münze landet im Topf
|
|
## in der Mitte. Wer das Aufdecken gewinnt, nimmt den Topf. Damit kostet jede
|
|
## Münze etwas, und das Aufdecken hat einen Einsatz.
|
|
##
|
|
## Beim Werfen entscheidet die Seite: Wappen verstärkt, Zahl lässt es bei der
|
|
## Grundwirkung. Die Grundwirkung kommt immer - kein Zug ist verschenkt.
|
|
|
|
enum Kind { BUFF, DEBUFF }
|
|
|
|
## Mehr als das passt nicht in den Vorrat; sonst hortet man bis zum Schluss.
|
|
const HANDLIMIT := 4
|
|
## Mehr liegt nie im Topf. Die älteste Münze fällt vom Tisch, sonst wächst ein
|
|
## Haufen, den keiner mehr abholen kann.
|
|
const TOPF_MAX := 6
|
|
|
|
## Eine Münze hat zwei Seiten, also die Hälfte.
|
|
const WAPPEN_CHANCE := 0.5
|
|
|
|
## `target`: fragt nach einem eigenen Würfel. `gebot`: geht nur, wenn eine
|
|
## Ansage auf dem Tisch liegt.
|
|
const ALL := [
|
|
{
|
|
"id": "peek", "kind": Kind.BUFF, "target": false, "gebot": 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": "count", "kind": Kind.BUFF, "target": false, "gebot": true,
|
|
"name": "Zählen",
|
|
"desc": "Du erfährst ungefähr, wie oft die angesagte Augenzahl am Tisch liegt.",
|
|
"stark": "Du erfährst die genaue Zahl.",
|
|
},
|
|
{
|
|
"id": "set_face", "kind": Kind.BUFF, "target": true, "gebot": true,
|
|
"name": "Falschspiel",
|
|
"desc": "Ein gewählter Würfel zeigt die angesagte Augenzahl.",
|
|
"stark": "Ein zweiter, zufälliger Würfel auch.",
|
|
},
|
|
{
|
|
"id": "gain_die", "kind": Kind.BUFF, "target": false, "gebot": false,
|
|
"name": "Nachschub",
|
|
"desc": "Du bekommst einen Würfel dazu.",
|
|
"stark": "Der neue Würfel zeigt sofort eine 6.",
|
|
},
|
|
{
|
|
"id": "bid_up", "kind": Kind.DEBUFF, "target": false, "gebot": true,
|
|
"name": "Erhöhen",
|
|
"desc": "Die laufende Ansage steigt um 1. Der Ansager muss dafür geradestehen.",
|
|
"stark": "Sie steigt um 2.",
|
|
},
|
|
{
|
|
"id": "gag", "kind": Kind.DEBUFF, "target": false, "gebot": false,
|
|
"name": "Maulkorb",
|
|
"desc": "Der nächste Spieler muss diese Runde bieten und darf nicht anfechten.",
|
|
"stark": "Das gilt für alle Gegner.",
|
|
},
|
|
]
|
|
|
|
|
|
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)
|
|
|
|
|
|
func needs_bid(id: String) -> bool:
|
|
return get_booster(id).get("gebot", 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)
|