udpate
This commit is contained in:
462
plan.md
462
plan.md
@@ -1,265 +1,31 @@
|
||||
# Projektstruktur
|
||||
## Szenenbaum
|
||||
- Welt
|
||||
- Systems (HealthSystem, ShieldSystem, RespawnSystem, CombatSystem, AggroSystem, EnemyAISystem, SpawnSystem)
|
||||
- Systems (HealthSystem, ShieldSystem, RespawnSystem, AbilitySystem, BuffSystem, CooldownSystem, DamageSystem, AggroSystem, EnemyAISystem, SpawnSystem)
|
||||
- Taverne
|
||||
- Player
|
||||
- Portale (dynamisch)
|
||||
- Gegner
|
||||
- HUD
|
||||
|
||||
## Architektur
|
||||
- Zwischen Szenen: Kommunikation über EventBus (Szenen kennen sich nicht)
|
||||
- Innerhalb einer Szene: Modulare Skripte, Zugriff auf Geschwister-Nodes erlaubt
|
||||
- Systeme berechnen und entscheiden, Szenen rendern und senden/empfangen
|
||||
- Event-Flow: Input → Intention-Event → System → Ergebnis-Event → Node
|
||||
- Systeme sind Scene-Nodes (nicht Autoloads), gefunden über Gruppen
|
||||
|
||||
# Systeme
|
||||
- Systems-Node in jeder Root-Szene (world.tscn, dungeon.tscn)
|
||||
- Entities registrieren sich bei Systemen in _ready(), deregistrieren in _exit_tree()
|
||||
- Systeme ownen State in Dictionaries (entity → Daten)
|
||||
- scripts/systems/ — System-Skripte
|
||||
|
||||
### 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
|
||||
## Welt
|
||||
- world.tscn — Hauptszene (100x100m)
|
||||
- NavigationRegion3D (Wegfindung für Gegner)
|
||||
- Boden (MeshInstance3D, 100x100m PlaneMesh, Gras-Noise-Textur)
|
||||
- Kollision (StaticBody3D, WorldBoundaryShape3D)
|
||||
- Licht (DirectionalLight3D, 45°, Schatten)
|
||||
- Taverne (StaticBody3D, BoxMesh, Mitte der Karte, Spieler-Spawn/Respawn)
|
||||
- Spieler (Instanz von player.tscn, Spawn bei Taverne)
|
||||
- HUD (Instanz von hud.tscn)
|
||||
|
||||
|
||||
## Spieler
|
||||
- player.tscn — CharacterBody3D
|
||||
- Gruppe (player)
|
||||
- Kollision (CapsuleShape3D, 1.8m x 0.3m)
|
||||
- Mesh (CapsuleMesh)
|
||||
- CameraPivot (Node3D, Kopfhöhe, camera.gd)
|
||||
- Camera3D (hinter/über Spieler)w
|
||||
- Movement (Node, movement.gd)
|
||||
- Combat (Node, combat.gd)
|
||||
- Role (Node, role.gd)
|
||||
- Targeting (Node, targeting.gd)
|
||||
- Health (Node, health.gd)
|
||||
- Shield (Node, shield.gd)
|
||||
- player.gd — Kern, verbindet Komponenten, Sichtbarkeit bei Tod/Respawn
|
||||
- camera.gd — LMB freies Umsehen, RMB Kamera + Laufrichtung anpassen
|
||||
- movement.gd — Bewegung (WASD relativ zur Kamera), Springen, Schwerkraft
|
||||
- Stats: player_stats.tres (→ Resources)
|
||||
|
||||
## Kampf
|
||||
- combat.gd — Input-Handler: emittiert ability_use_requested, auto_attack_tick (Logik → CombatSystem)
|
||||
- targeting.gd — Raycast/Klick/TAB: emittiert target_requested, speichert Ziel aus Events (Logik → AggroSystem)
|
||||
- role.gd — Rollenwechsel ALT+1 bis ALT+3 (Tank/Schaden/Heiler), tauscht AbilitySet
|
||||
- Auto-Attack: Automatisch bei anvisiertem Gegner im Kampf
|
||||
- Jede Rolle hat ein eigenes AbilitySet (→ Resources)
|
||||
- Beim Rollenwechsel wird das AbilitySet getauscht
|
||||
- Elemente und Modifikatoren verändern Abilities nachträglich
|
||||
|
||||
## Gegner
|
||||
- enemy.tscn — CharacterBody3D
|
||||
- Gruppe (enemies)
|
||||
- Kollision (CapsuleShape3D)
|
||||
- Mesh (SphereMesh, Platzhalter)
|
||||
- Health (Node, health.gd)
|
||||
- Shield (Node, shield.gd)
|
||||
- HitArea (Area3D, Trefferbereich des Gegners)
|
||||
- CollisionShape3D (CapsuleShape3D)
|
||||
- DetectionArea (Area3D, Erkennungsradius)
|
||||
- CollisionShape3D (SphereShape3D)
|
||||
- NavigationAgent3D (Wegfindung)
|
||||
- EnemyMovement (Node, enemy_movement.gd)
|
||||
- Healthbar (Sprite3D + SubViewport, über dem Gegner, healthbar.gd)
|
||||
- SubViewport
|
||||
- Border (ColorRect, gelb, sichtbar bei Anvisierung)
|
||||
- HealthBar (ProgressBar, grün)
|
||||
- ShieldBar (ProgressBar, blau)
|
||||
- enemy.gd — Daten-Holder (state, target, spawn_position, portal), Detection-Area → enemy_detected, Gruppe "enemies" (State Machine → EnemyAISystem)
|
||||
- enemy_movement.gd — Empfängt Bewegungsbefehle, führt NavAgent + move_and_slide aus (Entscheidungen → EnemyAISystem)
|
||||
- Stats: enemy_stats.tres (→ Resources)
|
||||
- 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 10m Portal-Radius: Aggro verfällt 1% * 2 je s (1%, 2%, 4%, 8%, ...)
|
||||
- Ohne Aggro: Gegner kehrt zum Portal zurück, regeneriert 10% Leben/s bis 100%, dann 1%/s
|
||||
- Bei Spieler-Tod → Aggro auf 0
|
||||
|
||||
## Portal
|
||||
- portal.tscn — StaticBody3D
|
||||
- Gruppe (portals)
|
||||
- Kollision (CylinderShape3D)
|
||||
- Mesh (CylinderMesh, blau)
|
||||
- Health (Node, health.gd)
|
||||
- HitArea (Area3D, Trefferbereich)
|
||||
- CollisionShape3D
|
||||
- DetectionArea (Area3D, 10m Radius, Auto-Targeting bei Betreten)
|
||||
- CollisionShape3D (SphereShape3D)
|
||||
- Healthbar (Sprite3D + SubViewport, healthbar.gd)
|
||||
- portal.gd — Gruppe "portals", Detection-Area Signal (Death-Handling → SpawnSystem)
|
||||
- Stats: portal_stats.tres (→ Resources)
|
||||
- Phase 1: Angreifbar, HP-Bar, spawnt 3 Gegner bei 85%/70%/55%/40%/25%/10% Leben
|
||||
- Portal = Spawnpunkt, 10m Aggro-Radius
|
||||
|
||||
## Gate
|
||||
- gate.tscn — StaticBody3D (keine Kollision)
|
||||
- Mesh (CylinderMesh, grün, leuchtend)
|
||||
- GateArea (Area3D, 3m Radius, Spieler-Erkennung)
|
||||
- CollisionShape3D (SphereShape3D)
|
||||
- gate.gd — Konfigurierbar: target_scene, is_exit
|
||||
- Eingangs-Gate: Prüft nach 0.5s ob Spieler bereits in GateArea steht, speichert Portal-Position
|
||||
- Exit-Gate: 1s Aktivierungsdelay (verhindert Re-Triggern bei Spawn)
|
||||
- Beide Gates bestehen solange Boss lebt, verschwinden bei dungeon_cleared
|
||||
|
||||
## Dungeon
|
||||
- dungeon.tscn — Geschlossener Raum (15x90m, Wände, dunkles Licht)
|
||||
- Systems (HealthSystem, CombatSystem, AggroSystem, EnemyAISystem, SpawnSystem mode="dungeon")
|
||||
- NavigationRegion3D (Wegfindung)
|
||||
- Boden (PlaneMesh, dunkle Textur)
|
||||
- 4 Wände (StaticBody3D + BoxMesh, 3m hoch)
|
||||
- Spieler (Instanz von player.tscn, Position 0/1/-5)
|
||||
- HUD (Instanz von hud.tscn)
|
||||
- Gegnergruppen bei (15x15, 15x30, 15x45, 15x60), je 4 Gegner
|
||||
- Boss (Instanz von boss.tscn)
|
||||
- Exit-Gate (Instanz von gate.tscn, is_exit=true, Ecke bei -6/0/-4)
|
||||
- DungeonManager (Node, dungeon_manager.gd)
|
||||
- dungeon_manager.gd — Stellt Spieler wieder her (Boss-Tod/Dungeon-Clear → SpawnSystem)
|
||||
|
||||
## Boss
|
||||
- boss.tscn — CharacterBody3D (boss.gd)
|
||||
- Gruppe (enemies, boss)
|
||||
- Kollision (CapsuleShape3D, größer als Enemy)
|
||||
- Mesh (SphereMesh, lila, 1.5x Größe)
|
||||
- Health (Node, health.gd)
|
||||
- Shield (Node, shield.gd)
|
||||
- HitArea, DetectionArea, NavigationAgent3D, EnemyMovement
|
||||
- Healthbar (Sprite3D + SubViewport, healthbar.gd)
|
||||
- boss.gd — Erbt von enemy.gd, Gruppe "boss"
|
||||
- Stats: boss_stats.tres (→ Resources)
|
||||
- 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 — Autoload, speichert Spielerzustand zwischen Szenenwechseln
|
||||
- save_player(player), restore_player(player), clear_player(), clear()
|
||||
- returning_from_dungeon — Spieler kommt aus Dungeon, spawnt bei Gate-Position
|
||||
- dungeon_cleared — Boss tot, Gates werden entfernt, Spieler spawnt bei Taverne
|
||||
- portal_position (Vector3, Position des Gates für Rückkehr + Wiederherstellung)
|
||||
|
||||
## Gemeinsame Komponenten
|
||||
- health.gd — Registriert Entity beim HealthSystem mit EntityStats, deregistriert bei _exit_tree
|
||||
- shield.gd — Registriert Entity beim HealthSystem mit EntityStats, deregistriert bei _exit_tree
|
||||
- healthbar.gd — Liest Health/Shield (optional) vom Parent, gelber Rand bei Anvisierung, blauer Lebensbalken wenn Spieler Ziel ist (nur bei Gegnern)
|
||||
|
||||
## Resources
|
||||
### EntityStats (entity_stats.gd)
|
||||
- Felder: max_health, health_regen, max_shield, shield_regen_delay, shield_regen_time
|
||||
- player_stats.tres → Player — health=100, regen=1/s, shield=50, delay=3s, regen_time=5s
|
||||
- enemy_stats.tres → Enemy — health=100, regen=0, shield=50, delay=3s, regen_time=5s
|
||||
- boss_stats.tres → Boss — health=500, regen=0, shield=100, delay=5s, regen_time=8s
|
||||
- portal_stats.tres → Portal — health=500, regen=0, shield=0
|
||||
|
||||
### Ability (ability.gd)
|
||||
- Felder: ability_name, type, damage, ability_range, cooldown, uses_gcd, aoe_radius, is_heal, passive_stat
|
||||
- Typen: Single, AOE, Utility, Ult, Passive
|
||||
- ability_modifier.gd — Verändert Ability (Element, Beruf, Prestige)
|
||||
- Schadens-Klasse:
|
||||
- AA: 25 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 (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 (permanent aktiv, kein CD)
|
||||
- Heiler-Klasse: Kein Autotarget, Selfheal wenn kein Spieler anvisiert
|
||||
- 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 (permanent aktiv, kein CD)
|
||||
|
||||
### AbilitySet (ability_set.gd)
|
||||
- Felder: 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
|
||||
|
||||
## HUD
|
||||
- hud.tscn — CanvasLayer (hud.gd)
|
||||
- HealthBar (ProgressBar, links oben, Label "50/100")
|
||||
- ShieldBar (ProgressBar, links oben, unter HealthBar, Label "25/50")
|
||||
- RespawnTimer (Label, mitte, Countdown bei Tod)
|
||||
- AbilityBar (HBoxContainer, mitte unten)
|
||||
- RoleIcon (Label, T=Tank, D=Schaden, H=Heiler)
|
||||
- Abilities (Label, Fähigkeiten 1-4, Passive P)
|
||||
- hud.gd — Reagiert auf Events, aktualisiert HealthBar/ShieldBar/AbilityBar/RespawnTimer
|
||||
|
||||
## Events
|
||||
- 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
|
||||
@@ -286,6 +52,10 @@
|
||||
- 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:
|
||||
@@ -293,3 +63,193 @@
|
||||
- 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)
|
||||
|
||||
Reference in New Issue
Block a user