summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--resources/game_stats_config.tres13
-rw-r--r--scripts/base_defender.gd6
-rw-r--r--scripts/game_stats_config.gd11
-rw-r--r--scripts/player.gd8
-rw-r--r--scripts/tower_manager.gd42
-rw-r--r--scripts/warlock.gd18
-rw-r--r--scripts/warlock_projectile.gd28
7 files changed, 73 insertions, 53 deletions
diff --git a/resources/game_stats_config.tres b/resources/game_stats_config.tres
index 67df2a4..5b100fa 100644
--- a/resources/game_stats_config.tres
+++ b/resources/game_stats_config.tres
@@ -4,33 +4,36 @@
[resource]
script = ExtResource("1_t0c0a")
-starting_life = 20
+starting_life = 50
starting_morale = 10
max_wave = 3
wave_time = 20.0
wave_targets = [15, 40, 120]
defenders = Array[Dictionary]([{
+"chaos_factor": 35.0,
"cost": 10,
"damage": 4.0,
"desc": "Warlock",
"fire_rate": 1.2,
-"projectile_speed": 100,
+"max_projectile_lifetime": 7.5,
+"projectile_speed": 125,
"range": 75.0,
"sprite_attacking": Vector2i(28, 1),
"sprite_idle": Vector2i(29, 1),
"sprite_panel": Vector2i(32, 4),
"upgrades": [{
-"cost": 12,
+"cost": 10,
"desc": "Phoenix (DMG)",
"effects": {
"damage": 9.0
},
"sprite_panel": Vector2i(32, 5)
}, {
-"cost": 20,
+"cost": 15,
"desc": "Falcon (RNGE)",
"effects": {
-"projectile_speed": 200.0,
+"chaos_factor": 0.0,
+"projectile_speed": 300.0,
"range": 275.0,
"sprite_attacking": Vector2i(31, 2),
"sprite_idle": Vector2i(31, 1)
diff --git a/scripts/base_defender.gd b/scripts/base_defender.gd
index a935507..6524b37 100644
--- a/scripts/base_defender.gd
+++ b/scripts/base_defender.gd
@@ -58,10 +58,8 @@ func _update_state_machine(curr : PathFollow2D) -> void:
target = curr.get_child(0)
_attack_state()
-func _on_tower_body_entered(_body: Node2D) -> void:
- var old_target : CharacterBody2D = target
- select_target()
- if old_target == null && old_target != target:
+func _on_tower_body_entered(body: Node2D) -> void:
+ if target == null && "Crawler" in body.name:
$FireTimer.start(tower_data["fire_rate"])
_on_fire_timer_timeout()
diff --git a/scripts/game_stats_config.gd b/scripts/game_stats_config.gd
index a10bef8..f58ec64 100644
--- a/scripts/game_stats_config.gd
+++ b/scripts/game_stats_config.gd
@@ -24,12 +24,14 @@ enum defenders_index {WARLOCK, WYVERN, WEREWOLF, WELLSPRING}
"sprite_attacking": Vector2i(28, 1),
"sprite_idle": Vector2i(29, 1),
"cost": 10,
- "projectile_speed" : 100,
+ "projectile_speed" : 125,
+ "chaos_factor": 35.0,
+ "max_projectile_lifetime": 7.5,
"upgrades": [
{
"desc": "Phoenix (DMG)",
"sprite_panel": Vector2i(32, 5),
- "cost": 12,
+ "cost": 10,
"effects": {
"damage": 9.0,
},
@@ -37,10 +39,11 @@ enum defenders_index {WARLOCK, WYVERN, WEREWOLF, WELLSPRING}
{
"desc": "Falcon (RNGE)",
"sprite_panel": Vector2i(34, 4),
- "cost": 20,
+ "cost": 15,
"effects": {
- "projectile_speed": 200.0,
+ "projectile_speed": 300.0,
"range": 275.0,
+ "chaos_factor": 0.0,
"sprite_attacking": Vector2i(31, 2),
"sprite_idle": Vector2i(31, 1),
}
diff --git a/scripts/player.gd b/scripts/player.gd
index b26beac..43ca213 100644
--- a/scripts/player.gd
+++ b/scripts/player.gd
@@ -15,10 +15,10 @@ var dirs = {
}
var tower_ids = {
- "tower_action_one": game_stats_config.defenders_index.WARLOCK,
- "tower_action_two": game_stats_config.defenders_index.WYVERN,
- "tower_action_three": game_stats_config.defenders_index.WARLOCK,
- "tower_action_four": game_stats_config.defenders_index.WARLOCK,
+ "tower_action_one": 0,
+ "tower_action_two": 1,
+ "tower_action_three": 2,
+ "tower_action_four": 3,
}
signal curr_tile(tile_state)
diff --git a/scripts/tower_manager.gd b/scripts/tower_manager.gd
index 7440a9a..89f037d 100644
--- a/scripts/tower_manager.gd
+++ b/scripts/tower_manager.gd
@@ -13,15 +13,6 @@ var _tower_data : Array[Dictionary] = [
"scene": preload("res://scenes/wyvern.tscn"),
"cost": game_stats_config.defenders[1]["cost"],
},
- # TODO -- space reserved for last two towers
- {
- "scene": preload("res://scenes/warlock.tscn"),
- "cost": game_stats_config.defenders[0]["cost"],
- },
- {
- "scene": preload("res://scenes/warlock.tscn"),
- "cost": game_stats_config.defenders[0]["cost"],
- },
]
func _ready():
@@ -31,24 +22,27 @@ func handle_tower_key(tower_index : int, tile_position : Vector2i):
if is_tile_occupied(tile_position):
_handle_upgrade(tower_index, _towers[tile_position])
elif is_valid_placement_tile(tile_position):
- _handle_place_tower(_tower_data[tower_index], tile_position)
+ _handle_place_tower(tower_index, tile_position)
func _handle_upgrade(upgrade_index : int, tower : StaticBody2D):
var upgrades = tower.tower_data["upgrades"]
- var upgrade_cost = upgrades[upgrade_index]["cost"]
-
- if GameData.get_life() >= upgrade_cost:
- GameData.subtract_life(upgrade_cost)
- tower.apply_upgrade(upgrades[upgrade_index]["effects"])
-
-func _handle_place_tower(tower : Dictionary, tile_position : Vector2i):
- var tower_cost = tower["cost"]
- if GameData.get_life() >= tower_cost:
- GameData.subtract_life(tower_cost)
- var tmp = tower["scene"].instantiate()
- add_child(tmp)
- tmp.global_position = tile_position
- _occupy_tile(tile_position, tmp)
+ if upgrades.size() > upgrade_index:
+ var upgrade_cost = upgrades[upgrade_index]["cost"]
+ if GameData.get_life() >= upgrade_cost:
+ GameData.subtract_life(upgrade_cost)
+ tower.apply_upgrade(upgrades[upgrade_index]["effects"])
+ upgrades.remove_at(upgrade_index)
+
+func _handle_place_tower(tower_index : int, tile_position : Vector2i):
+ if _tower_data.size() > tower_index:
+ var tower = _tower_data[tower_index]
+ var tower_cost = tower["cost"]
+ if GameData.get_life() >= tower_cost:
+ GameData.subtract_life(tower_cost)
+ var tmp = tower["scene"].instantiate()
+ add_child(tmp)
+ tmp.global_position = tile_position
+ _occupy_tile(tile_position, tmp)
func get_upgrades_at(tile_position : Vector2i) -> Array:
if _towers.has(tile_position):
diff --git a/scripts/warlock.gd b/scripts/warlock.gd
index 80d6e58..e19b394 100644
--- a/scripts/warlock.gd
+++ b/scripts/warlock.gd
@@ -10,11 +10,17 @@ func _ready():
func _on_fire_timer_timeout():
select_target()
if (target != null):
- var tmp_projectile = projectile.instantiate()
- tmp_projectile.target = target
- tmp_projectile.speed = tower_data["projectile_speed"]
- tmp_projectile.projectile_damage = tower_data["damage"]
- get_node("ProjectileContainer").call_deferred("add_child", tmp_projectile)
- tmp_projectile.global_position = $Aim.global_position
+ var bolt = _get_projectile()
+ bolt.target = target
+ get_node("ProjectileContainer").call_deferred("add_child", bolt)
+ bolt.global_position = $Aim.global_position
else:
$FireTimer.stop()
+
+func _get_projectile() -> CharacterBody2D:
+ var bolt = projectile.instantiate()
+ bolt.speed = tower_data["projectile_speed"]
+ bolt.projectile_damage = tower_data["damage"]
+ bolt.chaos_factor = tower_data["chaos_factor"]
+ bolt.max_lifetime = tower_data["max_projectile_lifetime"]
+ return bolt
diff --git a/scripts/warlock_projectile.gd b/scripts/warlock_projectile.gd
index 326dfba..2c3830f 100644
--- a/scripts/warlock_projectile.gd
+++ b/scripts/warlock_projectile.gd
@@ -3,11 +3,16 @@ extends CharacterBody2D
var target : CharacterBody2D
var speed : int
var projectile_damage : int
+var max_lifetime : float
+var chaos_factor : float
-func _physics_process(_delta: float):
- if !is_instance_valid(target):
+var _total_lifetime : float = 0.0
+
+func _physics_process(delta: float):
+ if _total_lifetime > max_lifetime:
queue_free()
else:
+ _total_lifetime += delta
_move_projectile()
func _on_area_2d_body_entered(body: Node2D):
@@ -16,8 +21,19 @@ func _on_area_2d_body_entered(body: Node2D):
queue_free()
func _move_projectile():
- var pos : Vector2
- pos = target.global_position
- velocity = global_position.direction_to(pos) * speed
- look_at(pos)
+ var pos : Vector2 = _get_target_position()
+ var curve_offset = Vector2(
+ sin(_total_lifetime * 5) * chaos_factor,
+ cos(_total_lifetime * 5) * chaos_factor,
+ )
+ velocity = global_position.direction_to(pos) * speed + curve_offset
move_and_slide()
+
+func _get_target_position() -> Vector2:
+ if is_instance_valid(target):
+ return target.global_position
+ else:
+ return Vector2(randf_range(-2.0, 2.0), randf_range(-2.0, 2.0)) + global_position
+
+#func _assign_new_target():
+ #var enemies = get_tree().get_nodes_in_group("enemies")