feat(progression): Erfahrung, Aufstieg und Punkteverteilung

Toeten gibt Erfahrung (exp_reward stand seit M3 ungelesen an jedem
Gegner), give_exp als zwoelfte Aktion fuer spaetere Quests. Aufstieg in
einer Schleife am Zugende, ein Punkt je Stufe, keine Obergrenze.

Verteilt wird im Charakterbogen — kein zwoelfter Screen. AssignPoints
nimmt alle Punkte auf einmal und kostet damit einen Zug.

luck wirkt jetzt: eine Chance auf einen Zusatzzug auf jeder Beutetabelle.

Drei Befunde:
- strength und constitution las niemand, zwei der fuenf verteilbaren
  Grundwerte waren Fallen. Zwei balance-Knoepfe rechnen sie beim
  Verteilen um.
- Rng::chance(0.0) verbrauchte eine Zahl und verschob den Zufallsstrom.
- Cheat::ClearRoom ging am Todesweg vorbei.
This commit is contained in:
2026-08-12 21:15:25 +02:00
parent b072e5ade3
commit b19492bb51
12 changed files with 421 additions and 45 deletions

View File

@@ -218,8 +218,25 @@ pub struct Balance {
pub verkauf: f32,
/// Wie stark `charisma` auf `price_modifier` wirkt (Ticket 02).
pub charisma_preis: f32,
// TODO(M5): `exp_base`, `exp_exponent` (Ticket 15) und `luck_factor`
// (Ticket 16) — sie kommen mit ihren Lesern, nicht davor.
/// Die Erfahrungskurve: `exp_base × level^exp_exponent`. **Zwei Zahlen
/// statt fuenfzig Tabellenzeilen** (Ticket 15) — eine Tabelle liesse einen
/// Modder Level 13 zum Sprung machen, und das ist der Ausbau, nicht der
/// Anfang.
pub exp_base: f32,
pub exp_exponent: f32,
/// `p_extra = clamp(luck × luck_factor, 0, 0.9)` — eine Chance auf einen
/// zusaetzlichen Zug auf **jeder** Tabelle (Ticket 16).
pub luck_factor: f32,
/// Was ein Punkt in `strength` bzw. `constitution` tatsaechlich bewirkt.
///
/// **Befund aus M5:** Ticket 15 verteilt Punkte auf fuenf Grundwerte, aber
/// `strength` und `constitution` las bis dahin *niemand* — zwei der fuenf
/// Wahlmoeglichkeiten waren Fallen. Die Umrechnung sitzt hier und nicht in
/// `Game::attribute`, weil sie beim **Verteilen** einmal passiert und nicht
/// bei jedem Auslesen: Ein Punkt in Konstitution hebt den Grundwert
/// `max_health`, wie es Ticket 15 fuer die Zuwachs-Regel voraussetzt.
pub damage_per_strength: f32,
pub health_per_constitution: f32,
}
impl Default for Balance {
@@ -233,6 +250,11 @@ impl Default for Balance {
hit_ceiling: 0.95,
verkauf: 0.4,
charisma_preis: 1.5,
exp_base: 20.0,
exp_exponent: 1.5,
luck_factor: 0.02,
damage_per_strength: 1.0,
health_per_constitution: 8.0,
}
}
}