Files
mmo/module.md
Marek Lenczewski cf5979803e wahnsinn
2026-04-16 15:11:15 +02:00

115 lines
5.6 KiB
Markdown
Raw 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.
# 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_level1) 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)
- M2M8 bringen den Run-Loop zum Laufen (Kernspiel komplett spielbar)
- M9M10 machen es „erlebbar" (Look + Feel)
- M11 als Letztes — größter Brocken, baut auf stabilem Core auf