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.
This commit is contained in:
2026-08-13 08:33:32 +02:00
parent a8fea8b526
commit e145d5d2df
7 changed files with 190 additions and 4 deletions

View File

@@ -235,6 +235,22 @@ direkt aus der Stapelregel aus Ticket 01 und wird wieder zuschnappen, wenn sie n
Startkampf danach: Krieger 2,5 Züge je Ratte, Dieb 3,9 bei 20 % Krit und 108 Leben.
**Zweite Balancing-Runde** (76 Tests) — gemeldet als „Ratten vergiften zu 100 %". Dahinter lagen
**drei unabhängige Fehler**, und der größte hatte mit Gift nichts zu tun:
| Fehler | Wirkung |
|---|---|
| `Creature::from_def` parste Attributnamen mit `toml::from_str`, das eine ganze Datei erwartet | **Jeder Gegner hatte seit M3 die Standardwerte.** Die Riesenratte: 100 Leben statt 14. Der Knochenfürst war eine große Ratte. Ein stilles `Err(_) => continue` |
| `attack_hit` feuerte bei *allen* Trägern statt nur beim Angreifer | Der Gift-Trigger der Ratte feuerte auch, wenn der **Held** zuschlug. Dieselbe Lücke hätte den Dornenpanzer des Angreifers reflektieren lassen |
| `Action::Damage` würfelte die Trefferformel auch bei Selbstschaden | „M verfehlt M" — ein flinker Held wich seinem eigenen Gift aus |
Dazu ein reiner Datenfehler: Das Gift stand in der *Aktionsliste* von `rat_bite`, und Aktionen haben
kein `chance`. Es hängt jetzt am Trigger — genau der Fall, für den Ticket 08 das Feld erfunden hat.
Der erste ist der teuerste Befund des Projekts und der einzige, den **kein** Werkzeug gemeldet hat:
kein Compiler, kein clippy, kein Test. Die Kampftests setzen ihre Zahlen selbst und schlugen nie eine
Gegnerdefinition nach. Gefunden hat es das Spielen, und zwar erst, als alles andere schon stimmte.
**Drei Befunde aus M1, die nur der Compiler liefern konnte** — alle in die Tickets zurückgetragen:
- **11**: Der Grenztest in seiner wörtlichen Fassung schlägt beim eigenen Doc-Kommentar an. Muss Kommentarzeilen ausnehmen.