Files
pirate-dice/scripts/boosters.gd
2026-09-05 23:19:46 +02:00

83 lines
2.1 KiB
GDScript

extends Node
## Katalog aller Booster. Jede Runde bekommt jeder Spieler 3 davon
## zufällig angeboten und wählt genau einen aus.
enum Kind { BUFF, DEBUFF }
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": "twin", "kind": Kind.BUFF, "target": true,
"name": "Zwilling",
"desc": "Ein anderer deiner Würfel nimmt den Wert des gewählten an.",
},
{
"id": "peek", "kind": Kind.BUFF, "target": false,
"name": "Spähen",
"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": "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": "Der nächste Spieler 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:
var b := get_booster(id)
return b.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