Files
mmo/flow.md
Marek Lenczewski 47f4fe3d90 update
2026-04-02 16:02:24 +02:00

6.8 KiB

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