diff --git a/CLAUDE.md b/CLAUDE.md index e7bb0ec..7a97f5a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -24,30 +24,19 @@ Der User kommuniziert auf Deutsch. Code und Variablen auf Englisch. Kommentare n - **Resources** für Basiswerte (Stats, Abilities), **Stats Autoload** für Laufzeitwerte ## Projektstruktur -- `scenes/` — .tscn Dateien - - `world.tscn` — Hauptszene (100x100m, Taverne, 10 Systeme) - - `player/player.tscn` — Spieler - - `enemy/enemy.tscn` — Gegner - - `enemy/boss.tscn` — Boss - - `portal/portal.tscn` — Portal - - `portal/gate.tscn` — Gate (Teleporter) - - `dungeon/dungeon.tscn` — Dungeon (15x90m, 10 Systeme) - - `hud/hud.tscn` — HUD -- `scripts/systems/` — 10 Systeme (health, shield, damage, ability, cooldown, aggro, enemy_ai, respawn, spawn, buff) -- `scripts/player/` — Spieler-Skripte (player, camera, movement, combat, targeting, role, hud) -- `scripts/enemy/` — Gegner-Skripte (enemy, enemy_movement, boss) -- `scripts/portal/` — Portal + Gate (portal, gate) -- `scripts/dungeon/` — Dungeon-Logik (dungeon_manager) -- `scripts/components/` — Healthbar (healthbar) -- `scripts/abilities/` — Ability-Daten (ability, ability_set) -- `scripts/resources/` — Resource-Klassen (base_stats, player_stats, enemy_stats, boss_stats, portal_stats) -- `scripts/event_bus.gd` — Globale Signals -- `scripts/stats.gd` — Zentrale Entity-Datenhaltung -- `scripts/game_state.gd` — Szene + Position zwischen Szenenwechseln -- `scripts/world/portal_spawner.gd` — Portal-Spawning -- `resources/stats/` — Stats .tres (player_stats, enemy_stats, portal_stats, boss_stats) -- `resources/abilities/` — Ability .tres pro Rolle -- `resources/ability_sets/` — AbilitySet .tres pro Rolle (tank_set, damage_set, healer_set) +- `player/` — Spieler (.tscn + .gd): player, camera, movement, combat, targeting, role +- `enemy/` — Gegner (.tscn + .gd): enemy, enemy_movement, boss +- `portal/` — Portal + Gate (.tscn + .gd): portal, gate +- `dungeon/` — Dungeon (.tscn + .gd): dungeon, dungeon_manager +- `hud/` — HUD (.tscn + .gd): hud +- `world/` — Hauptszene (.tscn + .gd): world, portal_spawner +- `systems/` — 10 Systeme: health, shield, damage, ability, cooldown, aggro, enemy_ai, respawn, spawn, buff +- `autoload/` — EventBus (event_bus), Stats (stats), GameState (game_state) +- `components/` — Shared Components: healthbar +- `resources/stats/` — Stats-Klassen (.gd) + Daten (.tres): base_stats, player_stats, enemy_stats, boss_stats, portal_stats +- `resources/roles/` — Ability/AbilitySet-Klassen (.gd) + pro Rolle (damage, tank, healer): + - `{rolle}/set.tres` — AbilitySet der Rolle + - `{rolle}/abilities/` — Abilities (single, aoe, utility, ult, passive) ## Planungsdokument `plan.md` enthält die vollständige Projektstruktur: Szenenbaum, Szenen mit Nodes, Skripte, Components, Stats, Aggro-Regeln, Abilities und Events. Dieses Dokument ist die Wahrheit für den Soll-Zustand. diff --git a/scripts/event_bus.gd b/autoload/event_bus.gd similarity index 100% rename from scripts/event_bus.gd rename to autoload/event_bus.gd diff --git a/scripts/event_bus.gd.uid b/autoload/event_bus.gd.uid similarity index 100% rename from scripts/event_bus.gd.uid rename to autoload/event_bus.gd.uid diff --git a/scripts/game_state.gd b/autoload/game_state.gd similarity index 100% rename from scripts/game_state.gd rename to autoload/game_state.gd diff --git a/scripts/game_state.gd.uid b/autoload/game_state.gd.uid similarity index 100% rename from scripts/game_state.gd.uid rename to autoload/game_state.gd.uid diff --git a/scripts/stats.gd b/autoload/stats.gd similarity index 100% rename from scripts/stats.gd rename to autoload/stats.gd diff --git a/scripts/stats.gd.uid b/autoload/stats.gd.uid similarity index 100% rename from scripts/stats.gd.uid rename to autoload/stats.gd.uid diff --git a/scripts/components/healthbar.gd b/components/healthbar.gd similarity index 100% rename from scripts/components/healthbar.gd rename to components/healthbar.gd diff --git a/scripts/components/healthbar.gd.uid b/components/healthbar.gd.uid similarity index 100% rename from scripts/components/healthbar.gd.uid rename to components/healthbar.gd.uid diff --git a/scenes/dungeon/dungeon.tscn b/dungeon/dungeon.tscn similarity index 81% rename from scenes/dungeon/dungeon.tscn rename to dungeon/dungeon.tscn index a33f1cc..26cc1ff 100644 --- a/scenes/dungeon/dungeon.tscn +++ b/dungeon/dungeon.tscn @@ -1,21 +1,21 @@ [gd_scene format=3] -[ext_resource type="PackedScene" path="res://scenes/player/player.tscn" id="player"] -[ext_resource type="PackedScene" path="res://scenes/hud/hud.tscn" id="hud"] -[ext_resource type="PackedScene" path="res://scenes/enemy/enemy.tscn" id="enemy"] -[ext_resource type="PackedScene" path="res://scenes/enemy/boss.tscn" id="boss"] -[ext_resource type="Script" path="res://scripts/dungeon/dungeon_manager.gd" id="dungeon_manager"] -[ext_resource type="PackedScene" path="res://scenes/portal/gate.tscn" id="gate"] -[ext_resource type="Script" path="res://scripts/systems/health_system.gd" id="health_system"] -[ext_resource type="Script" path="res://scripts/systems/shield_system.gd" id="shield_system"] -[ext_resource type="Script" path="res://scripts/systems/damage_system.gd" id="damage_system"] -[ext_resource type="Script" path="res://scripts/systems/ability_system.gd" id="ability_system"] -[ext_resource type="Script" path="res://scripts/systems/cooldown_system.gd" id="cooldown_system"] -[ext_resource type="Script" path="res://scripts/systems/aggro_system.gd" id="aggro_system"] -[ext_resource type="Script" path="res://scripts/systems/enemy_ai_system.gd" id="enemy_ai_system"] -[ext_resource type="Script" path="res://scripts/systems/respawn_system.gd" id="respawn_system"] -[ext_resource type="Script" path="res://scripts/systems/spawn_system.gd" id="spawn_system"] -[ext_resource type="Script" path="res://scripts/systems/buff_system.gd" id="buff_system"] +[ext_resource type="PackedScene" path="res://player/player.tscn" id="player"] +[ext_resource type="PackedScene" path="res://hud/hud.tscn" id="hud"] +[ext_resource type="PackedScene" path="res://enemy/enemy.tscn" id="enemy"] +[ext_resource type="PackedScene" path="res://enemy/boss.tscn" id="boss"] +[ext_resource type="Script" path="res://dungeon/dungeon_manager.gd" id="dungeon_manager"] +[ext_resource type="PackedScene" path="res://portal/gate.tscn" id="gate"] +[ext_resource type="Script" path="res://systems/health_system.gd" id="health_system"] +[ext_resource type="Script" path="res://systems/shield_system.gd" id="shield_system"] +[ext_resource type="Script" path="res://systems/damage_system.gd" id="damage_system"] +[ext_resource type="Script" path="res://systems/ability_system.gd" id="ability_system"] +[ext_resource type="Script" path="res://systems/cooldown_system.gd" id="cooldown_system"] +[ext_resource type="Script" path="res://systems/aggro_system.gd" id="aggro_system"] +[ext_resource type="Script" path="res://systems/enemy_ai_system.gd" id="enemy_ai_system"] +[ext_resource type="Script" path="res://systems/respawn_system.gd" id="respawn_system"] +[ext_resource type="Script" path="res://systems/spawn_system.gd" id="spawn_system"] +[ext_resource type="Script" path="res://systems/buff_system.gd" id="buff_system"] [sub_resource type="NavigationMesh" id="NavigationMesh_1"] vertices = PackedVector3Array(-7.0, 0.5, -7.0, -7.0, 0.5, 87.0, 7.0, 0.5, 87.0, 7.0, 0.5, -7.0) @@ -192,7 +192,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 75) [node name="ExitGate" parent="." instance=ExtResource("gate")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6, 0, -4) -target_scene = "res://scenes/world.tscn" +target_scene = "res://world/world.tscn" is_exit = true [node name="DungeonManager" type="Node" parent="."] diff --git a/scripts/dungeon/dungeon_manager.gd b/dungeon/dungeon_manager.gd similarity index 88% rename from scripts/dungeon/dungeon_manager.gd rename to dungeon/dungeon_manager.gd index 7fb9d36..5f4940b 100644 --- a/scripts/dungeon/dungeon_manager.gd +++ b/dungeon/dungeon_manager.gd @@ -13,4 +13,4 @@ func _on_entity_died(entity: Node) -> void: GameState.returning_from_dungeon = false GameState.clear() EventBus.dungeon_cleared.emit() - get_tree().change_scene_to_file("res://scenes/world.tscn") + get_tree().change_scene_to_file("res://world/world.tscn") diff --git a/scripts/dungeon/dungeon_manager.gd.uid b/dungeon/dungeon_manager.gd.uid similarity index 100% rename from scripts/dungeon/dungeon_manager.gd.uid rename to dungeon/dungeon_manager.gd.uid diff --git a/scripts/enemy/boss.gd b/enemy/boss.gd similarity index 62% rename from scripts/enemy/boss.gd rename to enemy/boss.gd index ac8a2c3..ac0df03 100644 --- a/scripts/enemy/boss.gd +++ b/enemy/boss.gd @@ -1,4 +1,4 @@ -extends "res://scripts/enemy/enemy.gd" +extends "res://enemy/enemy.gd" func _ready() -> void: super._ready() diff --git a/scripts/enemy/boss.gd.uid b/enemy/boss.gd.uid similarity index 100% rename from scripts/enemy/boss.gd.uid rename to enemy/boss.gd.uid diff --git a/scenes/enemy/boss.tscn b/enemy/boss.tscn similarity index 93% rename from scenes/enemy/boss.tscn rename to enemy/boss.tscn index 68df57e..c2fa114 100644 --- a/scenes/enemy/boss.tscn +++ b/enemy/boss.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=6 format=3] -[ext_resource type="Script" path="res://scripts/enemy/boss.gd" id="1"] -[ext_resource type="Script" path="res://scripts/components/healthbar.gd" id="4"] -[ext_resource type="Script" path="res://scripts/enemy/enemy_movement.gd" id="5"] +[ext_resource type="Script" path="res://enemy/boss.gd" id="1"] +[ext_resource type="Script" path="res://components/healthbar.gd" id="4"] +[ext_resource type="Script" path="res://enemy/enemy_movement.gd" id="5"] [ext_resource type="Resource" path="res://resources/stats/boss_stats.tres" id="8"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1"] diff --git a/scripts/enemy/enemy.gd b/enemy/enemy.gd similarity index 100% rename from scripts/enemy/enemy.gd rename to enemy/enemy.gd diff --git a/scripts/enemy/enemy.gd.uid b/enemy/enemy.gd.uid similarity index 100% rename from scripts/enemy/enemy.gd.uid rename to enemy/enemy.gd.uid diff --git a/scenes/enemy/enemy.tscn b/enemy/enemy.tscn similarity index 93% rename from scenes/enemy/enemy.tscn rename to enemy/enemy.tscn index 37dc84f..8738477 100644 --- a/scenes/enemy/enemy.tscn +++ b/enemy/enemy.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=6 format=3] -[ext_resource type="Script" path="res://scripts/enemy/enemy.gd" id="1"] -[ext_resource type="Script" path="res://scripts/components/healthbar.gd" id="4"] -[ext_resource type="Script" path="res://scripts/enemy/enemy_movement.gd" id="5"] +[ext_resource type="Script" path="res://enemy/enemy.gd" id="1"] +[ext_resource type="Script" path="res://components/healthbar.gd" id="4"] +[ext_resource type="Script" path="res://enemy/enemy_movement.gd" id="5"] [ext_resource type="Resource" path="res://resources/stats/enemy_stats.tres" id="8"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1"] diff --git a/scripts/enemy/enemy_movement.gd b/enemy/enemy_movement.gd similarity index 100% rename from scripts/enemy/enemy_movement.gd rename to enemy/enemy_movement.gd diff --git a/scripts/enemy/enemy_movement.gd.uid b/enemy/enemy_movement.gd.uid similarity index 100% rename from scripts/enemy/enemy_movement.gd.uid rename to enemy/enemy_movement.gd.uid diff --git a/flow.md b/flow.md new file mode 100644 index 0000000..b1862d5 --- /dev/null +++ b/flow.md @@ -0,0 +1,189 @@ +# 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 | — | diff --git a/scripts/player/hud.gd b/hud/hud.gd similarity index 100% rename from scripts/player/hud.gd rename to hud/hud.gd diff --git a/scripts/player/hud.gd.uid b/hud/hud.gd.uid similarity index 100% rename from scripts/player/hud.gd.uid rename to hud/hud.gd.uid diff --git a/scenes/hud/hud.tscn b/hud/hud.tscn similarity index 98% rename from scenes/hud/hud.tscn rename to hud/hud.tscn index c2689b6..bfd5010 100644 --- a/scenes/hud/hud.tscn +++ b/hud/hud.tscn @@ -1,6 +1,6 @@ [gd_scene format=3] -[ext_resource type="Script" path="res://scripts/player/hud.gd" id="1"] +[ext_resource type="Script" path="res://hud/hud.gd" id="1"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ability_active"] bg_color = Color(0.2, 0.2, 0.2, 0.8) diff --git a/plan.md b/plan.md index 5db5ad7..fac52a6 100644 --- a/plan.md +++ b/plan.md @@ -1,92 +1,116 @@ # Projektstruktur + +## Ordnerstruktur +``` +player/ — Spieler (.tscn + .gd) +enemy/ — Gegner + Boss (.tscn + .gd) +portal/ — Portal + Gate (.tscn + .gd) +dungeon/ — Dungeon (.tscn + .gd) +hud/ — HUD (.tscn + .gd) +world/ — Hauptszene (.tscn + .gd) +systems/ — 10 Gameplay-Systeme (.gd) +autoload/ — EventBus, Stats, GameState (.gd) +components/ — Shared UI: healthbar (.gd) +resources/ + stats/ — Stats-Klassen (.gd) + Daten (.tres) + roles/ — Ability/AbilitySet-Klassen (.gd) + Rollen-Daten + damage/ — set.tres + abilities/ + tank/ — set.tres + abilities/ + healer/ — set.tres + abilities/ +``` + ## Szenenbaum - Welt - - Systems (HealthSystem, ShieldSystem, RespawnSystem, AbilitySystem, BuffSystem, CooldownSystem, DamageSystem, AggroSystem, EnemyAISystem, SpawnSystem) + - Systems (10 Systeme als Child-Nodes) - 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 +- Resources (stats/, roles/) — Datenmodelle + Basiswerte, werden später zu Go-Structs + DB +- Autoload (Stats) — Laufzeit-Datenhaltung, wird später zu Server-API-Client +- Systeme — Spiellogik, lesen/schreiben über Stats +- Szenen — Views, rendern + Input, kein Gameplay-State +- EventBus — Signale zwischen Szenen und Systemen +- Flow: Szene → Input → EventBus → System → Stats → EventBus → 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 + +## EventBus (autoload/event_bus.gd) - Intentionen (Input → System): - - ability_use_requested(player, ability_index) — Spieler will Ability nutzen - - enemy_detected(enemy, player) — Spieler in Detection-Area + - ability_use_requested(player, ability_index) + - enemy_detected(enemy, player) - 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 anfordern - - heal_requested(healer, target, amount) — Heilung anfordern + - attack_executed(attacker, position, direction, damage) + - damage_dealt(attacker, target, damage) + - damage_requested(attacker, target, amount) + - heal_requested(healer, target, amount) - 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 + - entity_died(entity) + - health_changed(entity, current, max) + - shield_changed(entity, current, max) + - shield_broken(entity) + - shield_regenerated(entity) - 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 + - target_changed(player, target) + - player_respawned(player) + - role_changed(player, role_type) + - respawn_tick(timer) + - cooldown_tick(cooldowns, max_cooldowns, gcd_timer) - Buff: - - buff_changed(entity, stat, value) — Buff hat sich verändert + - buff_changed(entity, stat, value) - Gegner: - - enemy_engaged(enemy, target) — Gegner hat Spieler anvisiert + - enemy_engaged(enemy, target) - Portal: - - portal_spawn(portal, enemies) — Portal hat Gegner gespawnt - - portal_defeated(portal) — Portal besiegt, wird Gate + - portal_spawn(portal, enemies) + - portal_defeated(portal) - Dungeon: - - dungeon_cleared() — Boss tot, Dungeon gesäubert -- Reserviert (definiert, noch nicht genutzt): + - dungeon_cleared() +- Reserviert: - auto_attack_tick, target_requested, combat_state_changed, enemy_state_changed, enemy_target_changed, regeneration_changed +## Stats (autoload/stats.gd) +- Speichert aktuelle Attribute aller Entities +- Basiswerte aus BaseStats Resource +- player_cache für Szenenwechsel + +## GameState (autoload/game_state.gd) +- Speichert Rolle + Position zwischen Szenenwechseln + # Resources -## BaseStats + +## resources/stats/ +### BaseStats (base_stats.gd) - max_health, health_regen, max_shield, shield_regen_delay, shield_regen_time -## PlayerStats (extends BaseStats) +### PlayerStats (player_stats.gd, extends BaseStats) - speed, jump_velocity, target_range, combat_timeout, respawn_time, gcd_time, aa_cooldown -## EnemyStats (extends BaseStats) +### EnemyStats (enemy_stats.gd, 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) +### BossStats (boss_stats.gd, extends EnemyStats) +### PortalStats (portal_stats.gd, 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 + +## resources/roles/ +### Ability (ability.gd) - ability_name, type, damage, ability_range, cooldown, uses_gcd, aoe_radius, icon, is_heal, passive_stat - Typen: Single, AOE, Utility, Ult, Passive -## AbilityModifier +### AbilitySet (ability_set.gd) +- abilities (Array[Ability]), aa_damage, aa_range, aa_is_heal +### AbilityModifier (geplant) - Verändert Ability (Element, Beruf, Prestige) +### Rollen-Ordner (damage/, tank/, healer/) +- set.tres — AbilitySet der Rolle +- abilities/ — 5 Ability .tres pro Rolle (single, aoe, utility, ult, passive) -# Systeme +# Systeme (systems/) - In jeder Root-Szene instanziert (world.tscn, dungeon.tscn) - Entities registrieren/deregistrieren sich bei Stats - Systeme lesen/schreiben über Stats + ### HealthSystem (health_system.gd) - Leben und Lebensregeneration berechnen, Tod bei 0 HP - Listener: damage_requested, heal_requested @@ -132,7 +156,7 @@ - Entities registrieren sich bei Stats in _ready(), deregistrieren in _exit_tree() - Stats cached Spieler-Werte automatisch bei Szenenwechsel (player_cache) -## Welt +## Welt (world/) - world.tscn — Hauptszene (100x100m) - Systems (alle 10 Systeme als Child-Nodes) - NavigationRegion3D @@ -144,7 +168,7 @@ - HUD (Instanz von hud.tscn) - PortalSpawner (Node, portal_spawner.gd) -## Spieler +## Spieler (player/) - player.tscn — CharacterBody3D - Gruppe (player) - Kollision (CapsuleShape3D, 1.8m x 0.3m) @@ -158,7 +182,7 @@ - player.gd — Registriert bei Stats mit PlayerStats Resource, Sichtbarkeit bei Tod/Respawn - camera.gd — LMB freies Umsehen, RMB Kamera + Laufrichtung -## Gegner +## Gegner (enemy/) - enemy.tscn — CharacterBody3D - Gruppe (enemies) - Kollision (CapsuleShape3D) @@ -179,12 +203,12 @@ - Ohne Aggro: Gegner kehrt zum Portal zurück, regeneriert - Bei Spieler-Tod → Aggro auf 0 -## Boss +## Boss (enemy/) - 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 (portal/) - portal.tscn — StaticBody3D - Gruppe (portals) - Kollision (CylinderShape3D) @@ -195,14 +219,14 @@ - portal.gd — Registriert bei Stats mit PortalStats Resource - Spawnt Gegner bei HP-Schwellen (→ SpawnSystem) -## Gate +## Gate (portal/) - 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 (dungeon/) - dungeon.tscn — Geschlossener Raum (15x90m, Wände, dunkles Licht) - Systems (alle 10 Systeme, temporär bis Welt parallel läuft) - NavigationRegion3D @@ -215,7 +239,7 @@ - DungeonManager (Node, dungeon_manager.gd) - Eigene Systems bis Welt parallel läuft (geplant: Reparenting) -## HUD +## HUD (hud/) - hud.tscn — CanvasLayer - HealthBar (ProgressBar, Label) - ShieldBar (ProgressBar, Label) @@ -223,7 +247,7 @@ - AbilityBar (HBoxContainer, RoleIcon + Abilities 1-4 + Passive) - hud.gd — Reagiert auf Events, liest Werte von Stats -## Abilities (Werte) +# Abilities (Werte) - Schadens-Klasse: - AA: 10 Schaden, 10m - 1 Single: 30 Schaden, 20m Range, 2s CD, GCD diff --git a/scripts/player/camera.gd b/player/camera.gd similarity index 100% rename from scripts/player/camera.gd rename to player/camera.gd diff --git a/scripts/player/camera.gd.uid b/player/camera.gd.uid similarity index 100% rename from scripts/player/camera.gd.uid rename to player/camera.gd.uid diff --git a/scripts/player/combat.gd b/player/combat.gd similarity index 100% rename from scripts/player/combat.gd rename to player/combat.gd diff --git a/scripts/player/combat.gd.uid b/player/combat.gd.uid similarity index 100% rename from scripts/player/combat.gd.uid rename to player/combat.gd.uid diff --git a/scripts/player/movement.gd b/player/movement.gd similarity index 100% rename from scripts/player/movement.gd rename to player/movement.gd diff --git a/scripts/player/movement.gd.uid b/player/movement.gd.uid similarity index 100% rename from scripts/player/movement.gd.uid rename to player/movement.gd.uid diff --git a/scripts/player/player.gd b/player/player.gd similarity index 100% rename from scripts/player/player.gd rename to player/player.gd diff --git a/scripts/player/player.gd.uid b/player/player.gd.uid similarity index 100% rename from scripts/player/player.gd.uid rename to player/player.gd.uid diff --git a/scenes/player/player.tscn b/player/player.tscn similarity index 82% rename from scenes/player/player.tscn rename to player/player.tscn index 95f959a..a99f726 100644 --- a/scenes/player/player.tscn +++ b/player/player.tscn @@ -1,14 +1,14 @@ [gd_scene format=3 uid="uid://cdnkbt1f0db7e"] -[ext_resource type="Script" uid="uid://bfpt2p7uucfyb" path="res://scripts/player/player.gd" id="1"] -[ext_resource type="Script" uid="uid://cohjyjge1kqxb" path="res://scripts/player/camera.gd" id="2"] -[ext_resource type="Script" uid="uid://fg87dh8fbc8" path="res://scripts/player/movement.gd" id="3"] -[ext_resource type="Script" uid="uid://d15til6fsxw5b" path="res://scripts/player/combat.gd" id="4"] -[ext_resource type="Script" uid="uid://b05nkuryipwny" path="res://scripts/player/targeting.gd" id="8"] -[ext_resource type="Script" path="res://scripts/player/role.gd" id="10"] -[ext_resource type="Resource" uid="uid://cgxtn7dfs40bh" path="res://resources/ability_sets/tank_set.tres" id="11"] -[ext_resource type="Resource" uid="uid://beodknb6i1pm4" path="res://resources/ability_sets/damage_set.tres" id="12"] -[ext_resource type="Resource" uid="uid://kcwuhnqy34mj" path="res://resources/ability_sets/healer_set.tres" id="13"] +[ext_resource type="Script" uid="uid://bfpt2p7uucfyb" path="res://player/player.gd" id="1"] +[ext_resource type="Script" uid="uid://cohjyjge1kqxb" path="res://player/camera.gd" id="2"] +[ext_resource type="Script" uid="uid://fg87dh8fbc8" path="res://player/movement.gd" id="3"] +[ext_resource type="Script" uid="uid://d15til6fsxw5b" path="res://player/combat.gd" id="4"] +[ext_resource type="Script" uid="uid://b05nkuryipwny" path="res://player/targeting.gd" id="8"] +[ext_resource type="Script" path="res://player/role.gd" id="10"] +[ext_resource type="Resource" uid="uid://cgxtn7dfs40bh" path="res://resources/roles/tank/set.tres" id="11"] +[ext_resource type="Resource" uid="uid://beodknb6i1pm4" path="res://resources/roles/damage/set.tres" id="12"] +[ext_resource type="Resource" uid="uid://kcwuhnqy34mj" path="res://resources/roles/healer/set.tres" id="13"] [ext_resource type="Resource" path="res://resources/stats/player_stats.tres" id="14"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1"] diff --git a/scripts/player/role.gd b/player/role.gd similarity index 100% rename from scripts/player/role.gd rename to player/role.gd diff --git a/scripts/player/role.gd.uid b/player/role.gd.uid similarity index 100% rename from scripts/player/role.gd.uid rename to player/role.gd.uid diff --git a/scripts/player/targeting.gd b/player/targeting.gd similarity index 100% rename from scripts/player/targeting.gd rename to player/targeting.gd diff --git a/scripts/player/targeting.gd.uid b/player/targeting.gd.uid similarity index 100% rename from scripts/player/targeting.gd.uid rename to player/targeting.gd.uid diff --git a/scripts/portal/gate.gd b/portal/gate.gd similarity index 92% rename from scripts/portal/gate.gd rename to portal/gate.gd index 5b0c0dd..590d328 100644 --- a/scripts/portal/gate.gd +++ b/portal/gate.gd @@ -1,6 +1,6 @@ extends StaticBody3D -@export var target_scene: String = "res://scenes/dungeon/dungeon.tscn" +@export var target_scene: String = "res://dungeon/dungeon.tscn" @export var is_exit: bool = false var active := false diff --git a/scripts/portal/gate.gd.uid b/portal/gate.gd.uid similarity index 100% rename from scripts/portal/gate.gd.uid rename to portal/gate.gd.uid diff --git a/scenes/portal/gate.tscn b/portal/gate.tscn similarity index 92% rename from scenes/portal/gate.tscn rename to portal/gate.tscn index 9d76e8a..12159f1 100644 --- a/scenes/portal/gate.tscn +++ b/portal/gate.tscn @@ -1,6 +1,6 @@ [gd_scene format=3] -[ext_resource type="Script" path="res://scripts/portal/gate.gd" id="1"] +[ext_resource type="Script" path="res://portal/gate.gd" id="1"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1"] albedo_color = Color(0.1, 0.9, 0.3, 1) diff --git a/scripts/portal/portal.gd b/portal/portal.gd similarity index 81% rename from scripts/portal/portal.gd rename to portal/portal.gd index ebd3f81..419e34b 100644 --- a/scripts/portal/portal.gd +++ b/portal/portal.gd @@ -2,7 +2,7 @@ extends StaticBody3D @export var stats: BaseStats -const GATE_SCENE: PackedScene = preload("res://scenes/portal/gate.tscn") +const GATE_SCENE: PackedScene = preload("res://portal/gate.tscn") func _ready() -> void: add_to_group("portals") @@ -15,8 +15,11 @@ func _exit_tree() -> void: func _on_entity_died(entity: Node) -> void: if entity != self: return + if not is_inside_tree(): + return + var pos: Vector3 = global_position var gate: Node3D = GATE_SCENE.instantiate() - gate.global_position = global_position + gate.global_position = pos get_parent().add_child(gate) var enemies := get_tree().get_nodes_in_group("enemies") for enemy in enemies: diff --git a/scripts/portal/portal.gd.uid b/portal/portal.gd.uid similarity index 100% rename from scripts/portal/portal.gd.uid rename to portal/portal.gd.uid diff --git a/scenes/portal/portal.tscn b/portal/portal.tscn similarity index 93% rename from scenes/portal/portal.tscn rename to portal/portal.tscn index 3332a8f..c416696 100644 --- a/scenes/portal/portal.tscn +++ b/portal/portal.tscn @@ -1,7 +1,7 @@ [gd_scene format=3] -[ext_resource type="Script" path="res://scripts/portal/portal.gd" id="1"] -[ext_resource type="Script" path="res://scripts/components/healthbar.gd" id="3"] +[ext_resource type="Script" path="res://portal/portal.gd" id="1"] +[ext_resource type="Script" path="res://components/healthbar.gd" id="3"] [ext_resource type="Resource" path="res://resources/stats/portal_stats.tres" id="6"] [sub_resource type="SphereShape3D" id="SphereShape3D_1"] diff --git a/project.godot b/project.godot index fcf76ef..e213582 100644 --- a/project.godot +++ b/project.godot @@ -11,15 +11,15 @@ config_version=5 [application] config/name="mmo" -run/main_scene="res://scenes/world.tscn" +run/main_scene="res://world/world.tscn" config/features=PackedStringArray("4.6", "Forward Plus") config/icon="res://icon.svg" [autoload] -EventBus="*res://scripts/event_bus.gd" -Stats="*res://scripts/stats.gd" -GameState="*res://scripts/game_state.gd" +EventBus="*res://autoload/event_bus.gd" +Stats="*res://autoload/stats.gd" +GameState="*res://autoload/game_state.gd" [dotnet] diff --git a/resources/ability_sets/healer_set.tres b/resources/ability_sets/healer_set.tres deleted file mode 100644 index e1d351b..0000000 --- a/resources/ability_sets/healer_set.tres +++ /dev/null @@ -1,16 +0,0 @@ -[gd_resource type="Resource" script_class="AbilitySet" format=3 uid="uid://kcwuhnqy34mj"] - -[ext_resource type="Script" uid="uid://voedgs25cwrb" path="res://scripts/abilities/ability_set.gd" id="1"] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1_ability"] -[ext_resource type="Resource" path="res://resources/abilities/healer_single.tres" id="2"] -[ext_resource type="Resource" path="res://resources/abilities/healer_aoe.tres" id="3"] -[ext_resource type="Resource" uid="uid://du0hyuuj26ea0" path="res://resources/abilities/utility_shield_reset.tres" id="4"] -[ext_resource type="Resource" path="res://resources/abilities/healer_ult.tres" id="5"] -[ext_resource type="Resource" path="res://resources/abilities/healer_passive.tres" id="6"] - -[resource] -script = ExtResource("1") -abilities = Array[ExtResource("1_ability")]([ExtResource("2"), ExtResource("3"), ExtResource("4"), ExtResource("5"), ExtResource("6")]) -aa_damage = 1.0 -aa_range = 20.0 -aa_is_heal = true diff --git a/resources/ability_sets/tank_set.tres b/resources/ability_sets/tank_set.tres deleted file mode 100644 index 2ae95cf..0000000 --- a/resources/ability_sets/tank_set.tres +++ /dev/null @@ -1,15 +0,0 @@ -[gd_resource type="Resource" script_class="AbilitySet" format=3 uid="uid://cgxtn7dfs40bh"] - -[ext_resource type="Script" uid="uid://voedgs25cwrb" path="res://scripts/abilities/ability_set.gd" id="1"] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1_ability"] -[ext_resource type="Resource" path="res://resources/abilities/tank_single.tres" id="2"] -[ext_resource type="Resource" path="res://resources/abilities/tank_aoe.tres" id="3"] -[ext_resource type="Resource" uid="uid://du0hyuuj26ea0" path="res://resources/abilities/utility_shield_reset.tres" id="4"] -[ext_resource type="Resource" path="res://resources/abilities/tank_ult.tres" id="5"] -[ext_resource type="Resource" path="res://resources/abilities/tank_passive.tres" id="6"] - -[resource] -script = ExtResource("1") -abilities = Array[ExtResource("1_ability")]([ExtResource("2"), ExtResource("3"), ExtResource("4"), ExtResource("5"), ExtResource("6")]) -aa_damage = 5.0 -aa_range = 3.0 diff --git a/scripts/abilities/ability.gd b/resources/roles/ability.gd similarity index 100% rename from scripts/abilities/ability.gd rename to resources/roles/ability.gd diff --git a/scripts/abilities/ability.gd.uid b/resources/roles/ability.gd.uid similarity index 100% rename from scripts/abilities/ability.gd.uid rename to resources/roles/ability.gd.uid diff --git a/scripts/abilities/ability_set.gd b/resources/roles/ability_set.gd similarity index 100% rename from scripts/abilities/ability_set.gd rename to resources/roles/ability_set.gd diff --git a/scripts/abilities/ability_set.gd.uid b/resources/roles/ability_set.gd.uid similarity index 100% rename from scripts/abilities/ability_set.gd.uid rename to resources/roles/ability_set.gd.uid diff --git a/resources/abilities/aoe_attack.tres b/resources/roles/damage/abilities/aoe.tres similarity index 87% rename from resources/abilities/aoe_attack.tres rename to resources/roles/damage/abilities/aoe.tres index 192b7ab..4874e06 100644 --- a/resources/abilities/aoe_attack.tres +++ b/resources/roles/damage/abilities/aoe.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3 uid="uid://bpx3l13iuynfv"] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/abilities/passive_damage_boost.tres b/resources/roles/damage/abilities/passive.tres similarity index 87% rename from resources/abilities/passive_damage_boost.tres rename to resources/roles/damage/abilities/passive.tres index 0c34466..f2d9242 100644 --- a/resources/abilities/passive_damage_boost.tres +++ b/resources/roles/damage/abilities/passive.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3 uid="uid://dadpl32yujwhe"] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/abilities/single_attack.tres b/resources/roles/damage/abilities/single.tres similarity index 87% rename from resources/abilities/single_attack.tres rename to resources/roles/damage/abilities/single.tres index 1a31d66..e037125 100644 --- a/resources/abilities/single_attack.tres +++ b/resources/roles/damage/abilities/single.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3 uid="uid://dwvc8b3cmce8l"] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/abilities/ult_burst.tres b/resources/roles/damage/abilities/ult.tres similarity index 88% rename from resources/abilities/ult_burst.tres rename to resources/roles/damage/abilities/ult.tres index 3994bac..63ada2e 100644 --- a/resources/abilities/ult_burst.tres +++ b/resources/roles/damage/abilities/ult.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3 uid="uid://s32wvlww2ls2"] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/abilities/utility_shield_reset.tres b/resources/roles/damage/abilities/utility.tres similarity index 61% rename from resources/abilities/utility_shield_reset.tres rename to resources/roles/damage/abilities/utility.tres index 6f8fe83..d24156f 100644 --- a/resources/abilities/utility_shield_reset.tres +++ b/resources/roles/damage/abilities/utility.tres @@ -1,6 +1,6 @@ -[gd_resource type="Resource" script_class="Ability" format=3 uid="uid://du0hyuuj26ea0"] +[gd_resource type="Resource" script_class="Ability" format=3] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/ability_sets/damage_set.tres b/resources/roles/damage/set.tres similarity index 66% rename from resources/ability_sets/damage_set.tres rename to resources/roles/damage/set.tres index 02efc47..ae7df7c 100644 --- a/resources/ability_sets/damage_set.tres +++ b/resources/roles/damage/set.tres @@ -1,12 +1,12 @@ [gd_resource type="Resource" script_class="AbilitySet" format=3 uid="uid://beodknb6i1pm4"] -[ext_resource type="Script" uid="uid://voedgs25cwrb" path="res://scripts/abilities/ability_set.gd" id="1"] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1_ability"] -[ext_resource type="Resource" uid="uid://dwvc8b3cmce8l" path="res://resources/abilities/single_attack.tres" id="2"] -[ext_resource type="Resource" uid="uid://bpx3l13iuynfv" path="res://resources/abilities/aoe_attack.tres" id="3"] -[ext_resource type="Resource" uid="uid://du0hyuuj26ea0" path="res://resources/abilities/utility_shield_reset.tres" id="4"] -[ext_resource type="Resource" uid="uid://s32wvlww2ls2" path="res://resources/abilities/ult_burst.tres" id="5"] -[ext_resource type="Resource" uid="uid://dadpl32yujwhe" path="res://resources/abilities/passive_damage_boost.tres" id="6"] +[ext_resource type="Script" uid="uid://voedgs25cwrb" path="res://resources/roles/ability_set.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1_ability"] +[ext_resource type="Resource" uid="uid://dwvc8b3cmce8l" path="res://resources/roles/damage/abilities/single.tres" id="2"] +[ext_resource type="Resource" uid="uid://bpx3l13iuynfv" path="res://resources/roles/damage/abilities/aoe.tres" id="3"] +[ext_resource type="Resource" uid="uid://du0hyuuj26ea0" path="res://resources/roles/damage/abilities/utility.tres" id="4"] +[ext_resource type="Resource" uid="uid://s32wvlww2ls2" path="res://resources/roles/damage/abilities/ult.tres" id="5"] +[ext_resource type="Resource" uid="uid://dadpl32yujwhe" path="res://resources/roles/damage/abilities/passive.tres" id="6"] [resource] script = ExtResource("1") diff --git a/resources/abilities/healer_aoe.tres b/resources/roles/healer/abilities/aoe.tres similarity index 88% rename from resources/abilities/healer_aoe.tres rename to resources/roles/healer/abilities/aoe.tres index e01bca5..e7e37e9 100644 --- a/resources/abilities/healer_aoe.tres +++ b/resources/roles/healer/abilities/aoe.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3 uid="uid://m1kgk2uugnex"] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/abilities/healer_passive.tres b/resources/roles/healer/abilities/passive.tres similarity index 87% rename from resources/abilities/healer_passive.tres rename to resources/roles/healer/abilities/passive.tres index 0fb8a69..c437a58 100644 --- a/resources/abilities/healer_passive.tres +++ b/resources/roles/healer/abilities/passive.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/abilities/healer_single.tres b/resources/roles/healer/abilities/single.tres similarity index 87% rename from resources/abilities/healer_single.tres rename to resources/roles/healer/abilities/single.tres index be57f1f..0d63029 100644 --- a/resources/abilities/healer_single.tres +++ b/resources/roles/healer/abilities/single.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3 uid="uid://cqw1jy6kqvmnj"] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/abilities/healer_ult.tres b/resources/roles/healer/abilities/ult.tres similarity index 89% rename from resources/abilities/healer_ult.tres rename to resources/roles/healer/abilities/ult.tres index fecc548..0fe8b41 100644 --- a/resources/abilities/healer_ult.tres +++ b/resources/roles/healer/abilities/ult.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3 uid="uid://d04nu1leyki16"] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/roles/healer/abilities/utility.tres b/resources/roles/healer/abilities/utility.tres new file mode 100644 index 0000000..d24156f --- /dev/null +++ b/resources/roles/healer/abilities/utility.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="Ability" format=3] + +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] + +[resource] +script = ExtResource("1") +ability_name = "Shield Reset" +type = 2 +ability_range = 0.0 +cooldown = 5.0 +uses_gcd = false +icon = "3" diff --git a/resources/roles/healer/set.tres b/resources/roles/healer/set.tres new file mode 100644 index 0000000..8ca64c5 --- /dev/null +++ b/resources/roles/healer/set.tres @@ -0,0 +1,16 @@ +[gd_resource type="Resource" script_class="AbilitySet" format=3 uid="uid://kcwuhnqy34mj"] + +[ext_resource type="Script" uid="uid://voedgs25cwrb" path="res://resources/roles/ability_set.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1_ability"] +[ext_resource type="Resource" path="res://resources/roles/healer/abilities/single.tres" id="2"] +[ext_resource type="Resource" path="res://resources/roles/healer/abilities/aoe.tres" id="3"] +[ext_resource type="Resource" uid="uid://du0hyuuj26ea0" path="res://resources/roles/healer/abilities/utility.tres" id="4"] +[ext_resource type="Resource" path="res://resources/roles/healer/abilities/ult.tres" id="5"] +[ext_resource type="Resource" path="res://resources/roles/healer/abilities/passive.tres" id="6"] + +[resource] +script = ExtResource("1") +abilities = Array[ExtResource("1_ability")]([ExtResource("2"), ExtResource("3"), ExtResource("4"), ExtResource("5"), ExtResource("6")]) +aa_damage = 1.0 +aa_range = 20.0 +aa_is_heal = true diff --git a/resources/abilities/tank_aoe.tres b/resources/roles/tank/abilities/aoe.tres similarity index 86% rename from resources/abilities/tank_aoe.tres rename to resources/roles/tank/abilities/aoe.tres index aa134cd..da02330 100644 --- a/resources/abilities/tank_aoe.tres +++ b/resources/roles/tank/abilities/aoe.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/abilities/tank_passive.tres b/resources/roles/tank/abilities/passive.tres similarity index 87% rename from resources/abilities/tank_passive.tres rename to resources/roles/tank/abilities/passive.tres index d8deb30..bb129f8 100644 --- a/resources/abilities/tank_passive.tres +++ b/resources/roles/tank/abilities/passive.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/abilities/tank_single.tres b/resources/roles/tank/abilities/single.tres similarity index 86% rename from resources/abilities/tank_single.tres rename to resources/roles/tank/abilities/single.tres index 2888433..8c51f6b 100644 --- a/resources/abilities/tank_single.tres +++ b/resources/roles/tank/abilities/single.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/abilities/tank_ult.tres b/resources/roles/tank/abilities/ult.tres similarity index 85% rename from resources/abilities/tank_ult.tres rename to resources/roles/tank/abilities/ult.tres index d2c3a68..bb1dd82 100644 --- a/resources/abilities/tank_ult.tres +++ b/resources/roles/tank/abilities/ult.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Ability" format=3] -[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://scripts/abilities/ability.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] [resource] script = ExtResource("1") diff --git a/resources/roles/tank/abilities/utility.tres b/resources/roles/tank/abilities/utility.tres new file mode 100644 index 0000000..d24156f --- /dev/null +++ b/resources/roles/tank/abilities/utility.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="Ability" format=3] + +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1"] + +[resource] +script = ExtResource("1") +ability_name = "Shield Reset" +type = 2 +ability_range = 0.0 +cooldown = 5.0 +uses_gcd = false +icon = "3" diff --git a/resources/roles/tank/set.tres b/resources/roles/tank/set.tres new file mode 100644 index 0000000..7962261 --- /dev/null +++ b/resources/roles/tank/set.tres @@ -0,0 +1,15 @@ +[gd_resource type="Resource" script_class="AbilitySet" format=3 uid="uid://cgxtn7dfs40bh"] + +[ext_resource type="Script" uid="uid://voedgs25cwrb" path="res://resources/roles/ability_set.gd" id="1"] +[ext_resource type="Script" uid="uid://c03xbbf3yhfl3" path="res://resources/roles/ability.gd" id="1_ability"] +[ext_resource type="Resource" path="res://resources/roles/tank/abilities/single.tres" id="2"] +[ext_resource type="Resource" path="res://resources/roles/tank/abilities/aoe.tres" id="3"] +[ext_resource type="Resource" uid="uid://du0hyuuj26ea0" path="res://resources/roles/tank/abilities/utility.tres" id="4"] +[ext_resource type="Resource" path="res://resources/roles/tank/abilities/ult.tres" id="5"] +[ext_resource type="Resource" path="res://resources/roles/tank/abilities/passive.tres" id="6"] + +[resource] +script = ExtResource("1") +abilities = Array[ExtResource("1_ability")]([ExtResource("2"), ExtResource("3"), ExtResource("4"), ExtResource("5"), ExtResource("6")]) +aa_damage = 5.0 +aa_range = 3.0 diff --git a/scripts/resources/base_stats.gd b/resources/stats/base_stats.gd similarity index 100% rename from scripts/resources/base_stats.gd rename to resources/stats/base_stats.gd diff --git a/scripts/resources/base_stats.gd.uid b/resources/stats/base_stats.gd.uid similarity index 100% rename from scripts/resources/base_stats.gd.uid rename to resources/stats/base_stats.gd.uid diff --git a/scripts/resources/boss_stats.gd b/resources/stats/boss_stats.gd similarity index 100% rename from scripts/resources/boss_stats.gd rename to resources/stats/boss_stats.gd diff --git a/scripts/resources/boss_stats.gd.uid b/resources/stats/boss_stats.gd.uid similarity index 100% rename from scripts/resources/boss_stats.gd.uid rename to resources/stats/boss_stats.gd.uid diff --git a/resources/stats/boss_stats.tres b/resources/stats/boss_stats.tres index 18a6a42..3bc6604 100644 --- a/resources/stats/boss_stats.tres +++ b/resources/stats/boss_stats.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="BossStats" load_steps=2 format=3] -[ext_resource type="Script" path="res://scripts/resources/boss_stats.gd" id="1"] +[ext_resource type="Script" path="res://resources/stats/boss_stats.gd" id="1"] [resource] script = ExtResource("1") diff --git a/scripts/resources/enemy_stats.gd b/resources/stats/enemy_stats.gd similarity index 100% rename from scripts/resources/enemy_stats.gd rename to resources/stats/enemy_stats.gd diff --git a/scripts/resources/enemy_stats.gd.uid b/resources/stats/enemy_stats.gd.uid similarity index 100% rename from scripts/resources/enemy_stats.gd.uid rename to resources/stats/enemy_stats.gd.uid diff --git a/resources/stats/enemy_stats.tres b/resources/stats/enemy_stats.tres index 7428f22..909ed32 100644 --- a/resources/stats/enemy_stats.tres +++ b/resources/stats/enemy_stats.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="EnemyStats" format=3 uid="uid://cj1shmjwf0xeo"] -[ext_resource type="Script" uid="uid://bh2uuuvl30y0x" path="res://scripts/resources/enemy_stats.gd" id="1"] +[ext_resource type="Script" uid="uid://bh2uuuvl30y0x" path="res://resources/stats/enemy_stats.gd" id="1"] [resource] script = ExtResource("1") diff --git a/scripts/resources/player_stats.gd b/resources/stats/player_stats.gd similarity index 100% rename from scripts/resources/player_stats.gd rename to resources/stats/player_stats.gd diff --git a/scripts/resources/player_stats.gd.uid b/resources/stats/player_stats.gd.uid similarity index 100% rename from scripts/resources/player_stats.gd.uid rename to resources/stats/player_stats.gd.uid diff --git a/resources/stats/player_stats.tres b/resources/stats/player_stats.tres index 7a1136a..0c7a8dd 100644 --- a/resources/stats/player_stats.tres +++ b/resources/stats/player_stats.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="PlayerStats" format=3 uid="uid://btd0g0oiulssq"] -[ext_resource type="Script" uid="uid://ypyntbavbsto" path="res://scripts/resources/player_stats.gd" id="1"] +[ext_resource type="Script" uid="uid://ypyntbavbsto" path="res://resources/stats/player_stats.gd" id="1"] [resource] script = ExtResource("1") diff --git a/scripts/resources/portal_stats.gd b/resources/stats/portal_stats.gd similarity index 100% rename from scripts/resources/portal_stats.gd rename to resources/stats/portal_stats.gd diff --git a/scripts/resources/portal_stats.gd.uid b/resources/stats/portal_stats.gd.uid similarity index 100% rename from scripts/resources/portal_stats.gd.uid rename to resources/stats/portal_stats.gd.uid diff --git a/resources/stats/portal_stats.tres b/resources/stats/portal_stats.tres index 1273561..7ab989c 100644 --- a/resources/stats/portal_stats.tres +++ b/resources/stats/portal_stats.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="PortalStats" format=3 uid="uid://be2vv5u0jw0yw"] -[ext_resource type="Script" uid="uid://bioid3s5oftxs" path="res://scripts/resources/portal_stats.gd" id="1"] +[ext_resource type="Script" uid="uid://bioid3s5oftxs" path="res://resources/stats/portal_stats.gd" id="1"] [resource] script = ExtResource("1") diff --git a/scripts/systems/ability_system.gd b/systems/ability_system.gd similarity index 100% rename from scripts/systems/ability_system.gd rename to systems/ability_system.gd diff --git a/scripts/systems/ability_system.gd.uid b/systems/ability_system.gd.uid similarity index 100% rename from scripts/systems/ability_system.gd.uid rename to systems/ability_system.gd.uid diff --git a/scripts/systems/aggro_system.gd b/systems/aggro_system.gd similarity index 100% rename from scripts/systems/aggro_system.gd rename to systems/aggro_system.gd diff --git a/scripts/systems/aggro_system.gd.uid b/systems/aggro_system.gd.uid similarity index 100% rename from scripts/systems/aggro_system.gd.uid rename to systems/aggro_system.gd.uid diff --git a/scripts/systems/buff_system.gd b/systems/buff_system.gd similarity index 100% rename from scripts/systems/buff_system.gd rename to systems/buff_system.gd diff --git a/scripts/systems/buff_system.gd.uid b/systems/buff_system.gd.uid similarity index 100% rename from scripts/systems/buff_system.gd.uid rename to systems/buff_system.gd.uid diff --git a/scripts/systems/cooldown_system.gd b/systems/cooldown_system.gd similarity index 100% rename from scripts/systems/cooldown_system.gd rename to systems/cooldown_system.gd diff --git a/scripts/systems/cooldown_system.gd.uid b/systems/cooldown_system.gd.uid similarity index 100% rename from scripts/systems/cooldown_system.gd.uid rename to systems/cooldown_system.gd.uid diff --git a/scripts/systems/damage_system.gd b/systems/damage_system.gd similarity index 100% rename from scripts/systems/damage_system.gd rename to systems/damage_system.gd diff --git a/scripts/systems/damage_system.gd.uid b/systems/damage_system.gd.uid similarity index 100% rename from scripts/systems/damage_system.gd.uid rename to systems/damage_system.gd.uid diff --git a/scripts/systems/enemy_ai_system.gd b/systems/enemy_ai_system.gd similarity index 100% rename from scripts/systems/enemy_ai_system.gd rename to systems/enemy_ai_system.gd diff --git a/scripts/systems/enemy_ai_system.gd.uid b/systems/enemy_ai_system.gd.uid similarity index 100% rename from scripts/systems/enemy_ai_system.gd.uid rename to systems/enemy_ai_system.gd.uid diff --git a/scripts/systems/health_system.gd b/systems/health_system.gd similarity index 100% rename from scripts/systems/health_system.gd rename to systems/health_system.gd diff --git a/scripts/systems/health_system.gd.uid b/systems/health_system.gd.uid similarity index 100% rename from scripts/systems/health_system.gd.uid rename to systems/health_system.gd.uid diff --git a/scripts/systems/respawn_system.gd b/systems/respawn_system.gd similarity index 100% rename from scripts/systems/respawn_system.gd rename to systems/respawn_system.gd diff --git a/scripts/systems/respawn_system.gd.uid b/systems/respawn_system.gd.uid similarity index 100% rename from scripts/systems/respawn_system.gd.uid rename to systems/respawn_system.gd.uid diff --git a/scripts/systems/shield_system.gd b/systems/shield_system.gd similarity index 100% rename from scripts/systems/shield_system.gd rename to systems/shield_system.gd diff --git a/scripts/systems/shield_system.gd.uid b/systems/shield_system.gd.uid similarity index 100% rename from scripts/systems/shield_system.gd.uid rename to systems/shield_system.gd.uid diff --git a/scripts/systems/spawn_system.gd b/systems/spawn_system.gd similarity index 96% rename from scripts/systems/spawn_system.gd rename to systems/spawn_system.gd index 0e244f3..e98ae98 100644 --- a/scripts/systems/spawn_system.gd +++ b/systems/spawn_system.gd @@ -1,6 +1,6 @@ extends Node -const ENEMY_SCENE: PackedScene = preload("res://scenes/enemy/enemy.tscn") +const ENEMY_SCENE: PackedScene = preload("res://enemy/enemy.tscn") var portal_data: Dictionary = {} diff --git a/scripts/systems/spawn_system.gd.uid b/systems/spawn_system.gd.uid similarity index 100% rename from scripts/systems/spawn_system.gd.uid rename to systems/spawn_system.gd.uid diff --git a/scripts/world/portal_spawner.gd b/world/portal_spawner.gd similarity index 88% rename from scripts/world/portal_spawner.gd rename to world/portal_spawner.gd index 94e0095..a9e105e 100644 --- a/scripts/world/portal_spawner.gd +++ b/world/portal_spawner.gd @@ -1,7 +1,7 @@ extends Node -const PORTAL_SCENE: PackedScene = preload("res://scenes/portal/portal.tscn") -const GATE_SCENE: PackedScene = preload("res://scenes/portal/gate.tscn") +const PORTAL_SCENE: PackedScene = preload("res://portal/portal.tscn") +const GATE_SCENE: PackedScene = preload("res://portal/gate.tscn") const SPAWN_INTERVAL := 30.0 const MAX_PORTALS := 3 const MIN_DISTANCE := 20.0 diff --git a/scripts/world/portal_spawner.gd.uid b/world/portal_spawner.gd.uid similarity index 100% rename from scripts/world/portal_spawner.gd.uid rename to world/portal_spawner.gd.uid diff --git a/scenes/world.tscn b/world/world.tscn similarity index 86% rename from scenes/world.tscn rename to world/world.tscn index e865c5b..fd5b56d 100644 --- a/scenes/world.tscn +++ b/world/world.tscn @@ -1,18 +1,18 @@ [gd_scene format=3 uid="uid://dy1icabu2ssbw"] -[ext_resource type="Script" uid="uid://h0hts425epc6" path="res://scripts/systems/ability_system.gd" id="ability_system"] -[ext_resource type="Script" uid="uid://cm7ehl2pexcst" path="res://scripts/systems/aggro_system.gd" id="aggro_system"] -[ext_resource type="Script" uid="uid://da2jm0awq2lnh" path="res://scripts/systems/buff_system.gd" id="buff_system"] -[ext_resource type="Script" uid="uid://ddos7mo8rahou" path="res://scripts/systems/cooldown_system.gd" id="cooldown_system"] -[ext_resource type="Script" uid="uid://cbd1bryh0e2dw" path="res://scripts/systems/damage_system.gd" id="damage_system"] -[ext_resource type="Script" uid="uid://bwhxu5586lc1l" path="res://scripts/systems/enemy_ai_system.gd" id="enemy_ai_system"] -[ext_resource type="Script" uid="uid://b3wkn5118dimy" path="res://scripts/systems/health_system.gd" id="health_system"] -[ext_resource type="PackedScene" path="res://scenes/hud/hud.tscn" id="hud"] -[ext_resource type="PackedScene" uid="uid://cdnkbt1f0db7e" path="res://scenes/player/player.tscn" id="player"] -[ext_resource type="Script" uid="uid://cskx6o07iukwh" path="res://scripts/world/portal_spawner.gd" id="portal_spawner"] -[ext_resource type="Script" uid="uid://b1qkvoqvmd21h" path="res://scripts/systems/respawn_system.gd" id="respawn_system"] -[ext_resource type="Script" uid="uid://rsnpuf77o0sn" path="res://scripts/systems/shield_system.gd" id="shield_system"] -[ext_resource type="Script" uid="uid://c84voxmnaifyt" path="res://scripts/systems/spawn_system.gd" id="spawn_system"] +[ext_resource type="Script" uid="uid://h0hts425epc6" path="res://systems/ability_system.gd" id="ability_system"] +[ext_resource type="Script" uid="uid://cm7ehl2pexcst" path="res://systems/aggro_system.gd" id="aggro_system"] +[ext_resource type="Script" uid="uid://da2jm0awq2lnh" path="res://systems/buff_system.gd" id="buff_system"] +[ext_resource type="Script" uid="uid://ddos7mo8rahou" path="res://systems/cooldown_system.gd" id="cooldown_system"] +[ext_resource type="Script" uid="uid://cbd1bryh0e2dw" path="res://systems/damage_system.gd" id="damage_system"] +[ext_resource type="Script" uid="uid://bwhxu5586lc1l" path="res://systems/enemy_ai_system.gd" id="enemy_ai_system"] +[ext_resource type="Script" uid="uid://b3wkn5118dimy" path="res://systems/health_system.gd" id="health_system"] +[ext_resource type="PackedScene" path="res://hud/hud.tscn" id="hud"] +[ext_resource type="PackedScene" uid="uid://cdnkbt1f0db7e" path="res://player/player.tscn" id="player"] +[ext_resource type="Script" uid="uid://cskx6o07iukwh" path="res://world/portal_spawner.gd" id="portal_spawner"] +[ext_resource type="Script" uid="uid://b1qkvoqvmd21h" path="res://systems/respawn_system.gd" id="respawn_system"] +[ext_resource type="Script" uid="uid://rsnpuf77o0sn" path="res://systems/shield_system.gd" id="shield_system"] +[ext_resource type="Script" uid="uid://c84voxmnaifyt" path="res://systems/spawn_system.gd" id="spawn_system"] [sub_resource type="NavigationMesh" id="NavigationMesh_1"] vertices = PackedVector3Array(-49.5, 0.5, -49.5, -49.5, 0.5, 49.5, 49.5, 0.5, 49.5, 49.5, 0.5, -49.5) @@ -84,6 +84,7 @@ script = ExtResource("spawn_system") script = ExtResource("buff_system") [node name="NavigationRegion3D" type="NavigationRegion3D" parent="." unique_id=1265843679] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0027503967, 0.014227867, 0.023231506) navigation_mesh = SubResource("NavigationMesh_1") [node name="Boden" type="MeshInstance3D" parent="NavigationRegion3D" unique_id=593226019]