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)