summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--resources/game_stats_config.tres13
-rw-r--r--scenes/fodder.tscn9
-rw-r--r--scenes/soldier.tscn18
-rw-r--r--scripts/game_data.gd13
-rw-r--r--scripts/game_stats_config.gd18
-rw-r--r--scripts/lake_generator.gd1
-rw-r--r--scripts/soldier.gd10
-rw-r--r--scripts/soldier.gd.uid1
-rw-r--r--scripts/wave_spawner.gd77
9 files changed, 126 insertions, 34 deletions
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())