Eight windows per room and random zombie entry from different windows

This commit is contained in:
enne2
2026-10-13 21:21:17 +02:00
parent 70c82df450
commit fcf298c692
9 changed files with 400 additions and 70 deletions
+32 -10
View File
@@ -20,6 +20,7 @@ var wave_pending := false
var smoke := false
var awaiting_web_start := false
var start_label: Label
var last_window := -1
func _ready() -> void:
smoke = "--smoke" in OS.get_cmdline_user_args()
@@ -169,19 +170,40 @@ func _next_wave() -> void:
for i in zombies_for_wave(wave):
if player.hp <= 0:
break
_spawn(i % 4)
_spawn()
await get_tree().create_timer(0.8).timeout
spawning = false
_check_wave()
func _spawn(index: int) -> void:
var centers := [Vector3(0, 0, -9), Vector3(0, 0, 9), Vector3(-9, 0, 0), Vector3(9, 0, 0)]
var inward: Vector3 = -centers[index].normalized()
## Sceglie una finestra a caso fra quelle disponibili, evitando di ripetere
## l'ultima usata: gli zombie entrano da aperture diverse invece che sempre dalle
## stesse quattro posizioni fisse.
func _pick_window() -> int:
var count: int = room.windows.size()
if count == 0:
return -1
if count == 1:
return 0
var index: int = randi() % count
if index == last_window:
index = (last_window + 1 + randi() % (count - 1)) % count
return index
func _spawn() -> void:
var chosen := _pick_window()
if chosen < 0:
return
last_window = chosen
var window: Dictionary = room.windows[chosen]
var slots: Array = window.slots
var start: Vector3 = slots[randi() % slots.size()] # slot casuale nella finestra
var face: Vector3 = window.center
var inward: Vector3 = window.normal
var zombie := CharacterBody3D.new()
zombie.set_script(ZombieScript)
zombie.player = player
zombie.navigation = navigation
zombie.position = centers[index] - inward * 1.2
zombie.position = start
add_child(zombie)
alive += 1
zombie.killed.connect(func(headshot: bool):
@@ -190,12 +212,12 @@ func _spawn(index: int) -> void:
_check_wave())
var tween := zombie.create_tween()
zombie.entry_tween = tween
tween.tween_property(zombie, "position", centers[index] + Vector3(0, 1.55, 0), 1.2)
tween.tween_property(zombie, "position", face + Vector3(0, 1.55, 0), 1.2)
tween.tween_callback(func():
for glass in room.glass_panes.duplicate():
if is_instance_valid(glass) and Vector2(glass.position.x - centers[index].x, glass.position.z - centers[index].z).length() < 2:
room.shatter_glass(glass))
tween.tween_property(zombie, "position", centers[index] + inward * 1.4 + Vector3(0, 0.1, 0), 0.8)
var glass = window.glass
if is_instance_valid(glass):
room.shatter_glass(glass)) # solo la finestra usata
tween.tween_property(zombie, "position", face + inward * 1.4 + Vector3(0, 0.1, 0), 0.8)
tween.tween_callback(func(): zombie.entering = false)
func _check_wave() -> void: