summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/tilemap.pngbin25287 -> 25306 bytes
-rw-r--r--assets/tilemap.xcfbin226488 -> 227048 bytes
-rw-r--r--notes.org28
-rw-r--r--project.godot14
-rw-r--r--resources/game_stats_config.tres49
-rw-r--r--scenes/Main.tscn2
-rw-r--r--scenes/ui.tscn41
-rw-r--r--scenes/ui_option.tscn (renamed from scenes/ui_panel.tscn)6
-rw-r--r--scripts/base_defender.gd13
-rw-r--r--scripts/game_data.gd8
-rw-r--r--scripts/game_stats_config.gd62
-rw-r--r--scripts/life.gd11
-rw-r--r--scripts/life.gd.uid1
-rw-r--r--scripts/morale.gd11
-rw-r--r--scripts/morale.gd.uid1
-rw-r--r--scripts/player.gd37
-rw-r--r--scripts/tower_manager.gd67
-rw-r--r--scripts/ui.gd34
-rw-r--r--scripts/ui.gd.uid1
-rw-r--r--scripts/warlock.gd2
-rw-r--r--scripts/wyvern.gd2
21 files changed, 246 insertions, 144 deletions
diff --git a/assets/tilemap.png b/assets/tilemap.png
index f1ad202..dbad734 100644
--- a/assets/tilemap.png
+++ b/assets/tilemap.png
Binary files differ
diff --git a/assets/tilemap.xcf b/assets/tilemap.xcf
index 4a972a8..089dcad 100644
--- a/assets/tilemap.xcf
+++ b/assets/tilemap.xcf
Binary files differ
diff --git a/notes.org b/notes.org
new file mode 100644
index 0000000..6742a5f
--- /dev/null
+++ b/notes.org
@@ -0,0 +1,28 @@
+* Tower Ideas
+
+3-4 total towers. Two of which actually do damage? 3-4 abilities per tower, no "tiers of upgrades", each can be bought at any time in any order, but only up to 2.
+
+** Warlock
+
+Basic shooty tower
+
+** Wyvern
+
+This would be the main AOE tower, but also possesses lots of pierce:
+
+- Default attack: a short range spray of fire, which doesn't fire straight. Med damage, infinite pierce. Has to 'warm up' for a second
+- Forked tongue: an upgrade that replaces the single jet spray with two jet sprays, however none of them are directly where the tower is aiming
+- Ice dragon: replaces the fire attack with ice, which has low damage but slows. Forked tongue combined with this would work the same
+- Lightning dragon: replaces the first attack with a fast, immediate lightning strike. High damage. Forked tongue works the same, but combined with ice dragon, changes the attack to a slow-firing icicle with infinite range and pierce, high damage and slows. Tower becomes long range.
+
+** Werewolf
+
+Charges down the path (not around corners). Grabs the first enemy it collides with, dragging it back (moderate speed) to its original tower position, dealing damage the whole way. If the enemy is still alive when it finishes, it releases the enemy there. If the enemy dies midway, the werewolf charges back to its original position.
+
+This tower is meant to be slow, but high-single target damage.
+
+Obviously, the werewolf will be ineffective if placed on short straights, but very effective if it grabs a boss enemy on a long straight (anything it grabs is probably dead...)
+
+Enemies in another werewolf's grasp cannot be grabbed, but using multiple werewolfs on the same path may still be interesting.
+
+** Wellspring
diff --git a/project.godot b/project.godot
index 5e1f0ed..0d1189e 100644
--- a/project.godot
+++ b/project.godot
@@ -56,16 +56,26 @@ move_down={
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":74,"key_label":0,"unicode":106,"location":0,"echo":false,"script":null)
]
}
-place_warlock={
+tower_action_one={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
]
}
-place_wyvern={
+tower_action_two={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
]
}
+tower_action_three={
+"deadzone": 0.2,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
+]
+}
+tower_action_four={
+"deadzone": 0.2,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null)
+]
+}
[rendering]
diff --git a/resources/game_stats_config.tres b/resources/game_stats_config.tres
index 6fd9758..97b06f4 100644
--- a/resources/game_stats_config.tres
+++ b/resources/game_stats_config.tres
@@ -4,7 +4,7 @@
[resource]
script = ExtResource("1_t0c0a")
-starting_life = 15
+starting_life = 20
starting_morale = 10
max_wave = 3
wave_time = 20.0
@@ -13,39 +13,76 @@ defenders = Dictionary[String, Dictionary]({
"warlock": {
"cost": 10,
"damage": 4.0,
+"desc": "Warlock",
"fire_rate": 1.2,
+"projectile_speed": 100,
"range": 75.0,
+"sprite_attacking": Vector2i(28, 1),
+"sprite_idle": Vector2i(29, 1),
+"sprite_panel": Vector2i(32, 4),
+"upgrades": {
+"tower_action_one": {
+"cost": 12,
+"desc": "Phoenix (DMG)",
+"effects": {
+"damage": 9.0
+},
+"sprite_panel": Vector2i(32, 5)
+},
+"tower_action_three": {
+"cost": 20,
+"desc": "Falcon (RNGE)",
+"effects": {
+"projectile_speed": 200.0,
+"range": 275.0,
"sprite_attacking": Vector2i(31, 2),
-"sprite_idle": Vector2i(31, 1),
-"sprite_panel": Vector2i(32, 4)
+"sprite_idle": Vector2i(31, 1)
+},
+"sprite_panel": Vector2i(34, 4)
+},
+"tower_action_two": {
+"cost": 7,
+"desc": "Sparrow (DUP)",
+"effects": {
+"fire_rate": 1.7
+},
+"sprite_panel": Vector2i(35, 5)
+}
+}
},
"wellspring": {
"cost": 1,
"damage": 1.0,
+"desc": "Wellspring",
"fire_rate": 1.0,
"range": 1.0,
"sprite_attacking": Vector2i(38, 11),
"sprite_idle": Vector2i(38, 11),
-"sprite_panel": Vector2i(38, 11)
+"sprite_panel": Vector2i(38, 11),
+"upgrades": {}
},
"werewolf": {
"cost": 1,
"damage": 1.0,
+"desc": "Werewolf",
"fire_rate": 1.0,
"range": 1.0,
"sprite_attacking": Vector2i(26, 11),
"sprite_idle": Vector2i(26, 11),
-"sprite_panel": Vector2i(26, 11)
+"sprite_panel": Vector2i(26, 11),
+"upgrades": {}
},
"wyvern": {
"cost": 15,
"damage": 1.0,
"damage_tick_rate": 0.25,
+"desc": "Wyvern",
"fire_rate": 1.0,
"range": 35.0,
"sprite_attacking": Vector2i(25, 10),
"sprite_idle": Vector2i(24, 10),
-"sprite_panel": Vector2i(28, 11)
+"sprite_panel": Vector2i(28, 11),
+"upgrades": {}
}
})
crawlers = Dictionary[String, Dictionary]({
diff --git a/scenes/Main.tscn b/scenes/Main.tscn
index cf7c8c7..524c766 100644
--- a/scenes/Main.tscn
+++ b/scenes/Main.tscn
@@ -27,7 +27,7 @@ func free_tile(tile_position):
[node name="Main" type="Node2D"]
-[node name="Cursor" parent="." instance=ExtResource("4_rarhs")]
+[node name="Player" parent="." instance=ExtResource("4_rarhs")]
z_index = 2
[node name="Map" parent="." instance=ExtResource("2_vcsgt")]
diff --git a/scenes/ui.tscn b/scenes/ui.tscn
index c7d05a9..5f10b53 100644
--- a/scenes/ui.tscn
+++ b/scenes/ui.tscn
@@ -1,19 +1,19 @@
-[gd_scene load_steps=5 format=3 uid="uid://dycgp3yept14k"]
+[gd_scene load_steps=3 format=3 uid="uid://dycgp3yept14k"]
-[ext_resource type="Script" uid="uid://dtj2opmwvh4y1" path="res://scripts/life.gd" id="1_suays"]
-[ext_resource type="Script" uid="uid://b8urrbmynk327" path="res://scripts/morale.gd" id="1_yb1mt"]
-[ext_resource type="PackedScene" uid="uid://edgs77gubcl8" path="res://scenes/ui_panel.tscn" id="3_yev5y"]
+[ext_resource type="Script" uid="uid://biw5cwtetstux" path="res://scripts/ui.gd" id="1_yev5y"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nt14h"]
bg_color = Color(0, 0.0117647, 0.552941, 1)
-[node name="PanelContainer" type="PanelContainer"]
+[node name="UI" type="PanelContainer"]
anchors_preset = 10
anchor_right = 1.0
+offset_right = -313.0
offset_bottom = 17.0
grow_horizontal = 2
-size_flags_vertical = 0
+size_flags_horizontal = 3
theme_override_styles/panel = SubResource("StyleBoxFlat_nt14h")
+script = ExtResource("1_yev5y")
[node name="MarginContainer" type="MarginContainer" parent="."]
layout_mode = 2
@@ -22,39 +22,24 @@ theme_override_constants/margin_top = 0
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"]
layout_mode = 2
+size_flags_vertical = 0
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"]
+clip_contents = true
layout_mode = 2
+size_flags_horizontal = 0
theme_override_constants/separation = -3
[node name="Morale" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"]
layout_mode = 2
theme_override_font_sizes/font_size = 8
-text = "Morale: 10"
-script = ExtResource("1_yb1mt")
+text = " Morale: "
[node name="Life" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"]
layout_mode = 2
theme_override_font_sizes/font_size = 8
-text = "Life: 20"
-script = ExtResource("1_suays")
-
-[node name="Warlock" parent="MarginContainer/HBoxContainer" instance=ExtResource("3_yev5y")]
-layout_mode = 2
-object_name = "warlock"
-cost = "10"
-
-[node name="Wyvern" parent="MarginContainer/HBoxContainer" instance=ExtResource("3_yev5y")]
-layout_mode = 2
-object_name = "wyvern"
-cost = "15"
-
-[node name="Werewolf" parent="MarginContainer/HBoxContainer" instance=ExtResource("3_yev5y")]
-layout_mode = 2
-object_name = "werewolf"
-cost = "-"
+text = "Life: "
-[node name="Wellspring" parent="MarginContainer/HBoxContainer" instance=ExtResource("3_yev5y")]
+[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/HBoxContainer"]
layout_mode = 2
-object_name = "wellspring"
-cost = "-"
+size_flags_horizontal = 3
diff --git a/scenes/ui_panel.tscn b/scenes/ui_option.tscn
index e761516..d89e8cd 100644
--- a/scenes/ui_panel.tscn
+++ b/scenes/ui_option.tscn
@@ -1,17 +1,17 @@
[gd_scene load_steps=3 format=3 uid="uid://edgs77gubcl8"]
-[ext_resource type="Script" uid="uid://do8a8uq1jvs7b" path="res://scripts/ui_panel.gd" id="1_d2vu8"]
+[ext_resource type="Script" uid="uid://do8a8uq1jvs7b" path="res://scripts/ui_panel.gd" id="1_c3u8h"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_sv14y"]
bg_color = Color(0, 0.00526825, 0.379014, 1)
-[node name="UIPanel" type="Panel"]
+[node name="UIOption" type="Panel"]
custom_minimum_size = Vector2(16, 16)
offset_right = 24.0
offset_bottom = 16.0
size_flags_horizontal = 3
theme_override_styles/panel = SubResource("StyleBoxFlat_sv14y")
-script = ExtResource("1_d2vu8")
+script = ExtResource("1_c3u8h")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 0
diff --git a/scripts/base_defender.gd b/scripts/base_defender.gd
index 06ac34f..088f235 100644
--- a/scripts/base_defender.gd
+++ b/scripts/base_defender.gd
@@ -12,9 +12,9 @@ var target : CharacterBody2D
var _idle_texture : Texture
var _attack_texture : Texture
-func set_tower_stats(tower_name : String):
- tower_key = tower_name
- tower_data = game_stats_config.defenders[tower_key]
+func set_tower_stats(tower_index : int):
+ tower_data = game_stats_config.defenders[tower_index].duplicate()
+ tower_key = tower_data["desc"]
func reset_tower_range():
$Tower/CollisionShape2D.shape.radius = tower_data["range"]
@@ -24,9 +24,6 @@ func reset_tower_sprite():
_attack_texture = util.get_tile_texture(tower_data["sprite_attacking"])
_idle_state()
-func get_tower_key() -> String:
- return tower_key
-
func select_target() -> void:
var targets : Array = _find_targets()
@@ -73,7 +70,9 @@ func _idle_state():
func apply_upgrade(effects: Dictionary):
for key in effects.keys():
if key in tower_data:
- tower_data[key] += effects[key]
+ tower_data[key] = effects[key]
+ reset_tower_range()
+ reset_tower_sprite()
# extending classes should override below
func _on_fire_timer_timeout() -> void:
diff --git a/scripts/game_data.gd b/scripts/game_data.gd
index d2d1de7..0ed0f61 100644
--- a/scripts/game_data.gd
+++ b/scripts/game_data.gd
@@ -13,22 +13,22 @@ func get_life() -> int:
func add_life(amount: int):
_life += amount
- emit_signal("life_changed", _life)
+ emit_signal("life_changed")
func subtract_life(amount: int):
_life -= amount
- emit_signal("life_changed", _life)
+ emit_signal("life_changed")
func get_morale() -> int:
return _morale
func add_morale(amount: int):
_morale += amount
- emit_signal("morale_changed", _morale)
+ emit_signal("morale_changed")
func subtract_morale(amount: int):
_morale -= amount
- emit_signal("morale_changed", _morale)
+ emit_signal("morale_changed")
func get_current_wave() -> int:
return _current_wave
diff --git a/scripts/game_stats_config.gd b/scripts/game_stats_config.gd
index 873312d..89d265c 100644
--- a/scripts/game_stats_config.gd
+++ b/scripts/game_stats_config.gd
@@ -2,7 +2,7 @@ extends Resource
class_name GameStatsConfig
# game stats
-@export var starting_life : int = 15
+@export var starting_life : int = 20
@export var starting_morale : int = 10
# waves
@@ -13,39 +13,49 @@ class_name GameStatsConfig
]
# defenders
-@export var defenders : Dictionary[String, Dictionary] = {
- "warlock": {
+@export var defenders : Array[Dictionary] = [
+ {
+ "desc": "Warlock",
"damage" : 4.0,
"fire_rate" : 1.2,
"range": 75.0,
"sprite_panel": Vector2i(32, 4),
- "sprite_attacking": Vector2i(31, 2),
- "sprite_idle": Vector2i(31, 1),
+ "sprite_attacking": Vector2i(28, 1),
+ "sprite_idle": Vector2i(29, 1),
"cost": 10,
"projectile_speed" : 100,
- "upgrades": {
- "tower_action_one": {
- "cost": 7,
+ "upgrades": [
+ {
+ "desc": "Phoenix (DMG)",
+ "sprite_panel": Vector2i(32, 5),
+ "cost": 12,
"effects": {
- "damage": 3.0,
- }
+ "damage": 9.0,
+ },
},
- "tower_action_two": {
+ {
+ "desc": "Sparrow (DUP)",
+ "sprite_panel": Vector2i(35, 5),
"cost": 7,
"effects": {
- "fire_rate": 0.5
+ "fire_rate": 1.7
}
},
- "tower_action_three": {
- "cost": 30,
+ {
+ "desc": "Falcon (RNGE)",
+ "sprite_panel": Vector2i(34, 4),
+ "cost": 20,
"effects": {
- "projectile_speed": 300.0,
- "range": 200.0
+ "projectile_speed": 200.0,
+ "range": 275.0,
+ "sprite_attacking": Vector2i(31, 2),
+ "sprite_idle": Vector2i(31, 1),
}
},
- },
+ ],
},
- "wyvern": {
+ {
+ "desc": "Wyvern",
"damage" : 1.0,
"fire_rate" : 1.0,
"range": 35.0,
@@ -54,27 +64,33 @@ class_name GameStatsConfig
"sprite_idle": Vector2i(24, 10),
"cost": 15,
"damage_tick_rate": 0.25,
+ # TODO
+ "upgrades": [],
},
# TODO
- "werewolf": {
+ {
+ "desc": "Werewolf",
"damage": 1.0,
"fire_rate": 1.0,
"range": 1.0,
"sprite_panel": Vector2i(26, 11),
"sprite_attacking": Vector2i(26, 11),
"sprite_idle": Vector2i(26, 11),
- "cost": 1
+ "cost": 1,
+ "upgrades": [],
},
- "wellspring": {
+ {
+ "desc": "Wellspring",
"damage": 1.0,
"fire_rate": 1.0,
"range": 1.0,
"sprite_panel": Vector2i(38, 11),
"sprite_attacking": Vector2i(38, 11),
"sprite_idle": Vector2i(38, 11),
- "cost": 1
+ "cost": 1,
+ "upgrades": [],
}
-}
+]
# crawlers
@export var crawlers : Dictionary[String, Dictionary] = {
diff --git a/scripts/life.gd b/scripts/life.gd
deleted file mode 100644
index b185cda..0000000
--- a/scripts/life.gd
+++ /dev/null
@@ -1,11 +0,0 @@
-extends Label
-
-func _ready():
- GameData.connect("life_changed", Callable(self, "_on_life_changed"))
- update_label(GameData.get_life())
-
-func _on_life_changed(new_life: int) -> void:
- update_label(new_life)
-
-func update_label(new_life: int) -> void:
- text = "Life:" + str(new_life)
diff --git a/scripts/life.gd.uid b/scripts/life.gd.uid
deleted file mode 100644
index 6666d8d..0000000
--- a/scripts/life.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://dtj2opmwvh4y1
diff --git a/scripts/morale.gd b/scripts/morale.gd
deleted file mode 100644
index 613c7f5..0000000
--- a/scripts/morale.gd
+++ /dev/null
@@ -1,11 +0,0 @@
-extends Label
-
-func _ready():
- GameData.connect("morale_changed", Callable(self, "_on_morale_changed"))
- update_label(GameData.get_morale())
-
-func _on_morale_changed(new_morale: int) -> void:
- update_label(new_morale)
-
-func update_label(new_morale: int) -> void:
- text = "Morale:" + str(new_morale)
diff --git a/scripts/morale.gd.uid b/scripts/morale.gd.uid
deleted file mode 100644
index 2424396..0000000
--- a/scripts/morale.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://b8urrbmynk327
diff --git a/scripts/player.gd b/scripts/player.gd
index 45b2b61..d9ee0bd 100644
--- a/scripts/player.gd
+++ b/scripts/player.gd
@@ -1,16 +1,27 @@
extends Node2D
+var game_stats_config = preload("res://resources/game_stats_config.tres")
@onready var map_config = preload("res://resources/map_generator_resource.tres")
@onready var _tm = get_node("../Defenders")
var _max_x : int
var _max_y : int
-var dirs = {"move_right": Vector2.RIGHT,
- "move_left": Vector2.LEFT,
- "move_up": Vector2.UP,
- "move_down": Vector2.DOWN
- }
+var dirs = {
+ "move_right": Vector2.RIGHT,
+ "move_left": Vector2.LEFT,
+ "move_up": Vector2.UP,
+ "move_down": Vector2.DOWN
+}
+
+var tower_ids = {
+ "tower_action_one": 0,
+ "tower_action_two": 1,
+ "tower_action_three": 2,
+ "tower_action_four": 3,
+}
+
+signal curr_tile(tile_state)
func _ready():
_max_x = map_config.grid_width * map_config.tile_size
@@ -23,7 +34,10 @@ func _unhandled_input(event):
if event.is_action_pressed(dir):
handle_move(dirs[dir])
return
- _tm.handle_tower_key(event, position)
+ for id in tower_ids.keys():
+ if event.is_action_pressed(id):
+ _tm.handle_tower_key(tower_ids[id], global_position)
+ emit_signal("curr_tile", _get_tile_state())
func handle_move(dir):
position += dir * map_config.tile_size
@@ -31,3 +45,14 @@ func handle_move(dir):
position.y = max(position.y, map_config.tile_size / 2)
position.x = min(position.x, _max_x - (map_config.tile_size / 2))
position.y = min(position.y, _max_y - (map_config.tile_size / 2))
+
+# this method of getting uniform menu for the panel
+# was specifically designed that way in game stats config
+# it may be inefficient and is somewhat messy
+func _get_tile_state():
+ var tile_info = null
+ if _tm.is_tile_occupied(position):
+ tile_info = _tm.get_upgrades_at(position)
+ elif _tm.is_valid_placement_tile(position):
+ tile_info = game_stats_config.defenders
+ return tile_info
diff --git a/scripts/tower_manager.gd b/scripts/tower_manager.gd
index 9682dd9..7440a9a 100644
--- a/scripts/tower_manager.gd
+++ b/scripts/tower_manager.gd
@@ -4,56 +4,42 @@ var game_stats_config = preload("res://resources/game_stats_config.tres")
@onready var _tiles : TileMapLayer = get_node("../Map/TileMapLayer")
var _towers : Dictionary
-var _tower_actions : Array[String] = [
- "tower_action_one",
- "tower_action_two",
- "tower_action_three",
- "tower_action_four"
-]
-
-var _tower_data : Dictionary[String, Dictionary] = {
- "tower_action_one": {
+var _tower_data : Array[Dictionary] = [
+ {
"scene": preload("res://scenes/warlock.tscn"),
- "cost": game_stats_config.defenders["warlock"]["cost"],
+ "cost": game_stats_config.defenders[0]["cost"],
},
- "tower_action_two": {
+ {
"scene": preload("res://scenes/wyvern.tscn"),
- "cost": game_stats_config.defenders["wyvern"]["cost"],
+ "cost": game_stats_config.defenders[1]["cost"],
},
# TODO -- space reserved for last two towers
- "tower_action_three": {
+ {
"scene": preload("res://scenes/warlock.tscn"),
- "cost": game_stats_config.defenders["warlock"]["cost"],
+ "cost": game_stats_config.defenders[0]["cost"],
},
- "tower_action_four": {
+ {
"scene": preload("res://scenes/warlock.tscn"),
- "cost": game_stats_config.defenders["warlock"]["cost"],
+ "cost": game_stats_config.defenders[0]["cost"],
},
-}
+]
func _ready():
_towers = {}
-func handle_tower_key(event, tile_position : Vector2i):
- for action in _tower_actions:
- if event.is_action_pressed(action):
- if is_tile_occupied(tile_position):
- _handle_upgrade(action, _towers[tile_position])
- elif _is_valid_placement_tile(tile_position):
- _handle_place_tower(_tower_data[action], tile_position)
+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)
-func _handle_upgrade(action : String, tower : StaticBody2D):
- var tower_key : String = tower.get_tower_key()
- var upgrades = game_stats_config.defenders[tower_key]["upgrades"]
-
- print("foo: ", GameData.get_life(), " ", action, " ", tower_key, " ", upgrades)
- if upgrades.has(action):
- var upgrade_data = upgrades[action]
- var upgrade_cost = upgrade_data["cost"]
+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(upgrade_data["effects"])
+ 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"]
@@ -64,9 +50,14 @@ func _handle_place_tower(tower : Dictionary, tile_position : Vector2i):
tmp.global_position = tile_position
_occupy_tile(tile_position, tmp)
-func _is_valid_placement_tile(tile_position : Vector2i):
- var tile_coords = _tiles.get_cell_atlas_coords(tile_position)
- return (tile_coords == (Vector2i(-1, -1))) && (!is_tile_occupied(tile_position))
+func get_upgrades_at(tile_position : Vector2i) -> Array:
+ if _towers.has(tile_position):
+ return _towers[tile_position].tower_data["upgrades"]
+ return []
+
+func is_valid_placement_tile(tile_position : Vector2i):
+ var tile_coords = _tiles.get_cell_atlas_coords(_tiles.local_to_map(tile_position))
+ return (tile_coords == (Vector2i(-1, -1)))
func is_tile_occupied(tile_position : Vector2i):
return _towers.has(tile_position)
diff --git a/scripts/ui.gd b/scripts/ui.gd
new file mode 100644
index 0000000..031236b
--- /dev/null
+++ b/scripts/ui.gd
@@ -0,0 +1,34 @@
+extends PanelContainer
+
+@onready var morale : Label = $MarginContainer/HBoxContainer/VBoxContainer/Life
+@onready var life : Label = $MarginContainer/HBoxContainer/VBoxContainer/Morale
+@onready var options_container : HBoxContainer = $MarginContainer/HBoxContainer/HBoxContainer
+
+var ui_option = preload("res://scenes/ui_option.tscn")
+
+func _ready():
+ var player = get_node("../Player")
+ player.connect("curr_tile", Callable(self, "_update_options"))
+
+ GameData.connect("morale_changed", Callable(self, "_update_morale"))
+ GameData.connect("life_changed", Callable(self, "_update_life"))
+ _update_morale()
+ _update_life()
+
+func _update_morale() -> void:
+ morale.text = "Morale:" + str(GameData.get_morale())
+
+func _update_life() -> void:
+ life.text = "Life:" + str(GameData.get_life())
+
+func _update_options(data):
+ for i in options_container.get_children():
+ i.queue_free()
+
+ if data != null:
+ for i in data:
+ var option = ui_option.instantiate()
+ option.desc = i["desc"]
+ option.cost = i["cost"]
+ option.sprite_atlas = i["sprite_panel"]
+ options_container.add_child(option)
diff --git a/scripts/ui.gd.uid b/scripts/ui.gd.uid
new file mode 100644
index 0000000..d709bc5
--- /dev/null
+++ b/scripts/ui.gd.uid
@@ -0,0 +1 @@
+uid://biw5cwtetstux
diff --git a/scripts/warlock.gd b/scripts/warlock.gd
index 9e3cd98..a3174d8 100644
--- a/scripts/warlock.gd
+++ b/scripts/warlock.gd
@@ -3,7 +3,7 @@ extends "res://scripts/base_defender.gd"
var projectile: PackedScene = preload("res://scenes/warlock_projectile.tscn")
func _ready():
- set_tower_stats("warlock")
+ set_tower_stats(0)
reset_tower_range()
reset_tower_sprite()
diff --git a/scripts/wyvern.gd b/scripts/wyvern.gd
index 1e1e2ff..e9a1efe 100644
--- a/scripts/wyvern.gd
+++ b/scripts/wyvern.gd
@@ -6,7 +6,7 @@ var range_collision : CollisionShape2D
var firing : bool = false
func _ready():
- set_tower_stats("wyvern")
+ set_tower_stats(1)
reset_tower_range()
reset_tower_sprite()