diff options
author | bd <bdunahu@operationnull.com> | 2025-05-25 15:17:58 -0400 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-05-25 15:17:58 -0400 |
commit | 39794265b361c2f259a58d677f9e2e10b64d00af (patch) | |
tree | 5fb9b7f027c9f721964c4ea494ddb184e11da043 | |
parent | 2e0c1c719db8bd6949a98678d0848c314bdaa0d7 (diff) |
Add more chaos to warlock bolts, fix crash with oob upgrades
-rw-r--r-- | resources/game_stats_config.tres | 13 | ||||
-rw-r--r-- | scripts/base_defender.gd | 6 | ||||
-rw-r--r-- | scripts/game_stats_config.gd | 11 | ||||
-rw-r--r-- | scripts/player.gd | 8 | ||||
-rw-r--r-- | scripts/tower_manager.gd | 42 | ||||
-rw-r--r-- | scripts/warlock.gd | 18 | ||||
-rw-r--r-- | scripts/warlock_projectile.gd | 28 |
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") |