# 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 ` | `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 ` | `pick`, `get` | Gegenstand aufnehmen | | `drop ` | `put` | Gegenstand ablegen | | `use ` | | Gegenstand benutzen / schalten | | `read ` | | Lesbaren Gegenstand lesen | | `examine ` | `x`, `inspect` | Gegenstand genauer ansehen | | `talk ` | `speak` | Mit einem NPC sprechen | | `give ` | | 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.