Der Held war seit M1 als Zwergenkrieger verdrahtet, waehrend zwei Rassen und zwei Klassen ungenutzt in der Registry lagen. Der Charakterbau ist eine Schleife ueber categories_ordered() und options_of() — ein Mod, der "Talent" mit pick = 2 ergaenzt, bekommt eine dritte Spalte ohne Code. - CharacterOption bekommt abilities und on_create (Ticket 02, TODO seit M3) - abilities_of liest jetzt Rasse und Klasse: Krieger traegt Wuchtschlag, Dieb Hinterhalt, Zwerg Steinsinn - on_create gibt die Startausruestung als gewoehnliche Aktionen — starting_hero() schrumpft auf Creature::new(name) - MainMenu trennt "neuer Held" von "Lauf fortsetzen" Befund: Das Feld abilities fehlte, obwohl Ticket 15 sein ganzes Argument darauf stuetzt — eine Klasse konnte nur flache Modifikatoren geben.
85 lines
3.1 KiB
Rust
85 lines
3.1 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,
|
|
},
|
|
/// Die gewaehlten Charakteroptionen, eine Liste von IDs. Wie viele je
|
|
/// Kategorie noetig sind, steht als `pick` in der Registry — der Screen
|
|
/// zaehlt nicht mit, `rejects` prueft.
|
|
CreateCharacter(Vec<String>),
|
|
/// **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),
|
|
}
|