Eight windows per room and random zombie entry from different windows
This commit is contained in:
+32
-10
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user