DungeonCrawler/PROJEKTDOKU.md
Andre 8bb8bfe5a1 docs: Krieger Skills, Wut-System und HUD-Änderungen dokumentiert
- Krieger Skill-Tabelle mit allen 8 Skills + Kosten/Effekten
- Wut-System erklärt (Aufbau, Verfall, Berserker-Ausnahme)
- Gegner-Debuffs (apply_slow, apply_pull)
- HUD-Tabelle aktualisiert (XP-Bar unter Actionbar, Slot-Nummern)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 22:17:38 +01:00

622 lines
25 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# DungeonCrawler Projektdokumentation
## Übersicht
DungeonCrawler ist ein Third-Person Action-RPG entwickelt in Godot 4.
Spieler können solo oder in einer Gruppe von bis zu 6 Spielern Dungeons erkunden,
Gegner bekämpfen und ihre Charaktere mit verschiedenen Klassen und Ausrüstungen anpassen.
---
## Technologie
- **Engine:** Godot 4 (GDScript)
- **Perspektive:** Third-Person
- **Plattform:** PC (Windows)
---
## Steuerung
| Taste | Aktion |
|---|---|
| W / A / S / D | Bewegen |
| Mausrad | Kamera zoomen (min 5, max 20) |
| LMB gehalten + Mausbewegung | Kamera frei drehen (umschauen), Charakter bleibt in Position |
| LMB Klick auf Gegner | Ziel markieren |
| LMB Klick auf freie Fläche | Ziel abvisieren |
| RMB gehalten + Mausbewegung | Spieler + Kamera drehen (auch mit Target → weglaufen) |
| RMB Klick auf Gegner | Ziel markieren + Autoattack starten |
| 1 9 | Aktionsleiste Slots (Skills + Consumables, frei belegbar) |
| C | Charakter-Panel (Stats + Equipment) |
| I | Inventar öffnen/schließen |
| P | Fähigkeiten-Panel (alle Skills, Drag auf Aktionsleiste) |
| Leertaste | Springen |
| NumLock | Walk/Run umschalten |
---
## Szenen-Struktur
### world.tscn
Hauptszene der Spielwelt. Zeigt bei Start das Hauptmenü (Einstellungen), dann Klassenauswahl.
Enthält Overworld (Gras-Terrain, Berg, Dungeon-Tor, Felsen, Bäume) und generiert Dungeon-Ebenen zur Laufzeit.
```
World (Node3D)
├── Player (player.tscn)
├── Enemy (enemy.tscn) # Overworld-Gegner
├── Boden (StaticBody3D) # Gras-Terrain mit Noise-Shader
│ ├── MeshInstance3D
│ └── CollisionShape3D
├── DirectionalLight3D
├── NavigationRegion3D # Overworld NavMesh (im Editor backen!)
├── Mountain (CSGCombiner3D) # Berg mit 4 CSGSphere3D, use_collision
├── DungeonGate # Tor zum Dungeon (Area3D + Label)
│ ├── GateArea (Area3D)
│ └── GateLabel (Label3D)
├── Rocks (9x CSGSphere3D)
├── Trees (6x CSGCylinder3D + CSGSphere3D)
└── [DungeonContainer] (zur Laufzeit) # Wird bei Dungeon-Eintritt generiert
├── DungeonNavRegion (NavigationRegion3D)
├── Floor/Wall/Ceiling Tiles (CSGBox3D)
├── Enemies
├── ReturnPortal (Area3D)
└── DeeperPortal (Area3D)
```
### player.tscn
Der Spielercharakter mit allen UI-Panels.
```
Player (CharacterBody3D)
├── Model (Node3D)
│ └── castle_guard_01 (Mixamo FBX mit Skeleton3D + AnimationPlayer)
├── CollisionShape3D
├── CameraPivot (Node3D + camera_pivot.gd)
│ └── Camera3D
└── HUD (hud.tscn)
```
UI-Panels (CharacterPanel, InventoryPanel, LootWindow, SkillPanel) werden zur Laufzeit erstellt.
### enemy.tscn
Ein Gegner (Goblin-Modell) mit Patrol-KI, NavMesh-Pathfinding und Kampf-Animationen.
```
Enemy (CharacterBody3D)
├── Model (goblin_d_shareyko.fbx — Goblin mit Skeleton3D + AnimationPlayer)
├── CollisionShape3D (CapsuleShape3D, radius=0.35, height=1.4)
├── NavigationAgent3D (radius=0.4, für NavMesh-Pfadfindung)
└── HealthDisplay (Node3D)
└── Label3D
```
---
## Kamera-System (camera_pivot.gd)
### Modi
| Situation | Verhalten |
|---|---|
| Kein Ziel, LMB gehalten | Kamera orbitet frei, Spieler dreht sich nicht |
| Kein Ziel, RMB gehalten | Spieler + Kamera drehen sich gemeinsam |
| Ziel markiert, nichts gedrückt | Soft Lock-On: Spieler dreht sich smooth zum Ziel |
| Ziel markiert, LMB gehalten | Lock-On pausiert, Kamera frei drehbar (umschauen) |
| Ziel markiert, RMB gehalten | Lock-On pausiert, Spieler+Kamera drehen (weglaufen) |
Lock-On springt automatisch zurück sobald LMB/RMB losgelassen wird und Ziel noch markiert ist.
### Kamera-Kollision
- Raycast vom Pivot zur gewünschten Kameraposition
- Bei Wandkollision: Kamera rückt näher an den Spieler (min 1.0 Abstand)
- Ignoriert CharacterBody3D (Gegner) — nur Wände/Terrain
- Smooth-Zoom zurück wenn Wand nicht mehr im Weg
---
## Klassen, Stats & Level-System
> Vollständige Dokumentation in [CHARAKTER_SYSTEM.md](CHARAKTER_SYSTEM.md)
> (Klassen, Grund-/Zusatzstats, freie Punkte, Level-System, Kampf-System, Skills)
### Hauptmenü (main_menu.gd)
Wird als erstes angezeigt mit Optionen:
- **Spielen** — Öffnet Klassenauswahl
- **Einstellungen** — Auflösung (720p-4K), Fenstermodus (Fenster/Randlos/Vollbild), VSync, Anti-Aliasing (Aus/2x/4x/8x)
- **Beenden** — Spiel schließen
---
## Equipment-System
### Equipment (equipment.gd)
Resource-Klasse für alle Ausrüstungsgegenstände.
**Slots:** HEAD, CHEST, HANDS, LEGS, FEET, WEAPON, OFFHAND
**Seltenheiten:**
| Seltenheit | Farbe |
|---|---|
| COMMON | Weiß |
| UNCOMMON | Grün |
| RARE | Blau |
| EPIC | Lila |
**Stats auf Equipment:**
| Property | Typ | Beschreibung |
|---|---|---|
| item_name | String | Name des Items |
| slot | Slot | Equipment-Slot |
| rarity | Rarity | Seltenheitsstufe |
| armor | int | Rüstungswert |
| strength/agility/intelligence/stamina | int | Stat-Boni |
| haste | float | Angriffsgeschwindigkeits-Bonus (0.1 = 10%) |
| min_damage / max_damage | int | Waffenschaden (nur Waffen) |
| attack_speed | float | Angriffsgeschwindigkeit (nur Waffen) |
| weapon_range | float | Reichweite (nur Waffen) |
### Vorhandene Equipment-Items (equipment/)
- **iron_sword.tres** — Eisenschwert (Waffe)
- **steel_sword.tres** — Stahlschwert (Waffe, besser)
- **leather_chest.tres** — Lederrüstung (Brust)
- **iron_helm.tres** — Eisenhelm (Kopf)
- **wooden_shield.tres** — Holzschild (Nebenhand)
### Waffen-Modell am Charakter (BoneAttachment3D)
- Schwert-Modell (`medieval_sword.glb`) wird zur Laufzeit an die rechte Hand (`mixamorig_RightHand`) des Spielers gehängt
- Verwendet `BoneAttachment3D` am Skeleton3D des Spielermodells
- Modell wird beim Ausrüsten einer Waffe (`equip_item`) angezeigt und beim Ablegen entfernt
- Position/Rotation/Scale werden im Code gesetzt: `Vector3(0.5, 0.2, 0)`, `Vector3(90, 180, 0)`, `Vector3(0.8, 0.8, 0.8)`
- Funktionen: `_setup_weapon_attachment()`, `_attach_weapon_model()`, `_remove_weapon_model()`
### Character Panel (character_panel.gd, C-Taste)
Zeigt zwei Spalten:
- **Stats-Spalte:** Stärke, Beweglichkeit, Intelligenz, Ausdauer, Rüstung, HP
- **Equipment-Spalte:** Icon-Grid mit Tooltips bei Hover, Waffenschaden + DPS
Unbewaffnet: Zeigt klassenabhängige Schadenswerte.
---
## Consumable-System
### Consumable (consumable.gd)
Resource-Klasse für verbrauchbare Items (Tränke, Essen, etc.).
| Property | Typ | Beschreibung |
|---|---|---|
| item_name | String | Name des Tranks |
| effect_type | EffectType | HEAL_HP, RESTORE_MANA, HEAL_AND_MANA |
| amount | int | Heilungsmenge |
| cooldown | float | Cooldown nach Benutzung |
| icon | Texture2D | Icon für UI |
| stack_size | int | Aktuelle Anzahl im Stack |
| max_stack | int | Maximale Stack-Größe (20) |
### Vorhandene Tränke (consumables/)
- **small_hp_potion.tres** — Kleiner Heiltrank (+50 HP, 40% Drop-Chance)
- **small_mana_potion.tres** — Kleiner Manatrank (+40 Mana, 25% Drop-Chance)
### Benutzung
- **Rechtsklick im Inventar:** Trank direkt benutzen
- **Shift+Linksklick im Inventar:** Trank auf nächsten freien Aktionsleisten-Slot legen
- **Taste 3-9:** Trank über Aktionsleiste benutzen
- HP-Tränke: Nur wenn HP nicht voll, stellt HP wieder her
- Mana-Tränke: Nur wenn Mana nicht voll, stellt Ressource wieder her
- **Stacking:** Gleichnamige Tränke werden automatisch gestackt (max 20)
- **Trink-Animation:** Beim Benutzen wird die Drinking-Animation abgespielt (0.3s Blend, 0.7x Speed)
- Während des Trinkens: keine Skills, kein weiterer Trank, Bewegung bricht ab
- **Starter-Tränke:** Spieler startet mit 3 kleinen Heiltränken auf Slot 3
---
## Inventar-System
### Inventory (inventory.gd)
Resource-Klasse für das Spieler-Inventar.
- **MAX_SLOTS:** 20 Inventarplätze
- **Gold:** Währung, wird im HUD angezeigt
- **Signals:** `inventory_changed`, `gold_changed`
**Funktionen:**
| Funktion | Beschreibung |
|---|---|
| add_item(item) | Item hinzufügen (false wenn voll) |
| remove_item(item) | Item entfernen |
| add_gold(amount) | Gold hinzufügen |
| spend_gold(amount) | Gold ausgeben (false wenn nicht genug) |
| is_full() | Prüfen ob Inventar voll |
| swap_items(a, b) | Zwei Items tauschen |
| move_item(from, to) | Item verschieben |
### Inventory Panel (inventory_panel.gd, I-Taste)
- 5x4 Grid mit Item-Slots
- Gold-Anzeige im Header
- Items in Seltenheitsfarbe
- Tooltips mit vollständigen Item-Stats
- **Rechtsklick** auf Item: Direkt anlegen (tauscht mit aktuellem Equipment)
- **Drag & Drop:** Items innerhalb des Inventars verschieben, auf Aktionsleiste ziehen
---
## Loot-System
### LootTable (loot_table.gd)
Resource die mögliche Drops eines Gegners definiert.
| Property | Typ | Beschreibung |
|---|---|---|
| min_gold | int | Minimaler Gold-Drop |
| max_gold | int | Maximaler Gold-Drop |
| possible_drops | Array[LootEntry] | Mögliche Item-Drops |
### LootEntry (loot_entry.gd)
Ein einzelner Drop-Eintrag.
| Property | Typ | Beschreibung |
|---|---|---|
| item | Resource | Das droppbare Item (Equipment oder Consumable) |
| drop_chance | float | Wahrscheinlichkeit (0.0 - 1.0) |
### Gold-Skalierung nach Enemy-Level
- `generate_loot(enemy_level)` berechnet Gold: `base_gold * (1.0 + (level-1) * 0.5)`
- Level 1: x1.0, Level 3: x2.0, Level 5: x3.0
### Vorhandene LootTables (loot_tables/)
- **goblin_loot.tres** — 2-8 Gold, Eisenschwert (5%), Lederrüstung (5%), Eisenhelm (5%), Heiltrank (15%), Manatrank (10%)
- **skeleton_loot.tres** — 5-15 Gold, Stahlschwert (10%), Holzschild (12%), Eisenhelm (15%)
### LootWindow (loot_window.gd)
- Erscheint automatisch wenn ein Gegner stirbt
- Zeigt Gold und gedropte Items
- Einzelne Items per Klick aufheben
- "Alles aufheben" Button
- Gold skaliert mit Gegner-Level
---
## Kampfsystem, Skills & UI
> Vollständige Dokumentation in [CHARAKTER_SYSTEM.md](CHARAKTER_SYSTEM.md)
> (Schadensberechnung, Autoattack, Skills, GCD, Krieger-Skills)
> Skills entwickeln sich über das [SKILL_SYSTEM.md](SKILL_SYSTEM.md) weiter.
### Krieger — Wut-System
- Ressource: **Wut** (0100, rot), verfällt nach 5s außerhalb Kampf
- Aufbau: +10 durch Heavy Strike, +15 wenn Schaden genommen
- Während **Berserker** aktiv: Wut verfällt nicht, Skills kosten keine Wut
### Krieger — Skills (implementiert)
| Level | Skill | Kosten | Effekt |
|---|---|---|---|
| 1 | Autoattack | — | Basis-Schaden |
| 1 | Heavy Strike | — | Schaden + 10 Wut, 3s CD |
| 5 | Tektonischer Schlag | 30 Wut | AoE Radius 4m, Slow 60% für 3s |
| 10 | Durchbeißen | — | Mit Schild → Schildwall (85% Reduktion); ohne → Trotz (skaliert mit fehlendem HP) |
| 15 | Blutrausch | 25 Wut | Sofortschaden + Blutung DOT (4/s, 8s) |
| 20 | Wirbelwind | 40 Wut | AoE Radius 3.5m, hoher Schaden |
| 28 | Zornfesseln | 35 Wut | Zieht Gegner heran (12m), dann Schlag |
| 35 | Berserker | Alle Wut (min 50) | 10s: 2× Attackspeed, 25% weniger Schaden; danach 2.5s Crash |
### Gegner-Debuffs (enemy.gd)
- `apply_slow(factor, duration)` — Bewegungsgeschwindigkeit reduzieren
- `apply_pull(source, duration)` — Gegner zu Quelle ziehen, überschreibt KI
### Global Cooldown (GCD)
**Formel:** `GCD = Waffen-Attackspeed / (1 + Haste)`
### UI & Icons
- Aktionsleiste mit 9 Slots (Taste 1-9), frei belegbar mit Skills und Consumables, mittig unten
- Drag & Drop: Skills/Tränke zwischen Slots verschieben, aus Leiste rausziehen zum Entfernen
- Fähigkeiten-Panel (P-Taste): Listet alle verfügbaren Skills, per Drag auf Aktionsleiste ziehen
- Cooldown-Anzeige: Dunkle Überlagerung + verbleibende Zeit
- Slot-Nummern (1-9) oben links im Slot sichtbar
- XP-Leiste direkt unter der Aktionsleiste, gleiche Breite, zeigt "Lv X current/max XP" zentriert
- Icons: PNG (Dark Fantasy Stil, via ChatGPT generiert) für alle Krieger-Skills
---
## Gegner-System (enemy.gd)
### Stats (Export-Variablen)
| Stat | Standard |
|---|---|
| max_hp | 50 |
| min_damage / max_damage | 3-7 |
| attack_range | 2.0 |
| attack_speed | 2.0s |
| move_speed | 5.5 (Rennen bei Aggro) |
| patrol_speed | 1.5 (Laufen bei Patrol) |
| detection_range | 15.0 |
| patrol_radius | 8.0 |
| xp_reward | 20 |
| mob_level | 1 |
### Level-Skalierung
Stats werden in `_ready()` basierend auf `mob_level` skaliert (Basiswerte = Level 1):
- **HP:** +30% pro Level (`max_hp * (1 + (level-1) * 0.3)`)
- **Schaden:** +20% pro Level (`damage * (1 + (level-1) * 0.2)`)
- **XP:** +40% pro Level (`xp * (1 + (level-1) * 0.4)`)
- **Gold:** +50% pro Level (in `generate_loot`)
### KI-Verhalten (State Machine)
| State | Beschreibung |
|---|---|
| IDLE | Wartet (wird initial für 5s nach Spawn verwendet) |
| PATROL | Läuft zwischen zufälligen Punkten im Spawn-Radius, walk-Animation, Turn-Animationen beim Richtungswechsel |
| CHASING | Rennt zum Spieler (run-Animation), aktiviert bei detection_range oder Schaden |
| ATTACKING | Steht, dreht sich zum Spieler, greift in attack_speed-Intervallen an |
| DEAD | Spielt death-Animation, wird nach 10s entfernt |
### Patrol-System
- Enemy patrouilliert um seinen Spawnpunkt im konfigurierbaren Radius
- Wartet 2-5 Sekunden zwischen Patrol-Punkten (idle-Animation)
- Spielt Turn-Animation (left_turn_90 / right_turn_90) vor dem Loslaufen
- Läuft mit langsamer patrol_speed und walk-Animation
- Patrol-Ziel wird auf nächsten begehbaren NavMesh-Punkt gesnapped
- Bei Aggro sofort Wechsel zu run-Animation und move_speed
### Pathfinding (NavigationAgent3D)
- Nutzt `NavigationAgent3D` mit NavMesh-Pfadfindung (Dungeon)
- Gegner laufen um Wände und Ecken herum zum Spieler
- Pfad wird nur neu berechnet wenn Spieler sich > 1.5 Einheiten bewegt hat (Anti-Flicker)
- Fallback auf direkte Bewegung wenn kein NavMesh vorhanden (Overworld)
### Aggro & Leash
- **Detection Range:** Spieler wird automatisch erkannt wenn in 15m Reichweite
- **Schaden-Aggro:** Bei Schaden sofort Wechsel zu CHASING, auch aus PATROL
- **Leash Range:** Gegner verliert Aggro wenn > 30 Einheiten vom Spawnpunkt entfernt
- **Spieler-Suche:** Per `get_nodes_in_group("player")`
### Respawn
- Gegner spawnen nach 60 Sekunden am Ursprungsort neu
- Verwaltet durch world.gd (`_on_enemy_died` Signal)
### Animationen (Goblin-Modell)
Werden zur Laufzeit aus FBX-Dateien geladen (assets/Goblin+Animation/):
- idle, walking, standard run, attack, die, left turn 90, right turn 90
- Root Motion wird automatisch entfernt (`_strip_root_motion`)
### Loot-Drops
- Jeder Gegner hat eine optionale `loot_table` (LootTable Resource)
- Gold skaliert mit Gegner-Level
- Ohne LootTable: Standard-Gold-Drop
---
## Animations-System
### Mixamo-Integration
Charaktermodelle stammen von Mixamo (castle_guard_01.fbx) und werden mit separaten Animations-FBX-Dateien kombiniert.
**Lade-Prozess (player.gd / enemy.gd):**
1. `_setup_animations()` findet den AnimationPlayer im Modell
2. Jede Animations-FBX wird als PackedScene geladen (`_load_anim_from_fbx`)
3. Root Motion wird entfernt (`_strip_root_motion` — XZ-Position nullen, Y behalten)
4. Loop-Modus wird gesetzt (Bewegungsanimationen loopen, Angriff/Tod nicht)
5. Animation wird der AnimationLibrary hinzugefügt
### Spieler-Animationen (assets/Warrior+Animation/)
| Animation | Datei | Loop | Verwendung |
|---|---|---|---|
| idle | idle.fbx | Ja | Stillstehen |
| walk | walking.fbx | Ja | Vorwärts laufen |
| run | running.fbx | Ja | Rennen |
| walk_back | Walking Backwards.fbx | Ja | Rückwärts laufen |
| strafe_left | left strafe walking.fbx | Ja | Links seitwärts |
| strafe_right | right strafe walking.fbx | Ja | Rechts seitwärts |
| run_strafe_left | Running Left Strafe.fbx | Ja | Rennen links |
| run_strafe_right | Running Right Strafe run.fbx | Ja | Rennen rechts |
| jump | jump.fbx | Nein | Springen |
| walk_jump | Walking Jump.fbx | Nein | Sprung beim Laufen |
| run_jump | Running Jump.fbx | Nein | Sprung beim Rennen |
| autoattack | Autoattack.fbx | Nein | Autoattack / Zauberstab |
| heavy_strike | Heavy Strike.fbx | Nein | Heavy Strike Skill |
| death | Dying Backwards.fbx | Nein | Tod |
| roll | Quick Roll To Run.fbx | Nein | Ausweichrolle |
| turn_180 | Running Turn 180.fbx | Nein | 180°-Drehung |
| turn_left | Left Turn 90.fbx | Nein | 90° links |
| turn_right | Right Turn 90.fbx | Nein | 90° rechts |
### Gegner-Animationen (assets/Goblin+Animation/)
| Animation | Datei | Loop | Verwendung |
|---|---|---|---|
| idle | idle.fbx | Ja | Stillstehen |
| walk | walking.fbx | Ja | Patrol-Laufen |
| run | standard run.fbx | Ja | Rennen (Aggro) |
| autoattack | attack.fbx | Nein | Angriff |
| death | die.fbx | Nein | Tod |
| turn_left | left turn 90.fbx | Nein | 90° links (Patrol) |
| turn_right | right turn 90.fbx | Nein | 90° rechts (Patrol) |
---
## HUD (hud.gd)
| Element | Beschreibung |
|---|---|
| HealthBar | Rote HP-Leiste mit Text "aktuell / max" |
| ResourceBar | Ressourcen-Leiste (Blau=Mana, Gelb=Energie, Rot=Wut), nur sichtbar wenn Klasse eine Ressource hat |
| ResourceBar | Ressourcen-Leiste oben links (Blau=Mana, Gelb=Energie, Rot=Wut) |
| GoldLabel | Gold-Anzeige in Goldfarbe oben links |
| ActionBar | 9 Slots, mittig unten, Icons füllen ganzen Slot, Slot-Nummern oben links |
| XPBar | Unter der Aktionsleiste, gleiche Breite, Label zentriert: "Lv X XP/max" |
| Castbar | Zauberbalken über der Aktionsleiste (eigener CanvasLayer, layer 10) |
---
## Skill Mastery & Fusion System (Konzept)
Ein organisches Skill-System bei dem Skills sich wie Lebewesen verhalten — sie erinnern sich, wachsen und können Beziehungen eingehen.
### Kern-Konzept: Skill Memory
Jeder Skill speichert Kontext-Schnappschüsse jeder Nutzung:
- `hp_percent` — Wie viel HP der Spieler bei Nutzung hatte
- `was_opener` — War es der erste Treffer im Kampf
- `target_hp_percent` — HP des Ziels bei Nutzung
- `was_moving` — Ob der Spieler sich bewegte
- `time_since_last_skill` — Zeit seit dem letzten Skill
- `last_skill_used` — Welcher Skill davor benutzt wurde
Nach genug Nutzungen erkennt das System **dominante Muster** und der Skill bekommt eine **Mutation** (eigenständig, ohne Spielereingriff):
| Muster (60%+ der Nutzungen) | Mutation |
|---|---|
| Bei <30% HP | "Verzweiflung" Schaden skaliert mit fehlendem HP |
| Als erster Treffer im Kampf | "Hinterhalt" Bonus nur beim Opener |
| Im Stehen | "Standoff" Channeling-Effekt, mehr Schaden |
| Direkt nach demselben Skill | "Rhythmus" Combo-Bonus bei Wiederholung |
| Selten genutzt | "Verblasst" schwächer, irgendwann weg |
### Sockel-System
Spieler können Edelsteine mit Elementen in Sockel-Slots eines Skills einsetzen:
- **Elemente:** Feuer, Eis, Blitz, Dunkel, Licht
- Nach X Nutzungen **verschmilzt** der Edelstein mit dem Skill der Skill trägt das Element dauerhaft
- **Neuer Sockel** entsteht automatisch bei hoher Resonanz (Element passte zur Spielweise), sonst per Soul Dust erzwingbar
- **Rarity** bestimmt maximale Sockel-Slots: Common=1, Rare=2, Epic=3, Legendary=4
**Hybrid-Elemente** durch Verschmelzung zweier Skills:
| Kombination | Ergebnis |
|---|---|
| Feuer + Eis | Dampf / Schmelze |
| Dunkel + Licht | Gleichgewicht |
| Blitz + Erde | Magnetismus |
| Feuer + Blitz | Plasma |
### Verheiratungs-Phasen (Skill Linking)
Zwei Skills können verlinkt werden und entwickeln sich gemeinsam weiter:
```
VERLOBT → VERBUNDEN → FUSIONIERT ★
```
| Phase | Beschreibung |
|---|---|
| **Verlobt** | Beide Skills bleiben einzeln spielbar. Teilen Kontext-Erinnerungen. Zusammen gespielt = mehr Resonanz. Jederzeit kostenlos trennbar. |
| **Verbunden** | Nach ausreichend gemeinsamer Nutzung verschmelzen beide zu EINEM neuen Skill. Trennbar gegen Kosten (Erinnerungssplitter, nicht beide Skills zurück). |
| **Fusioniert ★** | Spieler markiert bewusst als untrennbar. Kein Zurück. Kleiner permanenter Bonus als Belohnung fürs Commitment (z.B. extra Sockel-Slot, CD-Reduktion). |
**Scheidung** (nur für verheiratete/verbundene Skills, nicht für eigenständig mutierte):
- Verbundene Skills trennen kostet **Soul Dust** + Verlust der während der Ehe entwickelten Elemente
- Organische Mutationen beider Skills bleiben erhalten
- Fusioniert = endgültig, keine Scheidung möglich
### Ressourcen
| Ressource | Herkunft | Verwendung |
|---|---|---|
| **Soul Dust** | Auflösen ungenutzter Skills | Neuen Sockel erzwingen, Scheidungskosten |
| **Edelsteine** | Gefunden / Gegner-Drops | In Sockel einsetzen für Elemente |
| **Erinnerungssplitter** | Scheidung verbundener Skills | In anderen Skill "einpflanzen" um Kontext-Geschichte zu übertragen |
### Rarity-System
Rarity steigt durch Skill-Generationen (Verbindung/Fusion) nicht durch Grinding:
- Kind-Skills aus Verbindungen starten automatisch mit höherer Rarity als ihre Eltern
- Mehr Rarity = mehr Sockel-Slots = mehr Potential für Elementar-Kombinationen
---
## Dungeon-System (world.gd)
### Überblick
Prozedural generierte Dungeon-Ebenen innerhalb derselben Szene (kein Szenenwechsel). Overworld wird versteckt, Dungeon als Kind-Nodes generiert. Spieler-State (HP, Inventar, Level) bleibt erhalten.
### Dungeon-Generierung
- **Grid-basiert:** 60x60 Zellen, TILE_SIZE = 3.0
- **Räume:** 6-10 Räume, Größe 4-9 Zellen
- **Gänge:** L-förmige Korridore zwischen Räumen (Breite 2)
- **Geometrie:** CSGBox3D für Boden, Wände (Höhe 6.0), Decke, jeweils mit `use_collision`
- **Beleuchtung:** OmniLight3D pro Raum + Decken-SpotLights in Gängen
- **Environment:** Eigene WorldEnvironment mit Fog, kein Himmel
### NavMesh (Navigation)
- Pro Dungeon-Ebene wird ein `NavigationRegion3D` mit manuell gebautem `NavigationMesh` erstellt
- Positions-basierte Vertex-Deduplizierung: gleiche Position gleicher Index zusammenhängendes NavMesh
- Wand-Margin (0.5): Kanten an Wänden werden nach innen versetzt, damit Gegner Abstand halten
- Edge-Connection-Margin auf 0.6 gesetzt
### Portal-System
| Portal | Farbe | Funktion |
|---|---|---|
| Rückkehr-Portal | Blau | Im ersten Raum, führt eine Ebene hoch oder raus |
| Deeper-Portal | Rot/Orange | Im letzten Raum, führt eine Ebene tiefer |
- **Ebene 1:** Rückkehr-Portal direkt zur Overworld
- **Ebene 2+:** Rückkehr-Portal Auswahl: "Eine Ebene hoch" oder "Dungeon verlassen"
- **Interaktion:** E-Taste, Labels zeigen Ebenen-Info
### Dungeon-Persistenz
- Generierte Ebenen werden in `saved_dungeons` Dictionary gespeichert (Level {grid, rooms})
- Beim Zurückgehen wird das gespeicherte Layout wiederhergestellt
- Beim Verlassen des Dungeons werden alle gespeicherten Ebenen gelöscht
### Gegner im Dungeon
- Spawnen in Räumen 2 bis N-1 (nicht im Start- und End-Raum)
- `mob_level = dungeon_level` (steigt mit jeder Ebene)
- Nutzen NavMesh-Pathfinding um Wände herum
---
## Geplante Features
- [ ] Skill Mastery & Fusion System (siehe Konzept oben)
- [ ] Wut-Ressource für Krieger
- [ ] Spell-System (Feuerbälle etc.)
- [ ] Schadenstypen (Physical, Fire, Ice, Lightning, Poison)
- [ ] Mehrere Gegnertypen
- [ ] Multiplayer (bis zu 6 Spieler)
- [ ] Boss-Gegner
- [ ] Item-Shop / Händler
---
## Projektstruktur
```
DungeonCrawler/
├── assets/
│ ├── Warrior+Animation/ # Spieler-Charakter + Animationen (castle_guard_01.fbx + FBX)
│ ├── Goblin+Animation/ # Gegner-Modell + Animationen (goblin_d_shareyko.fbx + FBX)
│ └── kenney_animated-characters-1/ # Kenney Animated Characters Pack
├── classes/ # Klassen-Definitionen (.tres)
│ ├── warrior.tres
│ ├── rogue.tres
│ └── mage.tres
├── consumables/ # Verbrauchbare Items (.tres)
│ ├── small_hp_potion.tres
│ └── small_mana_potion.tres
├── equipment/ # Equipment-Items (.tres)
│ ├── iron_sword.tres
│ ├── steel_sword.tres
│ ├── leather_chest.tres
│ ├── iron_helm.tres
│ ├── wooden_shield.tres
│ └── wooden_staff.tres
├── loot_tables/ # Loot-Tabellen (.tres)
│ ├── goblin_loot.tres
│ └── skeleton_loot.tres
├── icons/ # Icons (SVG)
│ ├── autoattack_icon.svg
│ ├── heavy_strike_icon.svg
│ ├── frostbolt_icon.svg
│ ├── wand_icon.svg
│ ├── iron_sword_icon.svg
│ ├── steel_sword_icon.svg
│ ├── leather_chest_icon.svg
│ ├── iron_helm_icon.svg
│ ├── wooden_shield_icon.svg
│ ├── wooden_staff_icon.svg
│ ├── hp_potion_icon.svg
│ └── mana_potion_icon.svg
├── camera_pivot.gd # Kamera-Script (Lock-On, freies Drehen, Zoom)
├── character_class.gd # CharacterClass Resource
├── character_panel.gd/.tscn # Charakter-Panel (Stats + Equipment)
├── class_selection_menu.gd/.tscn # Klassenauswahl
├── consumable.gd # Consumable Resource
├── enemy.gd / enemy.tscn # Gegner (KI, Patrol, Kampf, Animationen)
├── equipment.gd # Equipment Resource
├── hud.gd / hud.tscn # HUD (HP, Ressource, XP, Aktionsleiste, Castbar)
├── inventory.gd # Inventar Resource
├── inventory_panel.gd/.tscn # Inventar-Panel (Drag & Drop)
├── loot_entry.gd # LootEntry Resource
├── loot_table.gd # LootTable Resource
├── loot_window.gd/.tscn # Loot-Fenster
├── main_menu.gd/.tscn # Hauptmenü (Einstellungen)
├── player.gd / player.tscn # Spieler (Bewegung, Kampf, Skills, UI)
├── skill_panel.gd/.tscn # Fähigkeiten-Panel
├── world.gd / world.tscn # Hauptszene (Spawn, Respawn, Sky, Boden)
└── PROJEKTDOKU.md # Diese Dokumentation
```