feat(quests): Quests als Trigger mit Zaehler

Eine Quest IST ein Trigger mit count = N — kein zweiter Mechanismus.
Gezaehlt wird erst ab start_quest, erledigte bleiben mit done = true
stehen, und die Belohnung darf die naechste starten: das ist die Kette.

- fuenfzehnte Registry, Trigger per serde(flatten) eingebettet
- give_item als Aktion, damit eine Belohnung mehr als Erfahrung zahlt
- QuestLog auf q, Fortschritt im Speicherstand, unbekannte IDs verworfen
- eine Funktion entscheidet fuer alle Traeger, wann ein Trigger feuert

Befund: Die Ordnungszahlen im Aktionskatalog widersprechen sich — vier
Tickets zaehlten je vom eigenen Stand. Sie sind raus, CONTEXT.md fuehrt
die Liste.
This commit is contained in:
2026-08-13 07:43:46 +02:00
parent 090d9ae136
commit 37b5820c5b
12 changed files with 376 additions and 22 deletions

34
mods/core/quests.toml Normal file
View File

@@ -0,0 +1,34 @@
# Quests (Ticket 08). Eine Quest **ist ein Trigger mit `count = N`** — kein
# zweiter Mechanismus, dieselben Felder wie an Gegenstand, Modifikator oder
# Gegner: `on`, `when`, `condition`, `actions`, `chance`.
#
# Gezaehlt wird ERST AB DEM START (`start_quest`). Alle Quests ab dem ersten Zug
# mitlaufen zu lassen waere kuerzer und macht das Spiel kaputt: Eine Kette
# "bring mir fuenf Schwaenze" -> "jetzt in den Keller" waere beim Betreten des
# Kellers schon erfuellt, bevor sie jemand erwaehnt hat.
[[quests]]
id = "rattenplage"
name = "Rattenplage"
description = "Borin zahlt für fünf Riesenratten."
on = "creature_died"
count = 5
condition = [ { check = "has_tag", who = "target", value = "core:beast" } ]
actions = [
{ action = "give_item", item = "core:gold", count = 60 },
{ action = "give_exp", amount = 25 },
# Die Belohnung startet die naechste Quest — DAS ist die Kette, und sie
# braucht keinen eigenen Begriff.
{ action = "start_quest", quest = "core:tiefer_hinab" },
]
# "Besitze N" braucht keine zweite Mechanik, sondern dieselbe Form: ein Ereignis,
# eine Bedingung, count = 1.
[[quests]]
id = "tiefer_hinab"
name = "Tiefer hinab"
description = "Steig bis zur dritten Etage ab."
on = "floor_entered"
count = 1
condition = [ { check = "attribute", who = "self", attribute = "level", at_least = 1 } ]
actions = [ { action = "give_exp", amount = 40 } ]