This commit is contained in:
2026-05-14 19:11:10 +02:00
parent 2d4002bd3f
commit 52ad83a96d
15 changed files with 169 additions and 31 deletions

View File

@@ -2,6 +2,7 @@ extends Node3D
const PLAYER_SCENE: PackedScene = preload("res://scenes/entities/player/player.tscn")
const ENEMY_SCENE: PackedScene = preload("res://scenes/entities/enemy/enemy.tscn")
const PORTAL_SCENE: PackedScene = preload("res://scenes/entities/portal/portal.tscn")
const GENERATOR: GDScript = preload("res://scenes/dungeon/dungeon_generator.gd")
@onready var players_root: Node3D = $EntityRoot/Players
@@ -45,9 +46,9 @@ func _populate_dungeon() -> void:
var room: Dictionary = data.rooms[i]
var n: int = 2 + (1 if GameState.dungeon_red else 0)
for j in range(n):
var off := Vector3(randf_range(-room.size.x * 0.3, room.size.x * 0.3), 0.5, randf_range(-room.size.z * 0.3, room.size.z * 0.3))
var off := Vector3(randf_range(-room.size.x * 0.3, room.size.x * 0.3), 1.0, randf_range(-room.size.z * 0.3, room.size.z * 0.3))
spawn_system.spawn_enemy_at(room.pos + off, GameState.dungeon_red, difficulty * 0.5)
spawn_system.spawn_boss_at(data.boss + Vector3(0, 0.5, 0), difficulty)
spawn_system.spawn_boss_at(data.boss + Vector3(0, 2.0, 0), difficulty)
func _spawn_player(peer_id: int) -> void:
if players_root.get_node_or_null(str(peer_id)) != null:
@@ -70,13 +71,21 @@ func _on_peer_disconnected(id: int) -> void:
if node:
node.queue_free()
func _on_boss_defeated(_b: Node) -> void:
if Net.is_host():
var t := get_tree().create_timer(2.0)
t.timeout.connect(func():
GameState.dungeon_seed = 0
_return.rpc())
func _on_boss_defeated(b: Node) -> void:
if not Net.is_host():
return
var portal: StaticBody3D = PORTAL_SCENE.instantiate()
portal.is_return = true
portal.name = "ReturnPortal"
var portals_root: Node3D = $EntityRoot/Portals
portals_root.add_child(portal, true)
var spawn_pos: Vector3 = (b as Node3D).global_position if b is Node3D else data.boss
portal.global_position = spawn_pos + Vector3(0, 1, 0)
EventBus.portal_spawned.emit(portal)
var t := get_tree().create_timer(3.0)
t.timeout.connect(_auto_return.bind(portal))
@rpc("authority", "reliable", "call_local")
func _return() -> void:
func _auto_return(portal: Node) -> void:
if is_instance_valid(portal):
portal.queue_free()
GameState.change_scene(GameState.SCENE_WORLD)