diff options
-rw-r--r-- | project.godot | 5 | ||||
-rw-r--r-- | resources/game_stats_config.tres | 30 | ||||
-rw-r--r-- | scenes/game.tscn | 5 | ||||
-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 |
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() |