summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--project.godot5
-rw-r--r--resources/game_stats_config.tres30
-rw-r--r--scenes/game.tscn5
-rw-r--r--scripts/game_data.gd23
-rw-r--r--scripts/game_stats_config.gd16
-rw-r--r--scripts/player.gd2
-rw-r--r--scripts/wave_spawner.gd61
7 files changed, 89 insertions, 53 deletions
diff --git a/project.godot b/project.godot
index d56a28a..96b3ef3 100644
--- a/project.godot
+++ b/project.godot
@@ -76,6 +76,11 @@ tower_action_four={
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null)
]
}
+advance_wave={
+"deadzone": 0.2,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
[rendering]
diff --git a/resources/game_stats_config.tres b/resources/game_stats_config.tres
index f5a735e..bf5571d 100644
--- a/resources/game_stats_config.tres
+++ b/resources/game_stats_config.tres
@@ -6,9 +6,33 @@
script = ExtResource("1_t0c0a")
starting_life = 50
starting_morale = 10
-max_wave = 3
-wave_time = 20.0
-wave_targets = [15, 40, 120]
+wave_data = [{
+15: {
+"fodder": 5
+},
+27: {
+"fodder": 8
+},
+30: {
+"fodder": 1,
+"soldier": 2
+}
+}, {
+5: {
+"fodder": 6
+},
+15: {
+"soldier": 3
+},
+20: {
+"fodder": 10,
+"soldier": 6
+},
+30: {
+"fodder": 5,
+"gnome": 1
+}
+}]
defenders = Array[Dictionary]([{
"chaos_factor": 35.0,
"cost": 10,
diff --git a/scenes/game.tscn b/scenes/game.tscn
index 5d5aac6..56152fc 100644
--- a/scenes/game.tscn
+++ b/scenes/game.tscn
@@ -51,9 +51,6 @@ z_index = 2
[node name="PathSpawner" type="Node2D" parent="."]
script = ExtResource("3_u5sy4")
-[node name="Timer" type="Timer" parent="PathSpawner"]
-autostart = true
-
[node name="Defenders" type="Node" parent="."]
script = ExtResource("4_gee14")
@@ -71,5 +68,3 @@ volume_db = -4.0
script = ExtResource("10_vtaks")
[node name="Blips" type="AudioStreamPlayer2D" parent="."]
-
-[connection signal="timeout" from="PathSpawner/Timer" to="PathSpawner" method="_on_timer_timeout"]
diff --git a/scripts/game_data.gd b/scripts/game_data.gd
index 6850b35..716ff1d 100644
--- a/scripts/game_data.gd
+++ b/scripts/game_data.gd
@@ -5,14 +5,16 @@ var morale_down = preload("res://assets/morale_down.wav")
signal life_changed
signal morale_changed
+signal wave_started
var _life : int
var _morale : int
var _current_wave : int
+var _is_spawning : bool
func reset():
_life = game_stats_config.starting_life
_morale = game_stats_config.starting_morale
- _current_wave = 1
+ _current_wave = -1
func get_life() -> int:
return _life
@@ -41,9 +43,18 @@ func subtract_morale(amount: int):
var ap = get_tree().current_scene.get_node("Blips")
ap.stream = morale_down
ap.play()
-
-func get_current_wave() -> int:
- return _current_wave
-func increment_wave():
- _current_wave += 1
+func get_is_spawning() -> bool:
+ return _is_spawning
+
+func start_spawning():
+ if !_is_spawning && _current_wave < game_stats_config.wave_data.size():
+ _current_wave += 1
+ _is_spawning = true
+ emit_signal("wave_started", _current_wave)
+
+func stop_spawning():
+ _is_spawning = false
+ if (_current_wave > game_stats_config.wave_data.size()):
+ # TODO
+ print("win!")
diff --git a/scripts/game_stats_config.gd b/scripts/game_stats_config.gd
index 8edffd2..8b2e544 100644
--- a/scripts/game_stats_config.gd
+++ b/scripts/game_stats_config.gd
@@ -6,10 +6,18 @@ class_name GameStatsConfig
@export var starting_morale : int = 10
# waves
-@export var max_wave : int = 3
-@export var wave_time : float = 30.0
-@export var wave_targets = [
- 15, 40, 120
+@export var wave_data = [
+ {
+ 15: {"fodder": 5},
+ 27: {"fodder": 8},
+ 30: {"fodder": 1, "soldier": 2},
+ },
+ {
+ 5: {"fodder": 6},
+ 15: {"soldier": 3},
+ 20: {"fodder": 10, "soldier": 6},
+ 30: {"fodder": 5, "gnome": 1},
+ }
]
# defenders
diff --git a/scripts/player.gd b/scripts/player.gd
index 43ca213..4a37965 100644
--- a/scripts/player.gd
+++ b/scripts/player.gd
@@ -38,6 +38,8 @@ func _unhandled_input(event):
for id in tower_ids.keys():
if event.is_action_pressed(id):
_tm.handle_tower_key(tower_ids[id], global_position)
+ if event.is_action_pressed("advance_wave"):
+ GameData.start_spawning()
emit_signal("curr_tile", _get_tile_state())
func handle_move(dir):
diff --git a/scripts/wave_spawner.gd b/scripts/wave_spawner.gd
index 4e6e973..653fe92 100644
--- a/scripts/wave_spawner.gd
+++ b/scripts/wave_spawner.gd
@@ -7,15 +7,9 @@ extends Node2D
@onready var gnome_enemy = preload("res://scenes/gnome.tscn")
@onready var map = get_node("../Map")
-@onready var _wave_timer = $Timer
@onready var _path : Path2D
@onready var _enemy_map : Dictionary[String, PackedScene]
-@onready var _wave_pool : Array[Array] = [
- ["fodder", "soldier"],
- ["fodder", "soldier", "gnome"],
- ["soldier", "gnome"],
-]
func _ready() -> void:
_enemy_map = {
@@ -23,7 +17,6 @@ func _ready() -> void:
"soldier": soldier_enemy,
"gnome": gnome_enemy,
}
- _wave_timer.wait_time = game_stats_config.wave_time
var curve : Curve2D = Curve2D.new()
var points : Array[Vector2i] = map.get_enemy_path()
@@ -38,40 +31,38 @@ func _ready() -> void:
_path.curve = curve
add_child(_path)
-func _on_timer_timeout():
- var current_wave : int = GameData.get_current_wave()
- # TODO win screen should play instead
- if current_wave > game_stats_config.max_wave:
- return
+ GameData.connect("wave_started", Callable(self, "spawn_wave"))
- spawn_wave(current_wave)
- GameData.increment_wave()
+func spawn_wave(wave_num):
+ var wave : Dictionary = game_stats_config.wave_data[wave_num]
+ var timestamps = wave.keys()
+ var prev_time = 0
+ timestamps.sort()
-func spawn_wave(current_wave):
- var selected_crawlers: Array = []
- var total_worth : int = 0
- var target_worth : int = game_stats_config.wave_targets[current_wave - 1]
+ var debug_curr_time = (Time.get_ticks_msec() / 1000.0)
- while total_worth < target_worth:
- var crawler_type = _select_crawler(current_wave)
- if crawler_type:
- selected_crawlers.append(crawler_type)
- total_worth += game_stats_config.crawlers[crawler_type]["worth"]
+ for i in timestamps:
+ print("Spawned ", i, " at ", (Time.get_ticks_msec() / 1000.0) - debug_curr_time)
+ await _spawn_crawlers(_get_crawler_spawn_order(wave[i]), i - prev_time)
+ prev_time = i
- var spawn_interval: float = game_stats_config.wave_time / selected_crawlers.size()
+ GameData.stop_spawning()
- for crawler in selected_crawlers:
- await get_tree().create_timer(spawn_interval).timeout
- _spawn_crawler(crawler)
+func _get_crawler_spawn_order(crawler_dict : Dictionary) -> Array[String]:
+ var crawler_array : Array[String]
+ for i in crawler_dict.keys():
+ for j in range(crawler_dict[i]):
+ crawler_array.append(i)
+ crawler_array.shuffle()
+ return crawler_array
+
+func _spawn_crawlers(crawler_array: Array, timeout : float):
+ var spawn_interval = timeout / crawler_array.size()
-func _select_crawler(current_wave) -> String:
- var curr_wave_pool = _wave_pool[current_wave - 1]
- if randi() % 100 < 80:
- # spawn fodder
- return curr_wave_pool[0]
- else:
- var non_fodder = curr_wave_pool.slice(1, curr_wave_pool.size())
- return non_fodder[randi() % non_fodder.size()]
+ for i in range(crawler_array.size()):
+ var crawler_type = crawler_array[i]
+ await get_tree().create_timer(spawn_interval).timeout
+ _spawn_crawler(crawler_type)
func _spawn_crawler(crawler : String):
var follow_path : PathFollow2D = PathFollow2D.new()