# Enhancement-Ideen (Backlog)

> Roh-Sammlung von Ausbau-Ideen über die Abgabe hinaus. Lebendes Dokument –
> noch kein Design, noch keine Festlegung. Wird in Teilprojekte zerlegt und
> nacheinander über den Brainstorming → Spec → Plan → Implementierung-Zyklus
> verfeinert.

Stand: 2026-05-31. Ausgangslage: Pflichtumfang ("bare minimum") erfüllt,
alle Phasen 1–7 grün. Ziel: deutlich mehr Tiefe und Politur.

## Leitziele

- **Reichere Ausgabe** statt nacktem Konsolentext – sowohl Konsole als auch GUI.
- **GUI soll noch mehr bieten** als die Konsole (mehr Raum für visuelle Mittel).
- **~60 Minuten Spielzeit** anpeilen. Viel mehr Inhalt, viel mehr zu tun.
- Bestehendes **NPC-System zu einem tieferen Quest-System** ausbauen.

## Themenblöcke

### 1. Reichere Präsentation / Ausgabe-Schicht  ✅ umgesetzt (Branch `feature/presentation-layer`)

> Umgesetzt: semantisches Modell (`io.text`), `ConsoleIO` (ANSI + Box-Drawing,
> Color/Glyph-Modi), `SwingIO` (4 Regionen, `JTextPane`, gebündelter Font,
> HiDPI-Skalierung + Zoom `Strg +/-/0`), HUD pro Zug, Welcome-Banner. 79 Tests grün.
> Spec/Plan unter `docs/superpowers/`. Karte/Menü/Save/Musik weiterhin offen.


- Weg vom reinen `write(String)`: formatierte Ausgabe (Überschriften, Trenner,
  Hervorhebungen für Items/NPCs/Richtungen).
- **Konsole**: ANSI-Farben, Box-Drawing-Zeichen für Rahmen, evtl. ASCII-Art /
  Banner für Räume oder Spielstart.
- **GUI (Swing)**: mehr als ein `JTextArea` – Farben, Stile, evtl. Panels,
  Statusanzeige, Bilder/Icons.

**Festgelegt (Zielbild Konsole):** Stufe **B als Baseline** (Boxed Heading,
gelabelte Sektionen, persistente HUD-Zeile: Ort · Gold · Zug · Licht), **ASCII-Art
nur für große Momente** (Spielstart, Finale, Schlüsselräume). Semantische
Farb-Rollen: Items / NPCs / Exits / Heading / Gefahr.

**Designprinzipien:**
- **Nicht überladen / Progressive Disclosure** – Raumeintritt zeigt nur das
  Wesentliche (Ort, kurze Beschreibung, Auffälliges); Details auf Abruf
  (`examine`, `look`).
- **Info auf Regionen verteilen statt Text stapeln** – die **Karte ersetzt die
  „Exits:"-Zeile**. GUI: persistentes Map-Panel macht die Exit-Zeile überflüssig.
  Konsole: kompakte Mini-Map (bei `map` bzw. knapp beim Raumeintritt).

### 2. Nerd Fonts / Glyphen – das Installationsproblem

- Nerd-Font-Glyphen (Icons) sehen gut aus, müssen aber auf dem System des
  Spielers installiert sein, sonst Tofu-Kästchen.
- Offene Frage: gute Lösung finden, damit es überall funktioniert.
- Erste Gedanken:
  - **GUI**: Font ließe sich *mitliefern* (`.ttf` in Resources, via
    `Font.createFont` laden) → Installationsproblem entfällt für die GUI.
  - **Konsole**: Font nicht kontrollierbar → gestufte Fallbacks
    (reines ASCII → Unicode-Box-Drawing → Nerd-Glyphen) statt harter Annahme.

### 3. Karte / Map  ✅ umgesetzt (Branch `feature/map`)

> Umgesetzt: `MapLayout` (BFS-Gitter-Layout + Fog of War), `MapView`-Modell,
> GUI-`MapPanel` (Graphics2D, ersetzt die Exit-Liste), Konsolen-ASCII via
> `AsciiMap` + `map`-Befehl, Besuchte-Räume-Tracking auf `Player`, Map-Push pro Zug.
> Item/NPC-Marker und Türen-Styling offen (Quest-Teilprojekt). Spec/Plan unter
> `docs/superpowers/`.


- Übersichtskarte der Räume – in **beiden** Modi.
- Konsole: ASCII-Map. GUI: gezeichnete Map (Grid/Graph).
- Offene Fragen: nur bereits besuchte Räume zeigen? aktuelle Position markieren?
  fester Grundriss oder dynamisch aus den Exits berechnet?

### 4. Gameplay-Ausbau (Inhalt)

- Deutlich mehr Räume, Items, NPCs.
- Mehr zu *tun*: Rätsel, Mechaniken, Abhängigkeiten zwischen Objekten.
- Zielgröße: ~60 Min. Spielzeit (laut Annahme machbar, da überwiegend Text).

### 5. Quest-System (NPC-Ausbau)

> ✅ Fundament umgesetzt (Branch `feature/quest-foundation`): World-Flags +
> Condition/Effect-Engine, verschlossene Exits, zustandsabhängige Beschreibungen,
> bedingte Dialoge, Reaktionen mit requires/effects, Schalter-Effekte. Demo:
> Generator schaltet Strom → Keller-Tür öffnet + Raum wird beleuchtet.
>
> ✅ #3.2 umgesetzt (Branch `feature/quests`): condition-driven Quests
> (Quest/QuestStage), QuestEngine mit Auto-Advance + Ansagen, START_QUEST-Effekt,
> Konsolen-Befehl `quests` und GUI-Quest-Box unter der Karte. Demo-Quest
> `restore_power`.
>
> ✅ #3.3 umgesetzt (Branch `feature/endings`): priorisierte, condition-driven
> Enden (`endings.yaml`) + End-Screen mit Summary (Züge, Quests X/Y, Rang).
> Demo: Sieg-Ende (`manor_secured`) und Flucht-Ende (Front Door → `fled`).
> **Damit ist das Quest-System (#3) komplett.** Offen: Licht/Dunkelheit &
> Item-Kombination sowie #4 Content-Ausbau.


- Aktuelles NPC-System: Begrüßung + Geschenk-Reaktion (Item → Item).
- Ausbau Richtung: mehrstufige Quests, Bedingungen, NPC-"Memory" (Zustand),
  Quest-Log, evtl. Win-Condition daran gekoppelt.

**GUI-Layout (festgelegt):** Quest-Log als **dauerhaft sichtbare Box unterhalb der
Karte** im rechten Seitenbereich (Map oben, Quests darunter). Gehört zu Quest-
Teilprojekt #2 (Quest-Log); das Fundament #1 reserviert/plant den Slot.

### 5b. Spielkern: zentraler Bogen + Mechanik-Spine

**Leitidee (bestätigt):** Bewusst *kondensiert* – wenige Mechaniken, die sich
vielfach kombinieren, statt vieler Einzel-Gimmicks. Ein 60-Min-Spiel soll
*designt* wirken, nicht gestreckt.

**Hauptziel:** *Den Strom wieder anschalten* (`power_on`). Der Weg dahin ist eine
**Quest-Kette, die den Spieler Raum für Raum führt** (Raum X freischalten → führt
zu Raum Y → … → Generator/Sicherungskasten). Das Hauptziel selbst ist das Ende
des Bogens; einzelne Teilziele schalten je den nächsten Bereich frei.

**Mechanik-Spine (5 Bausteine, die sich kombinieren):**

1. **World-Flags / Zustand** – Rückgrat (`power_on`, `cellar_drained`,
   `ghost_banished`). Beschreibungen, Exits und NPC-Reaktionen lesen/schreiben sie.
2. **Verschlossene Exits & Schalter** – Türen brauchen Schlüssel *oder* Flag;
   Hebel/Ventile setzen Flags und öffnen Bereiche.
3. **Licht & Dunkelheit** – dunkle Räume brauchen eine brennende Lichtquelle,
   sonst keine Sicht auf Exits/Items (Atmosphäre, einfach umzusetzen).
   > ✅ Umgesetzt (Branch `feature/light-darkness`): `Room.dark` + `Item.light`,
   > `Light`-Helper, Gating in go/look/take/examine (Modell B: kein Eintritt ohne
   > Licht), HUD-Licht verdrahtet. Demo: dunkler Dungeon braucht die brennende
   > Lampe für den Generator.
4. **Item-Kombination** – z.B. `match + candle → lit candle`. Achtung: v1.0 hat
   bewusst argloses `use X` ohne Targets gewählt → Command-Grammatik muss erweitert
   werden (jetzt erlaubt, da über MVP hinaus).
   > ✅ umgesetzt (Branch `feature/use-x-on-y`): `use X on Y` als datengetriebene
   > Rezepte (`combinations.yaml`: requires/consume/produce/effects/response/failText),
   > Operanden aus Inventar oder Raum, reihenfolge-unabhängiger Paar-Key. Kein
   > Parser-Eingriff (`on`/`with`/`to` sind bereits Filler). Selbst-Kombination
   > (a==b) wird beim Laden abgelehnt. Demo: `matches` + `torch` → `lit_torch`
   > (dauerhafte Lichtquelle).
5. **Quest-Ketten + mehrere Enden** – Teilziele referenzieren Flags; Kette
   abschließen = Win; *welche* Flags gesetzt sind, entscheidet das Ende.

**Beispiel-Puzzle (zeigt das Stapeln):** *Strom wiederherstellen* – Sicherung im
gefluteten Keller; erst Ventil → `cellar_drained`; Sicherung einsetzen → Schalter
→ `power_on` → oberes Stockwerk/Tür öffnet sich. Ein Puzzle, drei Mechaniken,
schaltet einen ganzen Flügel frei.

*Weitere Puzzle-Ideen im Backlog (optional, nach Bedarf):* Zahlenschloss mit
Code aus Lore, Caesar-Chiffre-Brief (`decode`), Geist bannen (Reliquien-Fetch),
Melodie-/Sequenz-Rätsel, dunkler Gang. Resource-Meter (Sanity/Öl) **offen** –
vorerst puzzle-fokussiert ohne Survival-Druck.

### 6. Hauptmenü & Settings

> ✅ umgesetzt (Branch `feature/main-menu-save-load`). Hauptmenü-Shell oberhalb
> des Game-Loops (Neues Spiel / Laden / Einstellungen / Beenden) über neue
> `GameIO.choose`-Primitive (Konsole: nummeriertes Menü; GUI: Buttons).
> **Minimale Settings**: nur Farb-Modus + Glyphen-Modus (ASCII/Unicode), live
> umschaltbar, in `saves/settings.json` persistiert. Musik-/Typewriter-Toggles
> weiter zurückgestellt (Features existieren noch nicht).

- **Hauptmenü** vor der Spielschleife: *Neues Spiel*, *Spiel laden*, *Einstellungen*, *Beenden*.
- **Spielstände-Liste**: gespeicherte Spiele mit Metadaten (Name, Raum, Zugzahl,
  Zeitstempel) anzeigen und hineinladen.
- **Settings-Untermenü**: z.B. Farben an/aus, Typewriter-Tempo, Musik-Lautstärke
  an/aus, ASCII vs. Unicode.
- Sollte in beiden Modi funktionieren: Konsole = nummeriertes Textmenü, GUI =
  Buttons/Liste. Architektur: Menü-Schicht *oberhalb* des Game-Loops.

### 7. Speichern / Laden

> ✅ umgesetzt (Branch `feature/main-menu-save-load`). JSON-Spielstand als
> Delta über die frisch aus YAML geladene Welt (`SaveData`/`SaveCodec`/
> `SaveService`, atomare Writes). **Ein aktiver Slot**: manuelles `save`,
> Autosave (Quest-Completion + alle 10 Züge) und `quit`/`menu` (speichern +
> zurück ins Menü) schreiben denselben Slot; Laden nur über das Menü.
> `saves/` ist gitignored.

- Spielstand serialisieren (Player-Zustand, Inventar, World-Flags, besuchte Räume,
  Quest-Fortschritt) – Format z.B. YAML/JSON.
- Mehrere Speicherstände, benennbar; Anbindung an die Spielstände-Liste im Menü.

### 8. Musik (GUI)

> ✅ umgesetzt (Branch `feature/music`): OGG Vorbis (vorbisspi/jorbis), pro Raum
> via `music:`-Feld in `rooms.yaml`, externer gitignored `music/`-Ordner (nicht im
> JAR). Idempotenter Track-Wechsel mit ~400 ms Fades; Räume ohne `music` blenden zu
> Stille; gleicher Track läuft nahtlos weiter. Music-Stufe Off/Low/Med/High in den
> Settings (Default Medium), persistiert. Konsole stumm. Testbarer `MusicController`
> über isoliertes `OggMusicBackend`; fehlende Datei → still, kein Absturz. Siehe
> `docs/music.md`.

- Hintergrundmusik **nur in der GUI**.
- **Pro Raum definierbar via YAML**: in `rooms.yaml` ein optionales Feld
  (z.B. `music: <dateiname>`), Dateien in *einem* Ordner.
- **Dateigröße** ist ein Thema → Lösungsrichtung:
  - Audiodateien **nicht** in JAR/Repo bündeln, sondern externer `music/`-Ordner;
    Audio ggf. via `.gitignore` ausschließen + dokumentieren, wo Dateien hinkommen.
  - **Komprimierte Formate** (OGG/MP3) statt WAV, **gestreamt** statt komplett geladen.
  - Bibliothek erlaubt → kleinen Audio-Decoder einbinden (Java `javax.sound` kann
    OGG/MP3 nicht nativ).
  - Loop pro Track, sanfter Wechsel beim Raumwechsel, graceful fallback bei
    fehlender Datei, Lautstärke aus den Settings.
  - Architektur: `MusicPlayer`-Komponente hinter Interface; Konsole = No-Op.

## Festgelegte Erweiterungs-Entscheidungen

> ✅ **Pathfinding** umgesetzt (Branch `feature/pathfinding-go-to`): `go to <raum>`
> per BFS über besuchte Räume (Locks + Licht beachtet), via `GoCommand`
> (Richtung vs. Raumziel). Konsole still + Zusammenfassung (Start/Mitte/Ziel),
> GUI-Minikarte animiert pro Schritt (`GameIO.travelStep`, ~300 ms).
> **Trie-Autocomplete** weiterhin für eine spätere Runde zurückgestellt.

> ✅ **Tutorial** umgesetzt (Branch `feature/tutorial`): interaktiver Walkthrough
> beim Neuen Spiel (look→examine→take→inventory→use→go→go to), verb-/alias-basierte
> Abschluss-Erkennung (Bewegungs-Schritte verlangen echten Raumwechsel),
> Abschluss-Tipps, jederzeit per `skip` abbrechbar. Datengetrieben (`tutorial.yaml`,
> `TutorialLoader`), als `TutorialGuide` in den Game-Loop eingehängt; nur bei Neuem
> Spiel, nicht beim Laden.

| Entscheidung | Wert |
|---|---|
| Eigene `uebung`-Datenstrukturen verwenden? | **Nein** – Standard-Collections (vom Prof bestätigt) |
| Algorithmen-Showcase | weiterhin willkommen, aber mit Standard-Datenstrukturen (z.B. BFS `go to <raum>`, Trie-Autocomplete) |
| Bibliotheken erlaubt? | **Ja** (Pflichtteil war bewusst ohne; Erweiterung darf welche nutzen) |
| Hauptmenü | ja: Neues Spiel / Laden / Settings / Beenden |
| Speichern/Laden | ja, mehrere benannte Spielstände |
| Musik | ja, **nur GUI**, pro Raum via YAML, externer Ordner, komprimiert + gestreamt |

## Offene Designfragen (zu klären)

- Wie weit darf die `GameIO`-Abstraktion aufgebohrt werden, ohne dass Konsole
  und GUI auseinanderlaufen? (Gemeinsamer Loop ist ein Kernwert der Architektur.)
- Bleibt alles datengetrieben (YAML), auch Quests und Map-Layout?
- Reihenfolge / Abhängigkeiten der Teilprojekte.

---

*Notiz: Datengetriebenheit (YAML), getrennte DTO/Domain-Schicht und ein für
beide Frontends identischer Game-Loop sind etablierte Architekturwerte – neue
Features sollten sie respektieren, nicht umgehen.*
