# Haunted Manor – Textadventure

Semesterprojekt im Modul Programmierung 2 (Algorithmen und Datenstrukturen,
2. Semester). Ein textbasiertes Adventure in Java: Der Spieler navigiert durch
Räume eines Spukhauses, sammelt Gegenstände, interagiert mit NPCs und löst so
das Spiel.

Die Spielwelt ist vollständig datengetrieben – Räume, Gegenstände und NPCs
werden aus YAML-Dateien geladen, nicht im Code festverdrahtet.

## Features

- **Navigation** durch beliebig viele Räume in den Himmelsrichtungen
- **Inventar** mit Aufnehmen (`take`) und Ablegen (`drop`) von Gegenständen
- **Item-Hierarchie**: einfache, lesbare (`read`) und schaltbare (`use`) Gegenstände
- **NPCs** mit Gesprächen (`talk`) und Geschenk-Reaktionen (`give`)
- **Zwei Frontends**: klassische Konsole und Swing-GUI (Bonus)
- **Datengetriebene Welt** aus YAML inkl. Referenzauflösung und Validierung beim Laden

## Voraussetzungen

- Java 25+
- Maven 3.9+

## Bauen und Testen

```bash
mvn clean test      # alle Tests ausführen (67 Tests)
mvn clean package   # JAR bauen
```

## Spielen

Über die im `pom.xml` konfigurierten Run-Profile des `exec-maven-plugin`:

```bash
mvn exec:java@run   # Konsolen-Version (thb.jeanluc.adventure.App)
mvn exec:java@gui   # Swing-GUI    (thb.jeanluc.adventure.AppGui)
```

`mvn exec:java` ohne Profil startet ebenfalls die Konsolen-Version.

### Befehle im Spiel

| Befehl | Aliase | Wirkung |
|---|---|---|
| `go <richtung>` | `move`, `walk` | In eine Himmelsrichtung gehen |
| `look` | `l` | Aktuellen Raum beschreiben |
| `map` | `m` | Karte der erkundeten Räume anzeigen |
| `quests` | `log`, `journal` | Aktive und erledigte Quests anzeigen |
| `inventory` | `inv`, `i` | Inventar anzeigen |
| `take <item>` | `pick`, `get` | Gegenstand aufnehmen |
| `drop <item>` | `put` | Gegenstand ablegen |
| `use <item>` | | Gegenstand benutzen / schalten |
| `read <item>` | | Lesbaren Gegenstand lesen |
| `examine <item>` | `x`, `inspect` | Gegenstand genauer ansehen |
| `talk <npc>` | `speak` | Mit einem NPC sprechen |
| `give <item> <npc>` | | NPC einen Gegenstand geben |
| `help` | `?` | Befehlsübersicht anzeigen |
| `quit` | `exit` | Spiel beenden |

## Projektstruktur

```
Semesterprojekt/
├── src/main/java/thb/jeanluc/adventure/
│   ├── App.java            - Einstiegspunkt Konsole
│   ├── AppGui.java         - Einstiegspunkt Swing-GUI
│   ├── command/            - Befehlsparser, Registry + Command-Implementierungen
│   ├── game/               - Spielschleife (Game) und Kontext (GameContext)
│   ├── io/                 - GameIO-Abstraktion: ConsoleIO, SwingIO
│   ├── loader/             - YAML-Laden: DTOs, Factories, Resolver, Validator
│   └── model/              - Domänenmodell: Room, World, Player, Npc, Item-Hierarchie
├── src/main/resources/world/
│   ├── game.yaml           - Metadaten (Titel, Startraum, Begrüßung)
│   ├── rooms.yaml          - Räume mit Ausgängen, Items, NPCs
│   ├── items.yaml          - Gegenstände
│   └── npcs.yaml           - NPCs und ihre Reaktionen
└── docs/                   - Design- und Architekturdokumentation
```

## Technologie-Stack

- **Java 25**
- **Jackson** (YAML) für das Laden der Spielwelt
- **Lombok** zur Reduktion von Boilerplate
- **JUnit 5 + AssertJ + Mockito** für Tests
- **SLF4J + Logback** für Logging
- **Swing** für die GUI (Bonus)

## Dokumentation

Ausführliche Design- und Architekturdokumentation liegt unter
[`docs/`](docs/README.md): Package-Struktur, Datenstrukturen, Item-Modell,
YAML-Schemas, Lade-Ablauf, Befehle und NPC-Modell.
