Java Swing does not reliably pick up desktop display scaling on every Linux session (tiny text on HiDPI laptops). Detect the display scale from the default GraphicsConfiguration transform (falling back to screen DPI) and multiply all font sizes by it, plus the window size. Add live zoom via Ctrl +/-/0 as a guaranteed manual override. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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 |
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.