diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/game_data.gd | 13 | ||||
-rw-r--r-- | scripts/game_stats_config.gd | 18 | ||||
-rw-r--r-- | scripts/lake_generator.gd | 1 | ||||
-rw-r--r-- | scripts/soldier.gd | 10 | ||||
-rw-r--r-- | scripts/soldier.gd.uid | 1 | ||||
-rw-r--r-- | scripts/wave_spawner.gd | 77 |
6 files changed, 94 insertions, 26 deletions
diff --git a/scripts/game_data.gd b/scripts/game_data.gd index 7c82257..d2d1de7 100644 --- a/scripts/game_data.gd +++ b/scripts/game_data.gd @@ -4,8 +4,9 @@ var game_stats_config = preload("res://resources/game_stats_config.tres") signal life_changed signal morale_changed -var _life: int = game_stats_config.starting_life -var _morale: int = game_stats_config.starting_morale +var _life : int = game_stats_config.starting_life +var _morale : int = game_stats_config.starting_morale +var _current_wave : int = 1 func get_life() -> int: return _life @@ -27,4 +28,10 @@ func add_morale(amount: int): func subtract_morale(amount: int): _morale -= amount - emit_signal("life_changed", _morale) + emit_signal("morale_changed", _morale) + +func get_current_wave() -> int: + return _current_wave + +func increment_wave(): + _current_wave += 1 diff --git a/scripts/game_stats_config.gd b/scripts/game_stats_config.gd index ce71b74..ccbcd16 100644 --- a/scripts/game_stats_config.gd +++ b/scripts/game_stats_config.gd @@ -2,8 +2,15 @@ extends Resource class_name GameStatsConfig # game stats -@export var starting_life : int = 20 +@export var starting_life : int = 15 @export var starting_morale : int = 10 +@export var max_wave : int = 1 + +# waves +@export var wave_time : float = 40.0 +@export var wave_targets = [ + 25, 65 +] # defenders @export var warlock_damage : float = 5.0 @@ -19,6 +26,11 @@ class_name GameStatsConfig # crawlers @export var fodder_damage : float = 1.0 -@export var fodder_speed : float = 30.0 -@export var fodder_health : float = 25.0 +@export var fodder_speed : float = 40.0 +@export var fodder_health : float = 10.0 @export var fodder_worth : float = 2.0 + +@export var soldier_damage : float = 1.0 +@export var soldier_speed : float = 30.0 +@export var soldier_health : float = 35.0 +@export var soldier_worth : float = 5.0 diff --git a/scripts/lake_generator.gd b/scripts/lake_generator.gd index 6c5050d..8d14e26 100644 --- a/scripts/lake_generator.gd +++ b/scripts/lake_generator.gd @@ -30,7 +30,6 @@ func generate_lake(): break _visit_tile(tile) - print(map_config.max_lake_size) while _lake.size() < map_config.max_lake_size: tile = _pop_tile() # no room to grow diff --git a/scripts/soldier.gd b/scripts/soldier.gd new file mode 100644 index 0000000..39f9350 --- /dev/null +++ b/scripts/soldier.gd @@ -0,0 +1,10 @@ +extends "res://scripts/base_crawler.gd" + +var game_stats_config = preload("res://resources/game_stats_config.tres") + +func _ready() -> void: + damage = game_stats_config.soldier_damage + speed = game_stats_config.soldier_speed + max_health = game_stats_config.soldier_health + worth = game_stats_config.soldier_worth + super() diff --git a/scripts/soldier.gd.uid b/scripts/soldier.gd.uid new file mode 100644 index 0000000..0c031f9 --- /dev/null +++ b/scripts/soldier.gd.uid @@ -0,0 +1 @@ +uid://cu73ekuhjmdoj diff --git a/scripts/wave_spawner.gd b/scripts/wave_spawner.gd index 0b4ca2e..eea656f 100644 --- a/scripts/wave_spawner.gd +++ b/scripts/wave_spawner.gd @@ -1,36 +1,75 @@ extends Node2D @onready var map_config = preload("res://resources/map_generator_resource.tres") +@onready var game_stats_config = preload("res://resources/game_stats_config.tres") @onready var fodder_enemy = preload("res://scenes/fodder.tscn") +@onready var soldier_enemy = preload("res://scenes/soldier.tscn") @onready var map = get_node("../Map") -var curve : Curve2D +@onready var _wave_timer = $Timer +@onready var _wave_pool : Array[Array] +@onready var _path : Path2D func _ready() -> void: - curve = Curve2D.new() - - var path : Array[Vector2i] = map.get_enemy_path() + _wave_pool = [ + [fodder_enemy , soldier_enemy], + ] + _wave_timer = game_stats_config.wave_time + var curve : Curve2D = Curve2D.new() + var points : Array[Vector2i] = map.get_enemy_path() # add off-screen points - path.insert(0, path[0] - Vector2i(1, 0)) - path.append(path[path.size() - 1] + Vector2i(1, 0)) - - # adjust to grid size - for i in map.get_enemy_path(): + points.insert(0, points[0] - Vector2i(1, 0)) + points.append(points[points.size() - 1] + Vector2i(1, 0)) + # scale to grid size + for i in points: curve.add_point(i * map_config.tile_size + Vector2i.ONE * (map_config.tile_size / 2)) + _path = Path2D.new() + _path.curve = curve + add_child(_path) + func _on_timer_timeout(): - var path = Path2D.new() - path.curve = curve + var current_wave : int = GameData.get_current_wave() + # TODO win screen should play instead + if current_wave > 1: + return - var follow_path = PathFollow2D.new() - follow_path.set_progress(0) - follow_path.rotates = false - follow_path.loop = false + spawn_wave(current_wave) + GameData.increment_wave() - var enemy = fodder_enemy.instantiate() +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] - follow_path.add_child(enemy) - path.add_child(follow_path) + while total_worth < target_worth: + var crawler_type = _select_crawler(current_wave) + if crawler_type: + selected_crawlers.append(crawler_type) + # FIXME + total_worth += 2 - add_child(path) + var spawn_interval: float = game_stats_config.wave_time / selected_crawlers.size() + + for crawler in selected_crawlers: + await get_tree().create_timer(spawn_interval).timeout + _spawn_crawler(crawler) + +func _select_crawler(current_wave) -> PackedScene: + var curr_wave_pool = _wave_pool[current_wave - 1] + print(curr_wave_pool) + if randi() % 100 < 70: + # 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()] + +func _spawn_crawler(crawler : PackedScene): + var follow_path : PathFollow2D = PathFollow2D.new() + follow_path.set_progress(0) + follow_path.rotates = false + follow_path.loop = false + _path.add_child(follow_path) + follow_path.add_child(crawler.instantiate()) |