190 lines
6.8 KiB
Markdown
190 lines
6.8 KiB
Markdown
# Datenflows
|
|
|
|
## 1. Kampf-Flow (Schaden)
|
|
|
|
```
|
|
Spieler drückt 1-4 Gegner im ATTACK-State
|
|
│ │
|
|
combat.gd enemy_ai_system.gd
|
|
│ │
|
|
▼ ▼
|
|
ability_use_requested ──► AbilitySystem ◄── _process (Auto-Attack)
|
|
│
|
|
damage_requested(attacker, target, amount)
|
|
│
|
|
▼
|
|
HealthSystem
|
|
├── ShieldSystem.absorb() → Schild reduzieren
|
|
│ └── shield_changed / shield_broken
|
|
├── damage_dealt ──► AggroSystem (Aggro aufbauen)
|
|
├── health_changed ──► Healthbar, HUD, SpawnSystem
|
|
└── falls HP=0: entity_died
|
|
│
|
|
┌───────────┼───────────┐
|
|
▼ ▼ ▼
|
|
AggroSystem RespawnSystem SpawnSystem
|
|
(Tabelle (Spieler: (Portal:
|
|
aufräumen) 3s → Taverne) Daten löschen)
|
|
```
|
|
|
|
## 2. Kampf-Flow (Heilung)
|
|
|
|
```
|
|
Heiler drückt 1/2/4 (is_heal) oder Auto-Attack (aa_is_heal)
|
|
│
|
|
AbilitySystem
|
|
│
|
|
heal_requested(healer, target, amount)
|
|
│
|
|
├──► HealthSystem → HP erhöhen → health_changed → HUD
|
|
└──► AggroSystem → 0.5x Aggro auf ALLE Gegner die Heiler kennen
|
|
```
|
|
|
|
## 3. Aggro-Flow
|
|
|
|
```
|
|
damage_dealt ──► AggroSystem._on_damage_dealt()
|
|
│ Tank-Rolle → 2x Multiplikator
|
|
▼
|
|
aggro_tables[enemy][player] += amount
|
|
|
|
heal_requested ──► AggroSystem._on_heal_requested()
|
|
│ 0.5x auf ALLE Gegner mit Heiler in Tabelle
|
|
▼
|
|
aggro_tables[enemy][healer] += amount * 0.5
|
|
|
|
enemy_detected ──► AggroSystem._on_enemy_detected()
|
|
│ +1 Aggro, State → CHASE
|
|
└──► _alert_nearby() → Nachbarn im alert_radius auch aktivieren
|
|
|
|
_process(delta):
|
|
├── Aggro decay: -aggro_decay/s
|
|
├── Außerhalb Portal-Radius: exponentieller Decay (+1%·2^sekunden)
|
|
├── Innerhalb Portal-Radius: Minimum 1.0 Aggro
|
|
└── _update_target(): Höchster Aggro-Wert → enemy.target + State
|
|
```
|
|
|
|
## 4. Portal → Dungeon Flow
|
|
|
|
```
|
|
Portal wird angegriffen
|
|
│
|
|
health_changed ──► SpawnSystem
|
|
│ └── HP-Schwellen (85/70/55/40/25/10%) → Gegner spawnen
|
|
│ └── portal_spawn Signal
|
|
▼
|
|
Portal HP = 0 → entity_died
|
|
│
|
|
portal.gd: _on_entity_died()
|
|
├── Mesh → grün (Gate-Look)
|
|
├── Gegner mit Portal löschen
|
|
└── Gate instanzieren an Portal-Position
|
|
└── portal_defeated Signal
|
|
|
|
Spieler betritt Gate
|
|
│
|
|
gate.gd: _on_gate_area_body_entered()
|
|
├── GameState.save_player() → Rolle speichern
|
|
├── Stats.deregister() → player_cache befüllen
|
|
└── change_scene → dungeon.tscn
|
|
│
|
|
dungeon_manager.gd _ready()
|
|
├── Stats.register() → player_cache wiederherstellen
|
|
└── GameState.restore_player() → Rolle setzen
|
|
```
|
|
|
|
## 5. Dungeon → Welt Flow
|
|
|
|
```
|
|
Boss stirbt → entity_died
|
|
│
|
|
dungeon_manager.gd: _on_entity_died()
|
|
├── 2s warten
|
|
├── GameState.dungeon_cleared = true
|
|
├── GameState.clear() → Stats.clear_player_cache()
|
|
├── dungeon_cleared Signal
|
|
└── change_scene → world.tscn
|
|
│
|
|
Spieler spawnt bei Taverne (0, 1, -5)
|
|
volle HP + Schild (durch clear_player_cache)
|
|
|
|
Exit-Gate (zurück zur Welt ohne Boss-Kill):
|
|
├── GameState.returning_from_dungeon = true
|
|
└── change_scene → world.tscn
|
|
└── Spieler bei portal_position, Stats aus Cache
|
|
```
|
|
|
|
## 6. Rollen-Flow
|
|
|
|
```
|
|
Spieler drückt ALT+1/2/3
|
|
│
|
|
role.gd: set_role()
|
|
│
|
|
role_changed(player, role_type)
|
|
│
|
|
├──► BuffSystem: Passive-Buffs berechnen
|
|
│ ├── buff_damage/buff_heal/buff_shield in Stats setzen
|
|
│ ├── max_shield anpassen (Tank-Passive)
|
|
│ └── buff_changed + shield_changed Signals
|
|
│
|
|
└──► CooldownSystem: Alle Cooldowns zurücksetzen
|
|
```
|
|
|
|
## 7. Cooldown-Flow
|
|
|
|
```
|
|
AbilitySystem führt Ability aus
|
|
│
|
|
CooldownSystem.set_cooldown(player, index, cd, gcd)
|
|
│
|
|
_process(delta): Alle Timer runterzählen
|
|
│
|
|
cooldown_tick(cds, max_cds, gcd_timer) ──► HUD (Ability-Icons updaten)
|
|
│
|
|
AbilitySystem fragt vor Ausführung:
|
|
├── is_ready(player, index) — Ability-CD abgelaufen?
|
|
├── is_gcd_ready(player) — GCD abgelaufen?
|
|
└── is_aa_ready(player) — Auto-Attack bereit?
|
|
```
|
|
|
|
## 8. Respawn-Flow
|
|
|
|
```
|
|
entity_died (Spieler)
|
|
│
|
|
RespawnSystem._on_entity_died()
|
|
├── Mesh/Collision/Input deaktivieren
|
|
└── dead_players[player] = 3.0s
|
|
|
|
_process(delta):
|
|
├── Timer runterzählen
|
|
├── respawn_tick → HUD (Countdown anzeigen)
|
|
└── Timer ≤ 0: _respawn()
|
|
├── Position → Taverne (0, 1, -5)
|
|
├── HP/Schild auf Max
|
|
├── Mesh/Collision/Input reaktivieren
|
|
├── health_changed + shield_changed
|
|
└── player_respawned
|
|
```
|
|
|
|
## Signalübersicht
|
|
|
|
| Signal | Sender | Empfänger |
|
|
|---|---|---|
|
|
| `ability_use_requested` | Combat | AbilitySystem |
|
|
| `damage_requested` | AbilitySystem, EnemyAI | HealthSystem |
|
|
| `heal_requested` | AbilitySystem | HealthSystem, AggroSystem |
|
|
| `damage_dealt` | HealthSystem | AggroSystem, Targeting |
|
|
| `health_changed` | HealthSystem, RespawnSystem | SpawnSystem, Healthbar, HUD |
|
|
| `shield_changed` | ShieldSystem, AbilitySystem, BuffSystem, RespawnSystem | Healthbar, HUD |
|
|
| `entity_died` | HealthSystem | AggroSystem, RespawnSystem, SpawnSystem, Targeting, DungeonManager, Portal |
|
|
| `role_changed` | Role | BuffSystem, CooldownSystem |
|
|
| `enemy_detected` | Enemy (DetectionArea) | AggroSystem |
|
|
| `enemy_engaged` | AggroSystem | Targeting |
|
|
| `cooldown_tick` | CooldownSystem | HUD |
|
|
| `respawn_tick` | RespawnSystem | HUD |
|
|
| `dungeon_cleared` | DungeonManager | Gate |
|
|
| `portal_defeated` | Portal | — |
|
|
| `player_respawned` | RespawnSystem | — |
|