rock respawn flow, fix flying spawn

This commit is contained in:
2026-04-22 18:49:13 +03:00
parent 6a5c3a0def
commit 66b8120eb7
2 changed files with 53 additions and 5 deletions
+48 -3
View File
@@ -93,13 +93,57 @@ func _process(delta: float) -> void:
# ─── Rocks ────────────────────────────────────────────────────────────────────
var rocks_on_field: int = 0
var rocks_pending: int = 0
func _get_rock_limit() -> int:
return mini(2 + (wave + 1) / 2, 7)
func _spawn_rocks() -> void:
for i in range(10):
var limit := _get_rock_limit()
for i in range(limit):
_spawn_single_rock()
func _spawn_single_rock() -> void:
var rock := ROCK_SCENE.instantiate()
rock.position = _safe_rock_position()
add_child(rock)
rock.connect("destroyed", _on_rock_destroyed)
rocks_on_field += 1
func _safe_rock_position() -> Vector3:
var player_pos := player.global_position if is_instance_valid(player) else Vector3.ZERO
for _attempt in range(30):
var angle := randf() * TAU
var dist := randf_range(3.5, arena_size - 2.0)
rock.position = Vector3(cos(angle) * dist, 0.0, sin(angle) * dist)
var dist := randf_range(4.0, arena_size - 2.0)
var pos := Vector3(cos(angle) * dist, 0.0, sin(angle) * dist)
if player_pos.distance_to(pos) < 4.5:
continue
var clear := true
for r in get_tree().get_nodes_in_group("rocks"):
if (r as Node3D).global_position.distance_to(pos) < 1.5:
clear = false
break
if clear:
return pos
var a := randf() * TAU
return Vector3(cos(a) * (arena_size - 2.5), 0.0, sin(a) * (arena_size - 2.5))
func _on_rock_destroyed() -> void:
rocks_on_field = maxi(0, rocks_on_field - 1)
if not game_active:
return
if rocks_on_field + rocks_pending < _get_rock_limit():
rocks_pending += 1
await get_tree().create_timer(20.0).timeout
rocks_pending -= 1
if game_active:
_spawn_single_rock()
func _check_rock_slots() -> void:
var gap := _get_rock_limit() - rocks_on_field - rocks_pending
for i in range(gap):
_spawn_single_rock()
# ─── Player ───────────────────────────────────────────────────────────────────
@@ -166,6 +210,7 @@ func _on_enemy_died(points: int) -> void:
kills = 0
kills_for_next = int(kills_for_next * 1.6)
wave += 1
_check_rock_slots()
_show_upgrade()
func _spawn_upgraded_enemy(pos: Vector3, type: String, level: int, w: int) -> CharacterBody3D:
+3
View File
@@ -1,5 +1,7 @@
extends CharacterBody3D
signal destroyed
enum State { IDLE, FLYING }
const AIR_FRICTION := 0.84
@@ -100,6 +102,7 @@ func _die() -> void:
dead = true
state = State.IDLE
set_physics_process(false)
emit_signal("destroyed")
var tw := create_tween()
tw.tween_property(self, "scale", Vector3(1.6, 0.1, 1.6), 0.12)
tw.tween_property(self, "scale", Vector3(0.0, 0.0, 0.0), 0.1)