# Projektstruktur ## Szenenbaum - Welt - Systems (HealthSystem, ShieldSystem, RespawnSystem, AbilitySystem, BuffSystem, CooldownSystem, DamageSystem, AggroSystem, EnemyAISystem, SpawnSystem) - Taverne - Player - Portale (dynamisch) - Gegner - HUD ## Architektur - Entities (Stats) mit einer Resource - Model mit DB-Tabelle - Systeme (Healthsystem) - Controller mit Service - Szenen (Dungeon) - Views - Eventbus (Signals) - Events / Listener - Entities mit Resourcen werden später zu Model mit DB-Tabelle in Go - Flow: Szene -> Input -> System -> Output -> Szene - Szenen kennen sich nicht - Innerhalb einer Szene: direkter Zugriff auf Geschwister erlaubt # Autoload ## GameState - game_state.gd - Speichert aktuelle Szene und Position # Stats - stats.gd - Speichert aktuelle Attribute aller Entities - Basiswerte aus BaseStats Resource ## EventBus - event_bus.gd — Autoload-Singleton, globale Signals - Intentionen (Input → System): - ability_use_requested(player, ability_index) — Spieler will Ability nutzen - auto_attack_tick(attacker) — Auto-Attack bereit - target_requested(player, target) — Spieler will Ziel anvisieren - enemy_detected(enemy, player) — Spieler in Detection-Area - Ergebnisse (System → Node): - combat_state_changed(player, in_combat) — Kampfstatus geändert (AggroSystem) - enemy_state_changed(enemy, new_state) — Gegner-State geändert (EnemyAISystem) - enemy_target_changed(enemy, target) — Gegner-Ziel geändert (AggroSystem) - Kampf: - attack_executed(attacker, position, direction, damage) — Angriff wurde ausgeführt - damage_dealt(attacker, target, damage) — Schaden wurde verteilt - damage_requested(attacker, target, amount) — Schaden zwischen Szenen anfordern - Entity: - entity_died(entity) — Entity ist gestorben - health_changed(entity, current, max) — Leben hat sich verändert - shield_changed(entity, current, max) — Schild hat sich verändert - shield_broken(entity) — Schild ist auf 0 gefallen - shield_regenerated(entity) — Schild ist wieder voll - Spieler: - target_changed(player, target) — Spieler hat neues Ziel anvisiert - player_respawned(player) — Spieler ist respawnt - role_changed(player, role_type) — Spieler hat Rolle gewechselt - respawn_tick(timer) — Respawn-Countdown Update - cooldown_tick(cooldowns, max_cooldowns, gcd_timer) — Cooldown-Update für HUD - Buff: - buff_changed(entity, stat, value) — Buff hat sich verändert - Regeneration: - regeneration_changed(entity, current, max) — Regeneration hat sich verändert - Gegner: - enemy_engaged(enemy, target) — Gegner hat Spieler anvisiert - Portal: - portal_spawn(portal, enemies) — Portal hat Gegner gespawnt - portal_defeated(portal) — Portal besiegt, wird Gate - Dungeon: - dungeon_cleared() — Boss tot, Dungeon gesäubert # Resources ## BaseStats - max_health, health_regen, max_shield, shield_regen_delay, shield_regen_time ## PlayerStats (extends BaseStats) - speed, jump_velocity, target_range, combat_timeout, respawn_time, gcd_time, aa_cooldown ## EnemyStats (extends BaseStats) - speed, attack_range, attack_cooldown, attack_damage, regen_fast, regen_slow, aggro_decay, portal_radius, alert_radius ## BossStats (extends EnemyStats) ## PortalStats (extends BaseStats) - spawn_count, thresholds ## Role - name, icon, mesh/material - ability_set (AbilitySet) ## AbilitySet - abilities (Array[Ability]), aa_damage, aa_range, aa_is_heal - damage_set.tres → Rolle Damage - tank_set.tres → Rolle Tank - healer_set.tres → Rolle Healer ## Ability - ability_name, type, damage, ability_range, cooldown, uses_gcd, aoe_radius, icon, is_heal, passive_stat - Typen: Single, AOE, Utility, Ult, Passive ## AbilityModifier - Verändert Ability (Element, Beruf, Prestige) # Systeme - Werden in der Hauptszene instanziert - Entities registrieren/deregistrieren sich bei Stats - Systeme lesen/schreiben über Stats ### HealthSystem (health_system.gd) - Leben (health) und Lebensregeneration (regeneration) berechnen - Tod bei 0 HP - Listener: damage_requested, heal_requested - Event: health_changed, regeneration_changed, entity_died ### ShieldSystem (shield_system.gd) - Schild (shield) und Schildregeneration (shield_regeneration) berechnen - Wie zweite Lebensleiste - Event: shield_changed, shield_broken, shield_regenerated ### RespawnSystem (respawn_system.gd) - Respawn bei Taverne mit vollen Leben und Schild - Tod-Timer (3s) - Listener: entity_died - Event: respawn_tick, player_respawned ### AbilitySystem (ability_system.gd) - Single, AOE, Utility, Ult - Auto-Attack - Listener: ability_use_requested, auto_attack_tick - Event: attack_executed ## BuffSystem (buff_system.gd) - Passive - Listener: role_changed - Event: buff_changed ### CooldownSystem (cooldown_system.gd) - Cooldown-Tracking, GCD - Listener: attack_executed - Event: cooldown_tick ### DamageSystem (damage_system.gd) - Schadensberechnung - Listener: attack_executed - Event: damage_requested, heal_requested ### AggroSystem (aggro_system.gd) - Aggro-Tabellen, Decay, Zielwahl, Kampfstatus, Nearby-Alerting - Listener: damage_dealt, heal_requested, entity_died, enemy_detected, target_requested - Event: target_changed, combat_state_changed, enemy_target_changed, enemy_engaged ### EnemyAISystem (enemy_ai_system.gd) - Gegner-States (Idle/Chase/Attack/Return), Bewegungsbefehle - Listener: enemy_target_changed, entity_died - Event: enemy_state_changed ### SpawnSystem (spawn_system.gd) - Entity-Erstellung, Portal/Gate-Spawning, Dungeon-Clear - Export: mode ("world" / "dungeon") - Listener: entity_died, health_changed - Event: portal_spawn, portal_defeated, dungeon_cleared # Szenen - Szenen sind Views — rendern, Input senden, Events empfangen - Kein Gameplay-State in Szenen (liegt in Stats Autoload) - Entities registrieren sich bei Stats in _ready(), deregistrieren in _exit_tree() - Spieler und HUD wandern beim Szenenwechsel mit (aus Welt entfernt, im Dungeon eingefügt) ## Welt - world.tscn — Hauptszene (100x100m) - Systems (alle 10 Systeme als Child-Nodes) - NavigationRegion3D - Boden (MeshInstance3D, 100x100m PlaneMesh) - Kollision (StaticBody3D, WorldBoundaryShape3D) - Licht (DirectionalLight3D, 45°, Schatten) - Taverne (StaticBody3D, BoxMesh, Mitte der Karte) - Spieler (Instanz von player.tscn) - HUD (Instanz von hud.tscn) - PortalSpawner (Node, portal_spawner.gd) ## Spieler - player.tscn — CharacterBody3D - Gruppe (player) - Kollision (CapsuleShape3D, 1.8m x 0.3m) - Mesh (CapsuleMesh) - CameraPivot (Node3D, camera.gd) - Camera3D - Movement (Node, movement.gd) — WASD + Springen, liest Werte von Stats - Combat (Node, combat.gd) — Input-Handler, emittiert ability_use_requested, auto_attack_tick - Role (Node, role.gd) — Rollenwechsel ALT+1/2/3, emittiert role_changed - Targeting (Node, targeting.gd) — Klick/TAB, emittiert target_requested - player.gd — Registriert bei Stats mit PlayerStats Resource, Sichtbarkeit bei Tod/Respawn - camera.gd — LMB freies Umsehen, RMB Kamera + Laufrichtung ## Gegner - enemy.tscn — CharacterBody3D - Gruppe (enemies) - Kollision (CapsuleShape3D) - Mesh (SphereMesh) - HitArea (Area3D) - DetectionArea (Area3D, emittiert enemy_detected) - NavigationAgent3D - EnemyMovement (Node, enemy_movement.gd) — Empfängt Bewegungsbefehle - Healthbar (Sprite3D + SubViewport, healthbar.gd) — liest HP/Shield von Stats - enemy.gd — Registriert bei Stats mit EnemyStats Resource, Detection-Area Signal - Aggro-Regeln: - Schaden = Aggro (1:1) - Heilung = Aggro (0.5x) - Tank = Aggro-Multiplikator (2x) - Aggro verfällt -1/s - Spieler im Portal-Radius: Aggro bleibt bei mindestens 1 - Außerhalb Portal-Radius: Aggro verfällt exponentiell (1%, 2%, 4%, 8%, ...) - Ohne Aggro: Gegner kehrt zum Portal zurück, regeneriert - Bei Spieler-Tod → Aggro auf 0 ## Boss - boss.tscn — wie enemy.tscn aber größer (Mesh lila, 1.5x) - Gruppe (enemies, boss) - boss.gd — Erbt von enemy.gd, registriert bei Stats mit BossStats Resource ## Portal - portal.tscn — StaticBody3D - Gruppe (portals) - Kollision (CylinderShape3D) - Mesh (CylinderMesh, blau) - HitArea (Area3D) - DetectionArea (Area3D, Auto-Targeting bei Betreten) - Healthbar (Sprite3D + SubViewport, healthbar.gd) - portal.gd — Registriert bei Stats mit PortalStats Resource - Spawnt Gegner bei HP-Schwellen (→ SpawnSystem) ## Gate - gate.tscn — StaticBody3D (keine Kollision) - Mesh (CylinderMesh, grün, leuchtend) - GateArea (Area3D, 3m Radius) - gate.gd — Konfigurierbar: target_scene, is_exit - Beide Gates bestehen solange Boss lebt, verschwinden bei dungeon_cleared ## Dungeon - dungeon.tscn — Geschlossener Raum (15x90m, Wände, dunkles Licht) - NavigationRegion3D - Boden, 4 Wände (StaticBody3D + BoxMesh, 3m hoch) - Gegnergruppen (4x4 Gegner) - Boss (Instanz von boss.tscn) - Exit-Gate (Instanz von gate.tscn, is_exit=true) - DungeonManager (Node, dungeon_manager.gd) - Keine eigenen Systems — Welt läuft weiter, Systems der Welt verarbeiten alle Entities ## HUD - hud.tscn — CanvasLayer - HealthBar (ProgressBar, Label) - ShieldBar (ProgressBar, Label) - RespawnTimer (Label, Countdown bei Tod) - AbilityBar (HBoxContainer, RoleIcon + Abilities 1-4 + Passive) - hud.gd — Reagiert auf Events, liest Werte von Stats ## Abilities (Werte) - Schadens-Klasse: - AA: 10 Schaden, 10m - 1 Single: 30 Schaden, 20m Range, 2s CD, GCD - 2 AOE: 20 Schaden, 5m Range, 3s CD, GCD - 3 Utility: Schild sofort auf 100%, 5s CD, kein GCD - 4 Ult: 5x Single (50 Schaden) + 2x AOE 3m (20 Schaden), 20m Range, 15s CD, GCD - 5 Passive: 50% mehr Schaden Aura, 50m (permanent aktiv, kein CD) - Tank-Klasse: - AA: 5 Schaden, 3m - 1 Single: 15 Schaden, 3m Range, 2s CD, GCD - 2 AOE: 10 Schaden, 10m Range, 3s CD, GCD - 3 Utility: Schild sofort auf 100%, 5s CD, kein GCD - 4 Ult: Schild 300%, 20s CD, GCD - 5 Passive: 50% mehr Schild Aura, 50m (permanent aktiv, kein CD) - Heiler-Klasse: - AA: 1 Heilung, 20m - 1 Single: 15 Heilung, 20m Range, 2s CD, GCD - 2 AOE: 10 Heilung, 20m Range, 3s CD, GCD - 3 Utility: Schild sofort auf 100%, 5s CD, kein GCD - 4 Ult: 25 Heal Single + 10 AOE Heal 3m radius, 20m Range, 15s CD, GCD - 5 Passive: 50% mehr Heal Aura, 50m (permanent aktiv, kein CD)