Files
rustkeep/src/game/command.rs
MDietermann b19492bb51 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.
2026-08-12 21:15:25 +02:00

81 lines
2.9 KiB
Rust

//! Kommandos der Oberflaeche an das Spiel — Ticket 11.
//!
//! **Nicht** zu verwechseln mit `Action`, dem TOML-Effektvokabular aus Ticket
//! 01. „Geh nach Norden" ist keine der zehn Aktionen und wird nie eine.
#[derive(Debug, Clone, Copy)]
pub enum Direction {
North,
South,
West,
East,
}
/// Ticket 11 hat zwoelf Commands festgelegt; M1 braucht zwei davon.
///
#[derive(Debug, Clone)]
pub enum Command {
Move(Direction),
Wait,
Descend,
/// Hebt den Haufen auf, auf dem der Held steht. Ticket 16: Der Inhalt wird
/// **erst hier** gezogen — moeglich nur, weil alle Haufen dasselbe Symbol
/// zeigen, die Anzeige also nichts verraet.
PickUp,
UseItem(usize),
Equip(usize),
Unequip(String),
Drop(usize),
/// Wirkt auf das Feld, **auf dem der Held steht** — dieselbe Regel wie
/// `PickUp` und `Descend`. Ein NPC blockiert nicht: Er steht in einem Laden,
/// nicht in einer Tuer.
Talk,
/// Index in `Game::dialog_options` — die **gefilterte** Liste, damit der
/// Screen keine Bedingungen auswerten muss.
Choose(usize),
Buy(usize),
Sell(usize),
/// Der normale Angriff ist **keine eigene Variante**, sondern
/// `UseAbility("core:attack")` — Faehigkeiten sind seit Ticket 02 eine
/// Registry, also gehoert er dorthin, und ein Mod kann ihn ersetzen.
/// Dasselbe gilt fuer die Flucht.
UseAbility {
ability: String,
target: super::creature::CreatureRef,
},
/// **Alle** Punkte auf einmal und damit **ein** Zug (Ticket 15). Ein
/// Kommando je Punkt hiesse bei drei Stufen drei Zuege, in denen ein Gift
/// tickt, waehrend man ein Menue bedient.
AssignPoints(Vec<(super::attributes::Attribute, u32)>),
/// Werkbank. **Ein** Kommando mit einer Variantenliste statt fuenf
/// Kommandos, die sich durch `rejects` und `perform` ziehen — ein Cheat
/// wird nie abgewiesen, das ist sein ganzer Zweck.
Debug(Cheat),
}
/// Was die Werkbank kann. Bewusst klein: Was sich mit zwei vorhandenen
/// Kommandos nachstellen laesst, gehoert nicht hierher.
#[derive(Debug, Clone)]
pub enum Cheat {
/// Gibt den Gegenstand — zehn Stueck, wenn er stapelbar ist. Sonst muesste
/// man fuer hundert Gold hundertmal druecken.
Give(String),
/// Leben und Ausdauer voll.
Heal,
/// Eine Etage tiefer, ohne Treppe.
Descend,
/// Setzt alle Gegner auf null Leben. **Nicht** `enemies.clear()`: So laeuft
/// der normale Weg samt Todes-Triggern und „Der Raum ist geräumt".
ClearRoom,
}
/// Ergebnis eines Kommandos — der Befund aus dem Durchstich in Ticket 12:
/// „alle Commands kosten einen Zug" heisst **alle ausgefuehrten**. Gegen eine
/// Wand zu laufen darf keine Zeit verbrauchen, sonst tickt ein Gift-Debuff,
/// weil jemand danebengetippt hat.
#[derive(Debug, Clone)]
pub enum Outcome {
TurnPassed,
Rejected(&'static str),
}