summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-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
4 files changed, 57 insertions, 45 deletions
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()