5.6 KiB
5.6 KiB
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
-
Zentraler
stats.gdAutoload- Neue Datei
autoloads/stats.gdmit 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
Statsumstellen - Entity-Registrierungs-Pattern:
_ready() → Stats.register(self, stats_resource),_exit_tree() → Stats.deregister(self) - player_cache (für Szenenwechsel) in Stats
- Neue Datei
-
game_state.gdAutoload- Neue Datei
autoloads/game_state.gd - Speichert: current_role, player_position, current_wave (später)
- Wird von Szenen gelesen beim Laden
- Neue Datei
-
Systeme → Szenen-Skripte umziehen
systems/role_system.gdentfernen, Logik nachscenes/player/role/role.gd(prüfen: schon da?)systems/targeting_system.gdentfernen, Logik nachscenes/player/targeting.gdsystems/hud_system.gdentfernen, Logik inscenes/hud/hud_*.gd(vitals, respawn, abilities, effects)systems/nameplate_system.gdentfernen, in Enemy-Szene integrierensystems/portal_system.gdentfernen, Logik inscenes/portal/init.gd/portal.gdsystems/dungeon_system.gdentfernen, Logik inscenes/dungeon/dungeon_manager.gd- Alle Signal-Verdrahtungen anpassen
-
Effect-Hierarchie aufräumen
buff_system.gd+debuff_system.gd→ Children voneffect_system.gd- Neuer
buff_calc_system.gdals Child voneffect_system.gd(aggregiert Multiplier → Stats/Shield)
-
attack_system.gdvsability_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.gdwie plan.md
-
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
-
plan.mdfinalisieren- Ungenaue Referenzen (
combat.gd,combat_state.gd,enemy_movement.gd) durch Ist-Skripte ersetzen - System-Liste auf tatsächliche Anzahl anpassen
- Autoload-Sektion final
- Ungenaue Referenzen (
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
TavernStatsResource (nurmax_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_nextxp_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 IPMultiplayerSpawnerfür Spieler + GegnerMultiplayerSynchronizerfü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