# MMO Projekt

## Überblick
Community-MMO in Godot 4.6 (Forward+, Jolt Physics). Vision in `doc/_core.md`, Features in `doc/features.md`.

## Sprache
Der User kommuniziert auf Deutsch. Code und Variablen auf Englisch. Kommentare nur wo nötig.

## Code-Style
- GDScript mit 2 Spaces Einrückung
- Explizite Typen wo der Inferenzer scheitert (Ergebnisse von Variant-Funktionen, Helper-Returns die Node sein könnten)
- Keine Debug-Prints im finalen Code
- Keine emoji

## Architektur

### Autoloads (`autoloads/`)
- `EventBus` — alle Signals (Combat, Wave, Inventory, Dialog, Chat, …)
- `Net` — ENet P2P Multiplayer-Manager (Singleplayer = OfflineMultiplayerPeer)
- `Stats` — zentrale Registry: `register(entity, base_resource)` / `get_stat` / `set_stat`
- `GameState` — Wave#, Scene-Pfade, Run-Seed, Pause, Dungeon-Seed
- `SaveLoad` — JSON-basierte Persistenz (Stub für später)

### Resources (`resources/`)
- `stats/` — BaseStats + Player/Enemy/Boss/Portal/Gate/Village/Building Stats
- `abilities/` — Ability + AbilitySet (3 Klassen × 5 Abilities, im RoleSystem in Code aufgebaut)
- `items/` — Item, Recipe (Crafting in CraftingSystem in Code)
- `buildings/` — Building Resource (Blueprints in BuildingSystem in Code)
- `npcs/` — NpcProfile (Lore + Personality für Ollama)
- `effects/` — Effect Resource + Element (NONE, FIRE)

### Szenen (`scenes/`)
- `menu/` — main_menu, lobby, options_menu
- `world/` — world.tscn (Dorf-Welt mit Village + alle Systeme als Children)
- `dungeon/` — dungeon.tscn (procedural generation via dungeon_generator.gd)
- `entities/` — player, enemy, gate, portal, building, loot, npc, village
- `hud/` — hud.tscn (alles-in-einem: vitals, abilities, chat, minimap, inventory, crafting, build, dialog, map, pause, game over)

### Systeme (`systems/`)
Alle als Children unter `World/Systems` und `Dungeon/Systems` instanziert:
- Combat: HealthSystem, ShieldSystem, RespawnSystem, CooldownSystem, AbilitySystem, AutoAttackSystem
- Effects: EffectSystem, ElementSystem, AggroSystem, RoleSystem
- World: SpawnSystem, WaveSystem, InvasionSystem, XpSystem, LootSystem
- Player: InventorySystem, CraftingSystem, BuildingSystem
- Social: NpcSystem, DialogSystem (Ollama HTTP), ChatSystem, MapSystem, AudioSystem

### Multiplayer-Pattern
- ENet P2P, Host-Authoritative
- Singleplayer = `Net.host_singleplayer()` (OfflineMultiplayerPeer)
- Player-Entities tragen Authority des jeweiligen Peers (`_enter_tree() → set_multiplayer_authority(name.to_int())`)
- Stats/Damage/Spawn/Wave/XP/Inventory laufen nur am Host (`if not multiplayer.is_server() and multiplayer.multiplayer_peer != null: return`)
- Client-Aktionen via RPC zum Host: `_request_*.rpc_id(1, ...)` → Host validiert + sync via `MultiplayerSpawner` und `MultiplayerSynchronizer`
- Sync-Felder pro Entity über `MultiplayerSynchronizer` mit `SceneReplicationConfig`

### Input-Map
- WASD + Space: Move + Jump
- 1–4: Abilities (im Build-Mode: Bauteil-Auswahl)
- ALT+1/2/3: Tank/Damage/Healer
- Tab: Cycle target | LMB: Click target | RMB: Camera drag (capture mouse)
- I: Inventory | C: Crafting | B: Build mode | M: Map | Y: Chat | E: Interact (NPC)
- R: Rotate building preview
- Escape: Pause / Cancel UI

### Dialog (Ollama)
- HTTP `localhost:11434/api/generate`, Modell `llama3.2`
- Pro NPC: System-Prompt aus `lore` + `personality`
- Fallback: `npc.fallback_text` wenn Ollama nicht erreichbar — Spiel bleibt voll spielbar

### Bauen
- Grid-Snap 1m, 4 Bauteile (Floor, Wall, Door, Roof)
- LMB im Build-Mode platziert, MMB entfernt
- Material-Verbrauch aus Crafting-Items (alle aus `wood`, das aus `essence` gecrafted wird)
- Persistenz via Host (Buildings sind echte Nodes unter `EntityRoot/Buildings`, MultiplayerSpawner repliziert)

### Wave-Loop
1. WaveSystem startet 10-min Timer, spawnt 3 normale + 1 rotes Gate
2. Gate stirbt → spawnt Portal an gleicher Position
3. Spieler betritt Portal → Dungeon (procedural, 5–8 Räume + Boss)
4. Boss-Tod → Welt-Rückkehr; rotes Portal → Wave++ + alle Stats skalieren
5. Timer 0 ohne rotes Portal → Invasion (8+wave×2 Mobs zur Village)
6. Village 0 HP → Game Over → Hauptmenü

## Workflow mit dem User
- Erst planen (`doc/` lesen), dann implementieren
- Schrittweise, modulares Aufbauen — nicht alles auf einmal umbauen
- Nach Änderungen: `godot-4 --headless --quit-after 60 res://scenes/world/world.tscn` um Parse-/Runtime-Fehler zu sehen
- `doc/` nicht anfassen — das ist die User-Spec

## Smoke-Test
- `godot-4 --headless --import` → Kein Error
- `godot-4 --headless --quit-after 600 res://scenes/world/world.tscn` → Kein Error
- `godot-4 --headless --quit-after 600 res://scenes/dungeon/dungeon.tscn` → Kein Error

## Bekannte Lücken / TODOs
- Ollama muss installiert werden (Modell `llama3.2` erwartet) — Stub-Fallback funktioniert sonst
- Save/Load Slots im Hauptmenü (Autoload existiert, UI fehlt)
- Multiplayer Late-Join: Building-/Wave-State wird beim spätem Beitritt nicht synchronisiert
- Damage Numbers / Hit FX / Particle Effects fehlen (rein Polish)
