From e5c87015facb0aabe856f7b09ec7deac5cf8978d Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Tue, 14 Jul 2026 12:37:45 +0200 Subject: [PATCH] build: target Java 21 (LTS) instead of Java 25 maven.compiler.source/target were set to 25, but the newest language feature actually used is List.getFirst() (SequencedCollection, Java 21). On a JDK 17 or 21 the project would not compile at all. - Use maven.compiler.release=21 instead of the source/target pair - README: update prerequisites, tech stack and test count - .gitignore: ignore the Nextcloud sync file and release/*.jar --- .gitignore | 8 +++- Semesterprojekt/.gitignore | 6 --- Semesterprojekt/README.md | 85 +++++++++++++++++++++++++++----------- Semesterprojekt/pom.xml | 6 ++- 4 files changed, 71 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 9fb63d7..e327c84 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,10 @@ out/ # OS .DS_Store -Thumbs.db \ No newline at end of file +Thumbs.db + +# Nextcloud sync +.sync-exclude.lst + +# Build artifacts (kept on disk for the submission ZIP, not in git) +release/*.jar diff --git a/Semesterprojekt/.gitignore b/Semesterprojekt/.gitignore index e921fc3..7b46e53 100644 --- a/Semesterprojekt/.gitignore +++ b/Semesterprojekt/.gitignore @@ -38,12 +38,6 @@ build/ ### Mac OS ### .DS_Store -### Brainstorming visual companion ### -.superpowers/ - -# Planning specs & implementation plans (kept locally, not tracked) -docs/superpowers/ - # Local save games and settings saves/ diff --git a/Semesterprojekt/README.md b/Semesterprojekt/README.md index 709d54f..9d4328e 100644 --- a/Semesterprojekt/README.md +++ b/Semesterprojekt/README.md @@ -19,7 +19,9 @@ werden aus YAML-Dateien geladen, nicht im Code festverdrahtet. ## Voraussetzungen -- Java 25+ +- **Java 21+** (LTS). Gebaut wird gegen `maven.compiler.release=21`; das neueste + genutzte Sprachfeature ist `List.getFirst()` (SequencedCollection, Java 21). + Neuere JDKs (22–25) funktionieren ebenfalls. - Maven 3.9+ **oder** der mitgelieferte Maven Wrapper (`./mvnw`) – damit ist keine separate Maven-Installation nötig; der Wrapper lädt die passende Maven-Version beim ersten Aufruf selbst herunter. @@ -27,7 +29,7 @@ werden aus YAML-Dateien geladen, nicht im Code festverdrahtet. ## Schnellstart ohne Maven Im Ordner [`release/`](release/) liegen zwei fertig gebaute, eigenständige -JARs mit allen Abhängigkeiten – je eine pro Frontend. Sie brauchen nur Java 25: +JARs mit allen Abhängigkeiten – je eine pro Frontend. Sie brauchen nur Java 21+: ```bash java -jar release/HauntedManor-Console.jar # Konsolen-Version (~5 MB, ohne Audio) @@ -43,7 +45,7 @@ Mit dem Wrapper (empfohlen, keine Maven-Installation nötig) – unter Windows `mvnw.cmd` statt `./mvnw`: ```bash -./mvnw clean test # alle Tests ausführen (233 Tests) +./mvnw clean test # alle Tests ausführen (259 Tests) ./mvnw clean package # baut beide JARs nach release/ (Console + GUI) ``` @@ -63,22 +65,50 @@ Alternativ direkt aus der gebauten JAR (siehe [Schnellstart](#schnellstart-ohne- ### Befehle im Spiel -| Befehl | Aliase | Wirkung | +Befehle funktionieren auf **Englisch und Deutsch** – die deutschen Beispiele der +Aufgabenstellung (`Gehe nach Norden`, `Nimm Brief`, `Lies Brief`, +`Benutze Schaufel`) laufen also direkt. Item-IDs bleiben englisch (`letter`, +`shovel`), Himmelsrichtungen verstehen beide Sprachen (`north` / `norden`). + +| Befehl | Aliase | Deutsch | Wirkung | +|---|---|---|---| +| `go ` | `move`, `walk` | `gehe`, `geh` | In eine Himmelsrichtung gehen | +| `look` | `l` | `schau`, `umsehen` | Aktuellen Raum beschreiben | +| `map` | `m` | `karte` | Karte der erkundeten Räume anzeigen | +| `quests` | `log`, `journal` | `aufgaben` | Aktive und erledigte Quests anzeigen | +| `inventory` | `inv`, `i` | `inventar` | Inventar anzeigen | +| `take ` | `pick`, `get` | `nimm`, `nehme` | Gegenstand aufnehmen | +| `drop ` | `put` | `lege`, `ablegen` | Gegenstand ablegen | +| `use ` | | `benutze` | Gegenstand benutzen / schalten | +| `use on ` | | | Zwei Gegenstände kombinieren | +| `read ` | | `lies`, `lese` | Lesbaren Gegenstand lesen | +| `examine ` | `x`, `inspect` | `untersuche` | Gegenstand genauer ansehen | +| `talk ` | `speak` | `rede`, `sprich` | Mit einem NPC sprechen | +| `give ` | | `gib` | NPC einen Gegenstand geben | +| `help` | `?` | `hilfe` | Befehlsübersicht anzeigen | +| `quit` | `exit` | `beenden` | Spiel beenden | + +## Wo die Aufgabenstellung umgesetzt ist + +Kurzwegweiser zu den geforderten Punkten: + +| Anforderung | Wo | Details | |---|---|---| -| `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 | +| **Raum-Klasse + Navigation**, mind. 4 Räume | [`model/Room.java`](src/main/java/thb/jeanluc/adventure/model/Room.java), [`model/Direction.java`](src/main/java/thb/jeanluc/adventure/model/Direction.java) | **14 Räume**. `Room` hält direkte Referenzen auf Nachbarräume in einer `EnumMap` – ein echter Objektgraph, keine String-IDs. | +| **`gehen`-Befehl** (Tipp: switch/if-else/HashMap) | [`command/CommandRegistry.java`](src/main/java/thb/jeanluc/adventure/command/CommandRegistry.java), [`command/impl/GoCommand.java`](src/main/java/thb/jeanluc/adventure/command/impl/GoCommand.java) | Dispatch über `HashMap` (O(1), Aliase = mehrere Keys auf dieselbe Instanz). Richtung dann O(1) per `EnumMap`-Lookup. | +| **Gegenstände + Inventar**, mind. 3 Items | [`model/Player.java`](src/main/java/thb/jeanluc/adventure/model/Player.java), [`model/item/`](src/main/java/thb/jeanluc/adventure/model/item/) | **19 Items**. Inventar = `LinkedHashMap`. Item-Hierarchie: `PlainItem`, `ReadableItem`, `SwitchableItem`. | +| **Aufnehmen / Ablegen / Benutzen / Lesen** | [`command/impl/`](src/main/java/thb/jeanluc/adventure/command/impl/) | `TakeCommand`, `DropCommand`, `UseCommand`, `ReadCommand` – inkl. `letter` („Brief") und `shovel` („Schaufel") aus den Beispielen. | +| **Datenstrukturwahl** (bewertungsrelevant) | [`docs/data-structures.md`](docs/data-structures.md) | Begründung je Anwendungsfall + Tabelle „Bewusst NICHT gewählt". | +| **NPCs** (Bonus) | [`model/Npc.java`](src/main/java/thb/jeanluc/adventure/model/Npc.java) | 3 NPCs, die auf Spielerzustand **reagieren** (`talk`, `give`). | +| **Swing-GUI** (Bonus) | [`io/SwingIO.java`](src/main/java/thb/jeanluc/adventure/io/SwingIO.java) | `JTextField` für die Eingabe (s. Hinweis unten). | +| **Javadoc** | überall | An Klassen, Methoden und Instanzvariablen. | + +**Hinweis zur GUI:** Die Aufgabe nennt `JTextField` + `JTextArea`. Die Eingabe ist ein +`JTextField` wie gefordert; für die **Ausgabe** wird bewusst ein `JTextPane` statt einer +`JTextArea` verwendet. Grund: `JTextArea` kann nur unformatierten Text darstellen, während +das Spiel farbige/gestylte Ausgabe (`StyledText` → `StyledDocument`) rendert – Raumnamen, +Items und Hinweise sind farblich unterschieden. `JTextPane` ist dafür die passende +Swing-Komponente und funktional eine Obermenge von `JTextArea`. ## Projektstruktur @@ -87,22 +117,27 @@ 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 +│ ├── command/ - Befehlsparser, Registry + impl/ (15 Kommandos) +│ ├── game/ - Spielschleife, Engines, Light, Pathfinder, MapLayout +│ ├── io/ - GameIO-Abstraktion: ConsoleIO, SwingIO + text/ (Styling) +│ ├── loader/ - YAML-Laden: dto/, Factories, Resolver, Validator +│ ├── menu/ - Hauptmenü und Einstellungen +│ ├── model/ - Domänenmodell: Room, World, Player, Npc, item/ +│ └── save/ - Speicherstände und Settings (JSON) ├── 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 +│ ├── npcs.yaml - NPCs und ihre Reaktionen +│ ├── quests.yaml - Quests und Stages +│ ├── endings.yaml - Spielenden +│ └── combinations.yaml - Item-Kombinationen (`use X on Y`) └── docs/ - Design- und Architekturdokumentation ``` ## Technologie-Stack -- **Java 25** +- **Java 21 (LTS)** - **Jackson** (YAML) für das Laden der Spielwelt - **Lombok** zur Reduktion von Boilerplate - **JUnit 5 + AssertJ + Mockito** für Tests diff --git a/Semesterprojekt/pom.xml b/Semesterprojekt/pom.xml index 4ca84cc..6ed172a 100644 --- a/Semesterprojekt/pom.xml +++ b/Semesterprojekt/pom.xml @@ -9,8 +9,10 @@ 1.0-SNAPSHOT - 25 - 25 + + 21 UTF-8 2.18.2