Files
Jander_Semester2/Semesterprojekt
Jean-Luc Makiola ed41418434 test(save): cover version mismatch + slug; clean up tmp on move failure
Add loadRejectsIncompatibleVersion test asserting SaveException on schema
version 999, assert derived slug in listReturnsSlotMetadata, and harden
save() to delete the orphaned .tmp file when the non-atomic fallback move
also fails before re-throwing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 14:50:10 +02:00
..

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

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:

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/: Package-Struktur, Datenstrukturen, Item-Modell, YAML-Schemas, Lade-Ablauf, Befehle und NPC-Modell.