Files
rustkeep/mods/core/creatures.toml
MDietermann e145d5d2df fix(kampf): Gegner bekommen endlich ihre Werte
Gemeldet als "Ratten vergiften zu 100 %". Dahinter lagen drei Fehler:

1. Creature::from_def parste Attributnamen mit toml::from_str, das eine
   ganze TOML-Datei erwartet. Der Aufruf schlug fuer jeden Namen fehl,
   der Zweig hiess Err(_) => continue — jeder Gegner hatte seit M3 still
   die Standardwerte. Die Riesenratte: 100 Leben statt 14, der
   Knochenfuerst war eine grosse Ratte. Kampf gegen den ersten Gegner:
   22 Zuege statt 4.
2. attack_hit feuerte bei allen Traegern statt nur beim Angreifer, also
   vergiftete die Ratte auch bei eigenen Treffern. EventKind::
   bound_to_source benennt die zwei seitengebundenen Ereignisse.
3. Action::Damage wuerfelte die Trefferformel auch bei Selbstschaden —
   ein flinker Held wich seinem eigenen Gift aus.

Dazu ein Datenfehler: Das Gift stand in der Aktionsliste von rat_bite,
und Aktionen haben kein chance. Es haengt jetzt am Trigger mit 25 %.

Drei Regressionstests, darunter der, den es seit M3 haette geben muessen:
ein Gegner bekommt die Werte aus seiner Definition.
2026-08-13 08:33:32 +02:00

73 lines
2.4 KiB
TOML

# Gegner. Die Luecke lag seit Ticket 02 offen — `Creature` war der Laufzeittyp,
# woher seine Werte kommen, hat nie jemand gesagt (Ticket 14).
#
# `ai` ist eine GEORDNETE Liste: der erste passende UND verfuegbare Eintrag
# gewinnt. Ein Eintrag ohne `condition` greift immer und gehoert ans Ende —
# fehlt er, setzt der Gegner gelegentlich aus.
[[creatures]]
id = "rat"
name = "Riesenratte"
symbol = "r"
color = "yellow"
tags = ["core:beast"]
base = { max_health = 14, damage = 3, hit_chance = 0.65, dexterity = 4, critical_chance = 5 }
abilities = ["core:rat_bite"]
ai = [ { ability = "core:rat_bite" } ]
# Das Gift haengt am TRIGGER, nicht in der Aktionsliste des Bisses: Aktionen
# haben kein `chance`, Trigger schon (Ticket 08). In der Faehigkeit stand es
# ohne Wahrscheinlichkeit — jeder Biss vergiftete, und weil ein erneutes
# Auflegen die Dauer auffrischt, war der Held ab dem ersten Treffer dauerhaft
# vergiftet (Befund M9).
triggers = [
{ on = "attack_hit", chance = 0.25,
actions = [ { action = "apply_modifier", modifier = "core:poisoned", target = "target" } ] },
]
exp_reward = 4
[[creatures]]
id = "skeleton"
name = "Skelett"
symbol = "s"
color = "white"
tags = ["core:undead"]
base = { max_health = 26, damage = 6, hit_chance = 0.7, dexterity = 3, critical_chance = 5 }
abilities = ["core:attack", "core:bone_throw"]
ai = [
{ condition = [ { check = "health_below", who = "self", value = 0.35 } ],
ability = "core:bone_throw" },
{ ability = "core:attack" },
]
exp_reward = 9
[[creatures]]
id = "ghoul"
name = "Ghul"
symbol = "G"
color = "magenta"
tags = ["core:undead"]
base = { max_health = 40, damage = 9, hit_chance = 0.72, dexterity = 5, critical_chance = 10 }
abilities = ["core:ghoul_claw", "core:second_wind"]
ai = [
{ condition = [ { check = "health_below", who = "self", value = 0.4 } ],
ability = "core:second_wind" },
{ ability = "core:ghoul_claw" },
]
exp_reward = 18
[[creatures]]
id = "bone_lord"
name = "Knochenfürst"
symbol = "K"
color = "red"
tags = ["core:undead", "core:boss"]
base = { max_health = 90, damage = 14, hit_chance = 0.78, dexterity = 6, critical_chance = 12, critical_factor = 2.0 }
abilities = ["core:attack", "core:power_strike", "core:second_wind"]
ai = [
{ condition = [ { check = "health_below", who = "self", value = 0.3 } ],
ability = "core:second_wind" },
{ ability = "core:power_strike" },
{ ability = "core:attack" },
]
exp_reward = 60