10 KiB
10 KiB
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)