add weights and cost to enemy spawner
This commit is contained in:
parent
829b383a2a
commit
9e47e27cbf
4 changed files with 61 additions and 13 deletions
5
levels/enemy_entry.gd
Normal file
5
levels/enemy_entry.gd
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
class_name EnemyEntry
|
||||
extends Resource
|
||||
|
||||
@export var scene: PackedScene
|
||||
@export var cost: float
|
||||
1
levels/enemy_entry.gd.uid
Normal file
1
levels/enemy_entry.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://cx7xhojlh0s0f
|
||||
|
|
@ -6,7 +6,12 @@ var points: Array[Vector3]
|
|||
const MAX_CACHED_POINTS := 100
|
||||
var doomed_point_idx := 0
|
||||
|
||||
@export var enemy_scenes: Array[PackedScene]
|
||||
@export var enemy_scenes: Array[EnemyEntry]
|
||||
var weights: Array[float]
|
||||
var total_cost := 0.
|
||||
var money := 5.
|
||||
|
||||
var rng := RandomNumberGenerator.new()
|
||||
|
||||
func _get_point() -> Vector3:
|
||||
assert(not boxes.is_empty())
|
||||
|
|
@ -25,7 +30,12 @@ func _ready() -> void:
|
|||
for child in get_children():
|
||||
if child is CSGBox3D:
|
||||
boxes.push_back(child)
|
||||
|
||||
|
||||
for entry in enemy_scenes:
|
||||
total_cost += entry.cost
|
||||
|
||||
for entry in enemy_scenes:
|
||||
weights.push_back(total_cost - entry.cost + 1.)
|
||||
func _process(_delta: float) -> void:
|
||||
var v := _get_point()
|
||||
v.y = 50.
|
||||
|
|
@ -49,15 +59,26 @@ func _process(_delta: float) -> void:
|
|||
|
||||
func _on_timer_timeout() -> void:
|
||||
if not Level.is_active(): return
|
||||
|
||||
money += 2.
|
||||
if randf() > .1: return
|
||||
|
||||
if points.is_empty():
|
||||
push_warning("tried to spawn enemy, but can't find a point!")
|
||||
return
|
||||
|
||||
var pos: Vector3 = points.pick_random()
|
||||
pos += Vector3.UP * 0.02
|
||||
var scene: PackedScene = enemy_scenes.pick_random()
|
||||
var car: Node3D = scene.instantiate()
|
||||
car.position = pos
|
||||
get_tree().current_scene.add_child(car)
|
||||
while money > 3.:
|
||||
var entry: EnemyEntry = enemy_scenes.pick_random()
|
||||
if entry.cost > money:
|
||||
return
|
||||
var scene := entry.scene
|
||||
|
||||
var pos: Vector3 = points.pick_random()
|
||||
pos += Vector3.UP * 0.02
|
||||
var car: Node3D = scene.instantiate()
|
||||
car.position = pos
|
||||
get_tree().current_scene.add_child(car)
|
||||
|
||||
money -= entry.cost
|
||||
|
||||
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue