prototype vibe
This commit is contained in:
@@ -2,34 +2,55 @@ extends Node
|
||||
|
||||
const PORTAL_SCENE: PackedScene = preload("res://scenes/portal/portal.tscn")
|
||||
const GATE_SCENE: PackedScene = preload("res://scenes/portal/gate.tscn")
|
||||
const SPAWN_INTERVAL := 30.0
|
||||
const MAX_PORTALS := 3
|
||||
const RED_PORTAL_STATS: Resource = preload("res://scenes/portal/red_portal_stats.tres")
|
||||
const MAX_NORMAL_PORTALS := 3
|
||||
const MIN_DISTANCE := 20.0
|
||||
const MAX_DISTANCE := 40.0
|
||||
const RESPAWN_DELAY := 1.0
|
||||
|
||||
var portals: Array[Node] = []
|
||||
var timer := 0.0
|
||||
|
||||
func _ready() -> void:
|
||||
EventBus.portal_defeated.connect(_on_portal_defeated)
|
||||
EventBus.wave_started.connect(_on_wave_started)
|
||||
if PlayerData.portal_position != Vector3.ZERO and not PlayerData.dungeon_cleared:
|
||||
call_deferred("_restore_gate")
|
||||
else:
|
||||
if PlayerData.dungeon_cleared:
|
||||
PlayerData.clear_cache()
|
||||
call_deferred("_spawn_portal")
|
||||
call_deferred("_ensure_portals")
|
||||
|
||||
func _restore_gate() -> void:
|
||||
var gate: Node3D = GATE_SCENE.instantiate()
|
||||
get_parent().add_child(gate)
|
||||
gate.global_position = PlayerData.portal_position
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
timer += delta
|
||||
if timer >= SPAWN_INTERVAL:
|
||||
timer = 0.0
|
||||
_cleanup_dead()
|
||||
if portals.size() < MAX_PORTALS:
|
||||
_spawn_portal()
|
||||
func _ensure_portals() -> void:
|
||||
_cleanup_dead()
|
||||
while portals.size() < MAX_NORMAL_PORTALS:
|
||||
_spawn_portal()
|
||||
|
||||
func _on_portal_defeated(portal: Node) -> void:
|
||||
if portal.is_in_group("red_portal"):
|
||||
return
|
||||
portals.erase(portal)
|
||||
await get_tree().create_timer(RESPAWN_DELAY).timeout
|
||||
_ensure_portals()
|
||||
|
||||
func _on_wave_started(_wave_number: int) -> void:
|
||||
_spawn_red_portal()
|
||||
|
||||
func _spawn_red_portal() -> void:
|
||||
for p in get_tree().get_nodes_in_group("red_portal"):
|
||||
if is_instance_valid(p):
|
||||
return
|
||||
var angle: float = randf() * TAU
|
||||
var distance: float = randf_range(MIN_DISTANCE, MAX_DISTANCE)
|
||||
var pos := Vector3(cos(angle) * distance, 0, sin(angle) * distance)
|
||||
var portal: Node3D = PORTAL_SCENE.instantiate()
|
||||
portal.stats = RED_PORTAL_STATS
|
||||
get_parent().add_child(portal)
|
||||
portal.global_position = pos
|
||||
|
||||
func _spawn_portal() -> void:
|
||||
var angle: float = randf() * TAU
|
||||
|
||||
@@ -23,7 +23,14 @@
|
||||
[ext_resource type="Script" path="res://systems/respawn_system.gd" id="respawn_system"]
|
||||
[ext_resource type="Script" path="res://systems/shield_system.gd" id="shield_system"]
|
||||
[ext_resource type="Script" path="res://systems/spawn_system.gd" id="spawn_system"]
|
||||
[ext_resource type="Script" path="res://systems/wave_system.gd" id="wave_system"]
|
||||
[ext_resource type="Script" path="res://systems/xp_system.gd" id="xp_system"]
|
||||
[ext_resource type="Script" path="res://systems/invasion_system.gd" id="invasion_system"]
|
||||
[ext_resource type="Script" path="res://systems/audio_system.gd" id="audio_system"]
|
||||
[ext_resource type="Script" path="res://scenes/world/world_manager.gd" id="world_manager"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/menu/game_over_overlay.tscn" id="game_over_overlay"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/hud/hud.tscn" id="hud"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/tavern/tavern.tscn" id="tavern"]
|
||||
[ext_resource type="PackedScene" uid="uid://cdnkbt1f0db7e" path="res://scenes/player/player.tscn" id="player"]
|
||||
[ext_resource type="Script" path="res://scenes/world/portal_spawner.gd" id="portal_spawner"]
|
||||
[ext_resource type="Resource" uid="uid://cgxtn7dfs40bh" path="res://scenes/player/role/tank/set.tres" id="tank_set"]
|
||||
@@ -141,6 +148,18 @@ script = ExtResource("hud_system")
|
||||
[node name="NameplateSystem" type="Node" parent="Systems"]
|
||||
script = ExtResource("nameplate_system")
|
||||
|
||||
[node name="WaveSystem" type="Node" parent="Systems"]
|
||||
script = ExtResource("wave_system")
|
||||
|
||||
[node name="XpSystem" type="Node" parent="Systems"]
|
||||
script = ExtResource("xp_system")
|
||||
|
||||
[node name="InvasionSystem" type="Node" parent="Systems"]
|
||||
script = ExtResource("invasion_system")
|
||||
|
||||
[node name="AudioSystem" type="Node" parent="Systems"]
|
||||
script = ExtResource("audio_system")
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0027503967, 0.014227867, 0.023231506)
|
||||
navigation_mesh = SubResource("NavigationMesh_1")
|
||||
@@ -157,15 +176,9 @@ shape = SubResource("WorldBoundaryShape3D_1")
|
||||
transform = Transform3D(1, 0, 0, 0, 0.707, 0.707, 0, -0.707, 0.707, 0, 10, 0)
|
||||
shadow_enabled = true
|
||||
|
||||
[node name="Taverne" type="StaticBody3D" parent="."]
|
||||
[node name="Tavern" parent="." instance=ExtResource("tavern")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0)
|
||||
|
||||
[node name="Mesh" type="MeshInstance3D" parent="Taverne"]
|
||||
mesh = SubResource("BoxMesh_tavern")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Taverne"]
|
||||
shape = SubResource("BoxShape3D_tavern")
|
||||
|
||||
[node name="Player" parent="." instance=ExtResource("player")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -5)
|
||||
|
||||
@@ -173,3 +186,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -5)
|
||||
|
||||
[node name="PortalSpawner" type="Node" parent="."]
|
||||
script = ExtResource("portal_spawner")
|
||||
|
||||
[node name="WorldManager" type="Node" parent="."]
|
||||
script = ExtResource("world_manager")
|
||||
|
||||
[node name="GameOverOverlay" parent="." instance=ExtResource("game_over_overlay")]
|
||||
|
||||
21
scenes/world/world_manager.gd
Normal file
21
scenes/world/world_manager.gd
Normal file
@@ -0,0 +1,21 @@
|
||||
extends Node
|
||||
|
||||
func _ready() -> void:
|
||||
EventBus.game_over.connect(_on_game_over)
|
||||
if GameState.force_return_to_world:
|
||||
call_deferred("_handle_force_return")
|
||||
|
||||
func _handle_force_return() -> void:
|
||||
GameState.force_return_to_world = false
|
||||
var player: Node3D = get_tree().get_first_node_in_group("player")
|
||||
var tavern: Node3D = get_tree().get_first_node_in_group("tavern")
|
||||
if player and tavern:
|
||||
player.global_position = tavern.global_position + Vector3(0, 1, -6)
|
||||
var invasion: Node = get_node_or_null("../Systems/InvasionSystem")
|
||||
if invasion:
|
||||
invasion.trigger()
|
||||
|
||||
func _on_game_over() -> void:
|
||||
var overlay: CanvasLayer = get_node_or_null("../GameOverOverlay")
|
||||
if overlay and overlay.has_method("show_overlay"):
|
||||
overlay.show_overlay(GameState.current_wave)
|
||||
1
scenes/world/world_manager.gd.uid
Normal file
1
scenes/world/world_manager.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cejlqodm01ob3
|
||||
Reference in New Issue
Block a user