From 3e15dfe033217d16e3198f044dd717408553218c Mon Sep 17 00:00:00 2001 From: bd Date: Fri, 23 May 2025 13:27:32 -0400 Subject: Very basic wave spawning, new soldier crawler --- resources/game_stats_config.tres | 13 ++++++- scenes/fodder.tscn | 9 ++--- scenes/soldier.tscn | 18 ++++++++++ scripts/game_data.gd | 13 +++++-- scripts/game_stats_config.gd | 18 ++++++++-- scripts/lake_generator.gd | 1 - scripts/soldier.gd | 10 ++++++ scripts/soldier.gd.uid | 1 + scripts/wave_spawner.gd | 77 ++++++++++++++++++++++++++++++---------- 9 files changed, 126 insertions(+), 34 deletions(-) create mode 100644 scenes/soldier.tscn create mode 100644 scripts/soldier.gd create mode 100644 scripts/soldier.gd.uid diff --git a/resources/game_stats_config.tres b/resources/game_stats_config.tres index f5eaf7c..1a5d450 100644 --- a/resources/game_stats_config.tres +++ b/resources/game_stats_config.tres @@ -4,8 +4,11 @@ [resource] script = ExtResource("1_t0c0a") -starting_life = 20 +starting_life = 15 starting_morale = 10 +max_wave = 1 +wave_time = 40.0 +wave_targets = [25, 65] warlock_damage = 5.0 warlock_fire_rate = 1.0 warlock_defender_range = 75.0 @@ -15,4 +18,12 @@ wyvern_fire_rate = 1.0 wyvern_damage_tick_rate = 0.25 wyvern_defender_range = 35.0 wyvern_defender_cost = 15 +fodder_damage = 1.0 +fodder_speed = 40.0 +fodder_health = 10.0 +fodder_worth = 2.0 +soldier_damage = 1.0 +soldier_speed = 30.0 +soldier_health = 35.0 +soldier_worth = 5.0 metadata/_custom_type_script = "uid://dndluiku7wdi8" diff --git a/scenes/fodder.tscn b/scenes/fodder.tscn index 05813e6..b824f30 100644 --- a/scenes/fodder.tscn +++ b/scenes/fodder.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=5 format=3 uid="uid://rp5orgc6ae7j"] +[gd_scene load_steps=4 format=3 uid="uid://rp5orgc6ae7j"] [ext_resource type="Script" uid="uid://gn1504blq1pf" path="res://scripts/fodder.gd" id="1_4lnnv"] [ext_resource type="Texture2D" uid="uid://di2vybjsniag4" path="res://assets/tilemap.png" id="2_eps3e"] @@ -6,8 +6,6 @@ [sub_resource type="CircleShape2D" id="CircleShape2D_220eh"] radius = 8.06226 -[sub_resource type="Curve2D" id="Curve2D_q2rr1"] - [node name="CrawlerFodder" type="CharacterBody2D"] script = ExtResource("1_4lnnv") @@ -17,7 +15,4 @@ shape = SubResource("CircleShape2D_220eh") [node name="Sprite2D" type="Sprite2D" parent="."] texture = ExtResource("2_eps3e") region_enabled = true -region_rect = Rect2(432, 0, 16, 16) - -[node name="Node2D" type="Path2D" parent="."] -curve = SubResource("Curve2D_q2rr1") +region_rect = Rect2(400, 64, 16, 16) diff --git a/scenes/soldier.tscn b/scenes/soldier.tscn new file mode 100644 index 0000000..d95d989 --- /dev/null +++ b/scenes/soldier.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=3 uid="uid://dvk754te5630x"] + +[ext_resource type="Script" uid="uid://cu73ekuhjmdoj" path="res://scripts/soldier.gd" id="1_q2rr1"] +[ext_resource type="Texture2D" uid="uid://di2vybjsniag4" path="res://assets/tilemap.png" id="2_2oslh"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_220eh"] +radius = 8.06226 + +[node name="CrawlerFodder" type="CharacterBody2D"] +script = ExtResource("1_q2rr1") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_220eh") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_2oslh") +region_enabled = true +region_rect = Rect2(448, 0, 16, 16) 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()) -- cgit v1.2.3