diff options
author | bd <bdunahu@operationnull.com> | 2025-05-29 14:32:47 -0400 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-05-29 14:32:47 -0400 |
commit | 0f6253876681955020005e7c29429b59250af601 (patch) | |
tree | 7c0c6a8922aad8204fd81950661f68ad9a1011ea /scripts | |
parent | 3affe4e168604dcaafd93e03a79b5cc6122d5bfc (diff) |
More advanced wave spawning, player controls advancing of waves
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/game_data.gd | 23 | ||||
-rw-r--r-- | scripts/game_stats_config.gd | 16 | ||||
-rw-r--r-- | scripts/player.gd | 2 | ||||
-rw-r--r-- | scripts/wave_spawner.gd | 61 |
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() |