# Module — Implementierungs-Schritte zum Prototyp

Jedes Modul ist ein self-contained Inkrement. Nach jedem Modul ist der Prototyp spielbarer als vorher. Pro Modul: planen → zeigen → implementieren → testen.

## M1 — Ist-Stand-Audit ✓
Existierender Code gegen `plan.md` abgeglichen. Ergebnis: Core-Loop zu ~60% da, aber große Abweichungen in Autoload- und System-Struktur. Siehe M1b.

## M1b — Architektur-Refactor
Ist-Stand an `plan.md` angleichen, bevor neue Features gebaut werden. Jeder Sub-Schritt einzeln testen.

### Sub-Schritte
1. **Zentraler `stats.gd` Autoload**
   - Neue Datei `autoloads/stats.gd` mit API: `register(entity, resource)`, `get(entity, stat_name)`, `set(entity, stat_name, value)`, `deregister(entity)`
   - Hält Dictionary[Node, Dictionary] für Laufzeit-Werte aller Entities
   - Migration: player_stats.gd, enemy_stats.gd, boss_stats.gd, portal_stats.gd → alle Lese-/Schreib-Stellen auf zentrales `Stats` umstellen
   - Entity-Registrierungs-Pattern: `_ready() → Stats.register(self, stats_resource)`, `_exit_tree() → Stats.deregister(self)`
   - player_cache (für Szenenwechsel) in Stats

2. **`game_state.gd` Autoload**
   - Neue Datei `autoloads/game_state.gd`
   - Speichert: current_role, player_position, current_wave (später)
   - Wird von Szenen gelesen beim Laden

3. **Systeme → Szenen-Skripte umziehen**
   - `systems/role_system.gd` entfernen, Logik nach `scenes/player/role/role.gd` (prüfen: schon da?)
   - `systems/targeting_system.gd` entfernen, Logik nach `scenes/player/targeting.gd`
   - `systems/hud_system.gd` entfernen, Logik in `scenes/hud/hud_*.gd` (vitals, respawn, abilities, effects)
   - `systems/nameplate_system.gd` entfernen, in Enemy-Szene integrieren
   - `systems/portal_system.gd` entfernen, Logik in `scenes/portal/init.gd` / `portal.gd`
   - `systems/dungeon_system.gd` entfernen, Logik in `scenes/dungeon/dungeon_manager.gd`
   - Alle Signal-Verdrahtungen anpassen

4. **Effect-Hierarchie aufräumen**
   - `buff_system.gd` + `debuff_system.gd` → Children von `effect_system.gd`
   - Neuer `buff_calc_system.gd` als Child von `effect_system.gd` (aggregiert Multiplier → Stats/Shield)

5. **`attack_system.gd` vs `ability_system.gd`**
   - Rollen klären: Ability-Trigger + Schaden-Applikation
   - Wahrscheinlich: `attack_system.gd` = AutoAttack-Loop (_process-driven), `ability_system.gd` = Ability-Execution bei Input
   - Falls Duplikat: mergen. Falls getrennt: umbenennen zu `auto_attack_system.gd` wie plan.md

6. **Core-Loop-Test nach Refactor**
   - Godot starten, Portal angreifen, Dungeon betreten, Boss besiegen, zur Taverne zurück
   - Rollen-Wechsel testen, alle Abilities, Respawn, Effekte
   - Keine Regressions

7. **`plan.md` finalisieren**
   - Ungenaue Referenzen (`combat.gd`, `combat_state.gd`, `enemy_movement.gd`) durch Ist-Skripte ersetzen
   - System-Liste auf tatsächliche Anzahl anpassen
   - Autoload-Sektion final

## M2 — Startmenü
- `scenes/menu/main_menu.tscn` — Buttons: Singleplayer, Host, Join, Quit
- Singleplayer → `world.tscn`; Host/Join zunächst disabled (bis M11)
- `project.godot`: main_scene = main_menu

## M3 — Taverne als Entity mit HP
- `TavernStats` Resource (nur `max_health`)
- Taverne-Node: `HitArea` (Area3D), `Healthbar`, registriert bei Stats
- HUD: Tavern-HP oben mittig
- Taverne HP = 10 × normales Portal HP

## M4 — WaveSystem (Basis)
- `wave_system.gd`: Timer (1h), Wellen-Counter
- PortalSpawner refactoren: immer max 3 normale (sofort nachspawnen)
- HUD: Wellen-Nummer + Restzeit oben

## M5 — Rotes Portal
- `PortalStats.variant` = NORMAL | RED
- Rotes Portal: 10× HP, rote Mesh, Gruppe `red_portal`
- WaveSystem spawnt 1 rotes pro Welle, nach Besieg → nächste Welle + neues rotes
- Dungeon-Gegner des roten Portals: 10× stärker

## M6 — XP + Level-System
- `PlayerStats`: `level, xp, xp_to_next`
- `xp_system.gd`: XP bei Dungeon-Clear (1 normal, 10 rot)
- Fibonacci-Level-Kurve
- Level-Up: alle PlayerStats × 2, aktuelle HP/Schild auf neues Max
- HUD: XP-Balken + Level-Label

## M7 — Gegner-Skalierung
- EnemyStats × 2^(player_level−1) bei Spawn
- Rotes Portal: zusätzlich × 10

## M8 — InvasionSystem + Game-Over
- Timer-Ablauf ohne rotes Portal besiegt: InvasionSystem aktiviert
- Alle noch lebenden Gegner des roten Portals brechen aus, spawnen am Rand, laufen zur Taverne
- Schaden an Taverne über HealthSystem
- Alle tot → `invasion_ended(true)` → nächste Welle + neues rotes
- Taverne HP 0 → `tavern_destroyed` → Game-Over-Overlay → 3s Delay → Reset: Level 1, Welle 1, Stats Base, zurück ins Startmenü oder neuer Run

## M9 — Modelle + Animationen
- Einfache 3D-Modelle (Mixamo / Kenney / KayKit) für Spieler, Gegner, Boss, Portal, Taverne
- Animationen: Idle, Walk, Attack, Death
- Simple Shader (unlit oder lite-PBR mit Emissive für Portale)

## M10 — Audio
- Musik: Taverne (ruhig), Kampf, Invasion (bedrohlich)
- SFX: Ability-Cast, Hit, Death, Portal-Spawn, Level-Up, Invasion-Alarm, Taverne-Schaden
- Quellen: frei zugängliche CC0-Packs (freesound, OpenGameArt) — wird pro Sound dokumentiert

## M11 — Multiplayer P2P
- `ENetMultiplayerPeer` — Host öffnet Port, Client joint via IP
- `MultiplayerSpawner` für Spieler + Gegner
- `MultiplayerSynchronizer` für Stats-Felder
- Authoritative Host: Wave/Invasion/Taverne-State liegt beim Host
- Shared World (1 Taverne, alle Spieler verteidigen gemeinsam)
- Startmenü: Host/Join aktivieren

## Reihenfolge-Begründung
- M1 klärt Ist-Stand (verhindert doppelte Arbeit)
- M2–M8 bringen den Run-Loop zum Laufen (Kernspiel komplett spielbar)
- M9–M10 machen es „erlebbar" (Look + Feel)
- M11 als Letztes — größter Brocken, baut auf stabilem Core auf
