7.8 KiB
Map: rustkeep 1.0
Gitea-Spiegel: Issue #1.
Diese Datei ist die kanonische Quelle — bei Abweichung gilt .scratch/.
Gitea hat keine nativen Parent-Child- oder Blocking-Beziehungen, deshalb steht beides dort als Konvention im Body. Zuordnung Ticket → Gitea-Issue:
| Ticket | Gitea | Ticket | Gitea |
|---|---|---|---|
| 01 Effekt-Vokabular | #2 | 06 Research ratatui | #7 |
| 02 Typ-Registry | #3 | 07 Game-State-Baum | #8 |
| 03 Mod-Ladepipeline | #4 | 08 Event-System | #9 |
| 04 Fehlerstrategie | #5 | 09 Save-Schema | #10 |
| 05 Research Script-Engine | #6 | 10 Raum-Prefab-Format | #11 |
| 11 UI-Gerüst | #12 | 12 Prototyp ratatui | #13 |
| 13 Script-Engine wählen | #14 | 14 Kampfformeln | #15 |
| 15 Progression | #16 | 16 Loot-Tabellen | #17 |
Destination
Alle Architektur- und Design-Entscheidungen für rustkeep 1.0 sind getroffen — nicht gebaut, entschieden. 1.0 heißt: 5 Etagen mit Boss, Solo-Held mit Rasse und Klasse, Grid-Erkundung mit Menü-Kampf, Inventar und Ausrüstung, Quests, NPCs, Handel, Speichern/Laden, Mod-Support auf drei Stufen.
Notes
Domain: Rust-Terminal-Roguelike, moddbar. Repo: MDietermann/rustkeep.
Das Glossar liegt in CONTEXT.md im Repo-Wurzelverzeichnis — kanonische Begriffe,
keine Implementierung. Jede Session, die einen Begriff schärft, schreibt ihn dort fest.
Jede Session konsultiert: ponytail (dauerhaft aktiv), /grilling und /domain-modeling für
Grilling-Tickets, /research für Research-Tickets, /prototype für Prototype-Tickets.
Feststehende Rahmenentscheidungen aus der Charter-Session:
| Thema | Entscheidung |
|---|---|
| Motivation | Rust lernen und Spiel bauen — Lern-Entscheidungen bekommen eigene Tickets, wo sie echte Architekturfragen sind |
| Kernschleife | Grid-Bewegung zum Erkunden, Kampf im Menü (Dungeon Master / Etrian Odyssey) |
| Held | Solo, kein Party-System |
| Rendering | ratatui + crossterm; print_box fliegt raus, sobald ratatui steht |
| Etagen | Hybrid — Raum-Prefabs in TOML, prozedural zusammengesetzt |
| Daten | Alles TOML, zur Laufzeit geladen. include_str! und enum ItemType fallen |
| Mod-IDs | Namespaced (core:iron_sword), Ladereihenfolge aus Mod-Manifest. Das Kernspiel ist selbst ein Mod |
| Mod-Stufen | Daten → Typen → Scripting, in dieser Reihenfolge. Scripting setzt auf der Typ-Registry auf |
| Effekte | Ein generisches Effekt-System mit Wirkung auf Stats. Rasse, Klasse, Items, Statuseffekte, Quest-Belohnungen und später Scripts nutzen dasselbe Vokabular — dieses Vokabular ist die Mod-API |
| Quests | Bedingung + Belohnung als Daten, generisches Event-/Trigger-System |
| Weltzustand | Game-Ownership-Baum, Verweise über IDs/Indizes. Kein ECS |
| Fehler | Result statt panic! — kaputte Mod-TOMLs sind der Normalfall, nicht der Ausnahmefall |
| Save | TOML, Mod-Liste im Header, fehlender Mod = Warnung und Verwerfen, kein harter Abbruch |
Leitplanke aus Ticket 05: Scripts reden ausschließlich über das Effekt-Vokabular, nie direkt mit dem Game-State. Solange das gilt, ist die Script-Engine austauschbar — Ticket 01 entscheidet damit indirekt auch über Ticket 13.
Decisions so far
- 01 — Effekt-Vokabular (#2) — Zwei Begriffe statt einem: Modifikator (rechnet ein Attribut um, solange er existiert) und Aktion (ändert Zustand einmalig), getrennte Maschinen und getrennte TOML-Arrays. Fester Attributkatalog ohne Namensraum;
max_healthist Attribut, der Lebensstand ist Zustand. Sechs Aktionen,damageeigenständig wegen der Minderungskette. Stapeln(Basis + Σ flach) × (1 + Σ prozentual). Eine Uhr: der Zug. Sieben feste Schadenstypen, ein Minderungsmechanismus (resistance),armornur Kurzschreibweise. Auren wohnen beim Träger. Bedingungsvokabular bewusst an Ticket 08 delegiert. Begriffe im Glossar. - 02 — Typ-Registry statt Enums (#3) — Es gibt keinen Item-Typ mehr:
enum ItemTypevermischte Slot, Verhalten und Kategorie und entfällt ersatzlos zugunsten der Felderslot,stackable,consumed_on_use.ItemWeaponundItemArmorfallen weg, ein Gegenstand ist einheitlich. Fähigkeit kommt als dritter Begriff neben Modifikator und Aktion dazu (Angebot statt Wirkung). Fünf moddbare Registries; Slots und sogar Charakteroption-Kategorien sind Inhalt, mitpick = N. Startausrüstung iston_createals gewöhnliche Aktionsliste.value→base_price,shop_price→price_modifier. - 05 — Research: Script-Engine (#6) — Empfehlung Rhai wegen Fehlermeldungen mit Zeile und Spalte, billiger Typ-Brücke, AST-Hot-Reload und Build ohne
cc. Gemessen: mlua liest unterStdLib::ALL_SAFEperio.openechte Dateien — „safe" heißt dort speichersicher, nicht fähigkeitsbeschränkt. Lua gewinnt bei der Modder-Vertrautheit; WASM scheidet für 1.0 aus. Kernfolge: reden Scripts nur über das Effekt-Vokabular, ist die Engine-Wahl umkehrbar. Entscheidung offen in Ticket 13. - 06 — Research: ratatui-App-Architektur (#7) — Screen-Stack über zentralem
Game-State statt Elm oder Component-Trait;game/bleibt ratatui-frei; Popups perClearauf Sub-Rectstatt Widget-Stack; blockierendesevent::read()ohne Tick; Dungeon-Grid ist Eigenbau, es gibt kein Widget dafür; ratatui 0.30.2 mit MSRV 1.88;KeyEventKind::Press-Filter unter Windows Pflicht. Voller Bericht in research/06.
Not yet specified
- Balancing — konkrete Zahlen für Attribute, Schaden, Preise und Erfahrung über fünf Etagen. Wartet auf Kampfformeln (14), Progression (15) und Loot (16); vorher gibt es nichts zu balancieren.
- Boss-Design — ob Bosse nur Gegner mit besseren Werten sind oder eigene Mechanik brauchen (Phasen, Skripte). Berührt Stufe (c) des Mod-Supports.
- NPC- und Handelsmodell — Warenbestand, Preisbildung über
charisma, Dialogdaten. Wartet auf das Event-System (08). - Inventar-UX — Slots, Gewicht oder Kapazität, Sortierung, Vergleichsansicht. Wartet jetzt auf das Screen-Modell (11), nicht mehr auf 06.
- Mod-Verteilung — wie Spieler an Mods kommen und ob es eine Versionsprüfung gibt. Wartet auf das Manifest-Format (03).
Out of scope
- Story-Modul — kommt später als eigenes Modul, linear statt prozedural, ebenfalls moddbar. Eigene Map, wenn 1.0 steht.
- Party-System — bewusst gegen Solo entschieden; ein Wechsel wäre ein Umbau der Kampfarchitektur, keine Erweiterung.
- Multiplayer
- Grafik jenseits des Terminals