diff options
author | bd <bdunahu@operationnull.com> | 2025-05-21 20:45:06 -0400 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-05-21 20:45:06 -0400 |
commit | 80e145ba2b85e08f895e76ba6a03bb67bc9ce9ea (patch) | |
tree | ff5f15bedd718d0cfc9daf2963dcf8b3fec88e69 /scenes | |
parent | a00b14bcf2084a1e68f57620e27956813d469aad (diff) |
Add basic UI, morale / life logic
Diffstat (limited to 'scenes')
-rw-r--r-- | scenes/Main.tscn | 8 | ||||
-rw-r--r-- | scenes/UI/cursor.gd | 24 | ||||
-rw-r--r-- | scenes/UI/life.gd | 11 | ||||
-rw-r--r-- | scenes/UI/life.gd.uid | 1 | ||||
-rw-r--r-- | scenes/UI/morale.gd | 11 | ||||
-rw-r--r-- | scenes/UI/morale.gd.uid | 1 | ||||
-rw-r--r-- | scenes/UI/ui.tscn | 39 | ||||
-rw-r--r-- | scenes/crawlers/soldier.gd | 12 | ||||
-rw-r--r-- | scenes/game_data/game_data.gd | 29 | ||||
-rw-r--r-- | scenes/game_data/game_data.gd.uid | 1 |
10 files changed, 123 insertions, 14 deletions
diff --git a/scenes/Main.tscn b/scenes/Main.tscn index dccce73..01f6590 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=7 format=4 uid="uid://chwnewu8l45kj"] +[gd_scene load_steps=8 format=4 uid="uid://chwnewu8l45kj"] [ext_resource type="Texture2D" uid="uid://di2vybjsniag4" path="res://assets/tilemap.png" id="1_rvslj"] [ext_resource type="Script" uid="uid://i5bjnah05h14" path="res://path_spawner.gd" id="2_0bbpv"] [ext_resource type="PackedScene" uid="uid://cq6d7gmjbwl14" path="res://scenes/UI/cursor.tscn" id="4_rarhs"] [ext_resource type="Script" uid="uid://c8p74tnba8rs8" path="res://scenes/grid_manager.gd" id="4_vcsgt"] +[ext_resource type="PackedScene" uid="uid://dycgp3yept14k" path="res://scenes/UI/ui.tscn" id="5_vcsgt"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_tjuek"] texture = ExtResource("1_rvslj") @@ -1092,7 +1093,7 @@ sources/0 = SubResource("TileSetAtlasSource_tjuek") [node name="Main" type="Node2D"] [node name="L1" type="TileMapLayer" parent="."] -tile_map_data = PackedByteArray("AAAAAAoAAAAIAAEAAGABAAoAAAAIAAEAAGACAAoAAAAIAAEAAGADAAoAAAAIAAEAAGAEAAoAAAAIAAEAAGAFAAoAAAAIAAEAAGAGAAoAAAAIAAEAAGAHAAoAAAAIAAEAAGAIAAoAAAAIAAEAAGAJAAoAAAAIAAEAAGAKAAoAAAAIAAEAAGALAAoAAAAIAAEAAGAMAAoAAAAIAAEAAGANAAoAAAAIAAEAAGAOAAoAAAAIAAEAAGAPAAoAAAAJAAEAADAPAAkAAAAIAAEAAAAPAAgAAAAIAAEAAAAPAAcAAAAIAAEAAAAPAAYAAAAJAAEAAFAOAAYAAAAIAAEAAGANAAYAAAAIAAEAAGAMAAYAAAAIAAEAAGALAAYAAAAIAAEAAGAKAAYAAAAIAAEAAGAJAAYAAAAIAAEAAGAIAAYAAAAIAAEAAGAHAAYAAAAIAAEAAGAGAAYAAAAIAAEAAGAFAAYAAAAIAAEAAGAEAAMAAAAJAAEAAAAEAAUAAAAIAAEAADAEAAQAAAAIAAEAADAFAAMAAAAIAAEAAGAGAAMAAAAIAAEAAGAHAAMAAAAIAAEAAGAIAAMAAAAIAAEAAGAJAAMAAAAIAAEAAGAKAAMAAAAIAAEAAGALAAMAAAAIAAEAAGAMAAMAAAAIAAEAAGANAAMAAAAIAAEAAGAOAAMAAAAIAAEAAGAPAAMAAAAIAAEAAGAQAAMAAAAIAAEAAGARAAMAAAAIAAEAAGASAAMAAAAIAAEAAGATAAMAAAAIAAEAAGAEAAYAAAAJAAEAAGAHAAAAAAASABQAAAAGAAAAAAAAAAEAAAAFAAAAAAASABUAAAAEAAAAAAARABUAAAADAAAAAAAQABUAAAACAAAAAAAQABQAAAACAAEAAAAQABUAAAAHAAEAAAASABUAAAAGAAEAAAARABUAAAAFAAEAAAARABUAAAAEAAEAAAARABUAAAADAAEAAAARABUAAAAPAA4AAAALAAUAAAAQAA4AAAAIAAUAAAARAA4AAAAIAAUAAAASAA4AAAAIAAUAAAATAA0AAAAIAAUAAAATAA4AAAAIAAUAAAALAA4AAAAKAAUAAAAMAA4AAAAJAAUAAFANAA4AAAAJAAUAAFAOAA4AAAAJAAUAAFAPAA0AAAAKAAUAAAAQAA0AAAAJAAUAAFARAA0AAAAJAAUAAFASAAsAAAAKAAUAAAASAAwAAAAJAAUAAAASAA0AAAALAAUAAAATAAsAAAAJAAUAAFATAAwAAAAIAAUAAAATAAQAAAARAAkAAAATAAIAAAARAAkAAAAKAA4AAAATAAYAAAAMAA0AAAATAAYAAAAOAA0AAAABAAEAAAANAA0AAAASAAYAAAAQAAwAAAASAAYAAAALAA0AAAADAAIAAAARAAsAAAABAAEAAAARAAwAAAABAAEAAAAPAAwAAAAEAAEAAAASAAoAAAAEAAEAAAAMAAwAAAAGAAIAAAANAAwAAAACAAEAAAAJAA4AAAABAAEAAAAKAAwAAAABAAEAAAAOAAsAAAABAAEAAAARAAkAAAABAAEAAAARAAoAAAACAAEAAAAPAAsAAAACAAEAAAAIAA4AAAADAAEAAAAIAA0AAAAAAAEAAAAHAA0AAAACAAEAAAAHAA4AAAABAAMAAAAGAA4AAAABAAMAAAAFAA4AAAABAAMAAAAEAA4AAAABAAMAAAADAA4AAAABAAMAAAACAA4AAAABAAMAAAABAA4AAAABAAMAAAAAAA4AAAABAAMAAAAKAA0AAAAFAAIAAAAQAAcAAAADAAAAAAARAAcAAAADAAAAAAASAAcAAAADAAAAAAATAAcAAAADAAAAAAALAAwAAAAAAAIAAAACAAcAAAAAAAIAAAANAAQAAAAAAAIAAAABAAsAAAAAAAIAAAABAAEAAAAAAAIAAAAMAAAAAAAAAAIAAAARAAUAAAAAAAIAAAAEAAwAAAABAAEAAAAHAAcAAAABAAEAAAALAAEAAAABAAEAAAASAAgAAAABAAEAAAASAAEAAAABAAEAAAABAAUAAAABAAEAAAABAAkAAAATAAYAAAAOAAQAAAATAAYAAAATAAkAAAATAAYAAAABAA0AAAAdAAcAAAASAAkAAAAOAAoAAAABAAAAAAAOAAoAAAAAAAwAAAADAAEAAAACAAkAAAADAAEAAAACAAsAAAADAAEAAAAAAAgAAAADAAEAAAAAAAsAAAAEAAEAAAABAAgAAAAEAAEAAAAAAAYAAAAEAAEAAAAAAAcAAAAEAAEAAAACAAwAAAAEAAEAAAABAAwAAAAEAAIAAAAAAA0AAAAEAAIAAAABAAYAAAADAAIAAAACAAgAAAADAAIAAAAEAA0AAAADAAIAAAAGAAsAAAAEAAIAAAAGAA0AAAADAAEAAAADAA0AAAABAAEAAAADAAwAAAAGAAIAAAANAAAAAAAQAA8AAAAOAAAAAAARAA8AAAAPAAAAAAARAA8AAAAQAAAAAAARAA8AAAARAAAAAAARAA8AAAASAAAAAAARAA8AAAATAAAAAAARAA8AAAACAAIAAAABAAEAAAADAAIAAAABAAEAAAABAAMAAAABAAEAAAAIAAEAAAABAAEAAAACAAUAAAADAAIAAAAAAAIAAAADAAIAAAABAAIAAAAGAAIAAAAIAAAAAAAFAAEAAAAKAAAAAAAFAAEAAAAIAAIAAAAFAAEAAAAAAAMAAAAAAAEAAAAAAAAAAAAAAAEAAAACAAQAAAAAAAEAAAACAAYAAAAFAAIAAAAJAAAAAAATAAYAAAALAAAAAAASAAYAAAAAAAQAAAAOAAYAAAAAAAkAAAAOAAYAAAAKAAsAAAAOAAYAAAAFAA0AAAAPAAYAAAATAAoAAAAPAAYAAAAMAAEAAAAPAAYAAAAFAAwAAAABAAEAAAAGAAIAAAAAAAIAAAA=") +tile_map_data = PackedByteArray("AAAAAAMAAAADAAIAAAAAAAYAAAAEAAEAAAAAAAcAAAAEAAEAAAAAAAgAAAADAAEAAAAAAAkAAAAOAAYAAAAAAAoAAAAIAAEAAGAAAAsAAAAEAAEAAAAAAAwAAAADAAEAAAAAAA0AAAAEAAIAAAABAAEAAAAOAAoAAAABAAIAAAAAAAIAAAABAAUAAAABAAEAAAABAAgAAAAEAAEAAAABAAkAAAATAAYAAAABAAoAAAAIAAEAAGABAAsAAAAAAAIAAAABAAwAAAAEAAIAAAABAA0AAAAdAAcAAAACAAEAAAAQABQAAAACAAIAAAAQABUAAAACAAMAAAABAAEAAAACAAQAAAAAAAEAAAACAAUAAAADAAIAAAACAAYAAAAFAAIAAAACAAcAAAAAAAIAAAACAAgAAAADAAIAAAACAAkAAAADAAEAAAACAAoAAAAIAAEAAGACAAsAAAADAAEAAAADAAEAAAAQABUAAAADAAIAAAARABUAAAADAAwAAAAGAAIAAAADAA0AAAABAAEAAAAEAAEAAAARABUAAAAEAAIAAAARABUAAAAEAAMAAAAJAAEAAAAEAAQAAAAIAAEAADAEAAUAAAAIAAEAADAEAAwAAAABAAEAAAAEAA0AAAADAAIAAAAFAAEAAAASABUAAAAFAAIAAAARABUAAAAFAAwAAAABAAEAAAAFAA0AAAAPAAYAAAAGAAEAAAAAAAEAAAAGAAIAAAARABUAAAAGAAMAAAAIAAEAAGAGAAoAAAAIAAEAAGAGAA0AAAADAAEAAAAHAAEAAAASABQAAAAHAAIAAAASABUAAAAHAAYAAAAIAAEAAGAHAA0AAAACAAEAAAAIAAEAAAABAAEAAAAIAAIAAAAFAAEAAAAIAA0AAAAAAAEAAAAKAAoAAAAIAAEAAGAKAAsAAAAOAAYAAAAKAAwAAAABAAEAAAAKAA0AAAAFAAIAAAALAAEAAAASAAYAAAALAAIAAAABAAEAAAALAAwAAAAAAAIAAAALAA0AAAADAAIAAAAMAAEAAAAAAAIAAAAMAAIAAAAPAAYAAAAMAAwAAAAGAAIAAAAMAA0AAAATAAYAAAANAAMAAAAIAAEAAGANAAwAAAACAAEAAAANAA0AAAASAAYAAAAOAAMAAAAIAAEAAGAOAAoAAAAIAAEAAGAOAA0AAAABAAEAAAAPAAYAAAAJAAEAAFAPAAcAAAAIAAEAAAAPAAgAAAAIAAEAAAAPAAkAAAAIAAEAAAAPAAoAAAAJAAEAADAPAAsAAAACAAEAAAAPAAwAAAAEAAEAAAAPAA0AAAAKAAUAAAAQAAwAAAASAAYAAAAQAA0AAAAJAAUAAFARAAkAAAABAAEAAAARAAoAAAACAAEAAAARAAsAAAABAAEAAAARAAwAAAABAAEAAAARAA0AAAAJAAUAAFASAAEAAAARAA8AAAASAAIAAAABAAEAAAASAAcAAAADAAAAAAASAAgAAAABAAEAAAASAAkAAAAOAAoAAAASAAoAAAAEAAEAAAASAAsAAAAKAAUAAAASAAwAAAAJAAUAAAASAA0AAAALAAUAAAATAAEAAAARAA8AAAATAAIAAAARAAkAAAATAAMAAAAIAAEAAGATAAkAAAATAAYAAAATAAoAAAAPAAYAAAATAAsAAAAJAAUAAFATAAwAAAAIAAUAAAATAA0AAAAIAAUAAAAAAAEAAAAAAAEAAAAAAAQAAAAOAAYAAAAAAA4AAAABAAMAAAABAAMAAAAGAAIAAAABAAYAAAADAAIAAAABAA4AAAABAAMAAAACAAwAAAAEAAEAAAACAA4AAAABAAMAAAADAAMAAAABAAEAAAADAAoAAAAIAAEAAGADAA4AAAABAAMAAAAEAAYAAAAJAAEAAGAEAAoAAAAIAAEAAGAEAA4AAAABAAMAAAAFAAMAAAAIAAEAAGAFAAYAAAAIAAEAAGAFAAoAAAAIAAEAAGAFAA4AAAABAAMAAAAGAAQAAAAAAAIAAAAGAAYAAAAIAAEAAGAGAAsAAAAEAAIAAAAGAA4AAAABAAMAAAAHAAMAAAAIAAEAAGAHAAcAAAABAAEAAAAHAAoAAAAIAAEAAGAHAA4AAAABAAMAAAAIAAMAAAAIAAEAAGAIAAYAAAAIAAEAAGAIAAoAAAAIAAEAAGAIAA4AAAADAAEAAAAJAAEAAAATAAYAAAAJAAMAAAAIAAEAAGAJAAYAAAAIAAEAAGAJAAoAAAAIAAEAAGAJAA4AAAABAAEAAAAKAAEAAAAFAAEAAAAKAAMAAAAIAAEAAGAKAAYAAAAIAAEAAGAKAA4AAAATAAYAAAALAAMAAAAIAAEAAGALAAYAAAAIAAEAAGALAAoAAAAIAAEAAGALAA4AAAAKAAUAAAAMAAMAAAAIAAEAAGAMAAYAAAAIAAEAAGAMAAoAAAAIAAEAAGAMAA4AAAAJAAUAAFANAAEAAAAQAA8AAAANAAQAAAAAAAIAAAANAAYAAAAIAAEAAGANAAoAAAAIAAEAAGANAA4AAAAJAAUAAFAOAAEAAAARAA8AAAAOAAQAAAATAAYAAAAOAAYAAAAIAAEAAGAOAAsAAAABAAEAAAAOAA4AAAAJAAUAAFAPAAEAAAARAA8AAAAPAAMAAAAIAAEAAGAPAA4AAAALAAUAAAAQAAEAAAARAA8AAAAQAAMAAAAIAAEAAGAQAAcAAAADAAAAAAAQAA4AAAAIAAUAAAARAAEAAAARAA8AAAARAAMAAAAIAAEAAGARAAUAAAAAAAIAAAARAAcAAAADAAAAAAARAA4AAAAIAAUAAAASAAMAAAAIAAEAAGASAA4AAAAIAAUAAAATAAQAAAARAAkAAAATAAcAAAADAAAAAAATAA4AAAAIAAUAAAA=") tile_set = SubResource("TileSet_47enk") [node name="PathSpawner" type="Node2D" parent="."] @@ -1109,4 +1110,7 @@ autostart = true [node name="GridManager" type="Node" parent="."] script = ExtResource("4_vcsgt") +[node name="PanelContainer" parent="." instance=ExtResource("5_vcsgt")] +offset_right = 320.0 + [connection signal="timeout" from="PathSpawner/Timer" to="PathSpawner" method="_on_timer_timeout"] diff --git a/scenes/UI/cursor.gd b/scenes/UI/cursor.gd index cb0d0b4..c71eaa2 100644 --- a/scenes/UI/cursor.gd +++ b/scenes/UI/cursor.gd @@ -11,17 +11,23 @@ var dirs = {"move_right": Vector2.RIGHT, "move_left": Vector2.LEFT, "move_up": Vector2.UP, "move_down": Vector2.DOWN} -var towers : Dictionary +var towers : Dictionary = { + "place_warlock": { + "scene": preload("res://scenes/defenders/warlock.tscn"), + "cost": 10 + }, + "place_wyvern": { + "scene": preload("res://scenes/defenders/wyvern.tscn"), + "cost": 15 + } +} func _ready(): tile_size = grid_manager.tile_size max_x = 20 * tile_size max_y = 15 * tile_size - - towers["place_warlock"] = preload("res://scenes/defenders/warlock.tscn") - towers["place_wyvern"] = preload("res://scenes/defenders/wyvern.tscn") position = position.snapped(Vector2.ONE * tile_size) - position += Vector2.ONE * tile_size / 2 + position += Vector2(max_x / 2, max_y / 2) + Vector2(1, 0) * tile_size / 2 func _unhandled_input(event): for dir in dirs.keys(): @@ -34,17 +40,19 @@ func _unhandled_input(event): return func handle_tower(tower): - if is_valid_placement_tile(): - var tmp = tower.instantiate() + var tower_cost = tower["cost"] + if is_valid_placement_tile() && GameData.get_life() >= tower_cost: + var tmp = tower["scene"].instantiate() var path = get_tree().get_root().get_node("Main/Defenders") path.add_child(tmp) tmp.global_position = position grid_manager.occupy_tile(position) + GameData.subtract_life(tower_cost) func handle_move(dir): position += dir * tile_size position.x = max(position.x, tile_size / 2) - position.y = max(position.y, tile_size / 2) + position.y = max(position.y, tile_size + tile_size / 2) position.x = min(position.x, max_x - (tile_size / 2)) position.y = min(position.y, max_y - (tile_size / 2)) diff --git a/scenes/UI/life.gd b/scenes/UI/life.gd new file mode 100644 index 0000000..b185cda --- /dev/null +++ b/scenes/UI/life.gd @@ -0,0 +1,11 @@ +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/scenes/UI/life.gd.uid b/scenes/UI/life.gd.uid new file mode 100644 index 0000000..6666d8d --- /dev/null +++ b/scenes/UI/life.gd.uid @@ -0,0 +1 @@ +uid://dtj2opmwvh4y1 diff --git a/scenes/UI/morale.gd b/scenes/UI/morale.gd new file mode 100644 index 0000000..d5a8046 --- /dev/null +++ b/scenes/UI/morale.gd @@ -0,0 +1,11 @@ +extends Label + +func _ready(): + GameData.connect("morale_changed", Callable(self, "_on_morale_changed")) + update_label(GameData.get_morale()) + +func _on_life_changed(new_morale: int) -> void: + update_label(new_morale) + +func update_label(new_morale: int) -> void: + text = "Morale:" + str(new_morale) diff --git a/scenes/UI/morale.gd.uid b/scenes/UI/morale.gd.uid new file mode 100644 index 0000000..2424396 --- /dev/null +++ b/scenes/UI/morale.gd.uid @@ -0,0 +1 @@ +uid://b8urrbmynk327 diff --git a/scenes/UI/ui.tscn b/scenes/UI/ui.tscn new file mode 100644 index 0000000..8e6a36b --- /dev/null +++ b/scenes/UI/ui.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=4 format=3 uid="uid://dycgp3yept14k"] + +[ext_resource type="Script" uid="uid://dtj2opmwvh4y1" path="res://scenes/UI/life.gd" id="1_suays"] +[ext_resource type="Script" uid="uid://b8urrbmynk327" path="res://scenes/UI/morale.gd" id="1_yb1mt"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nt14h"] +bg_color = Color(0, 0.0117647, 0.552941, 1) + +[node name="PanelContainer" type="PanelContainer"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 17.0 +grow_horizontal = 2 +size_flags_vertical = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_nt14h") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 6 +theme_override_constants/margin_top = 0 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +layout_mode = 2 +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") + +[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") diff --git a/scenes/crawlers/soldier.gd b/scenes/crawlers/soldier.gd index 1bd7549..fe494e6 100644 --- a/scenes/crawlers/soldier.gd +++ b/scenes/crawlers/soldier.gd @@ -1,23 +1,27 @@ extends CharacterBody2D -@export var speed = 50.0 -@export var max_health = 40 -var _health = max_health +@export var worth : int = 5 +@export var damage : int = 1 +@export var speed : float = 50.0 +@export var max_health : float = 30.0 +var _health : float = max_health func _process(delta): get_parent().set_progress(get_parent().get_progress() + speed * delta) if get_parent().get_progress_ratio() == 1: + GameData.subtract_morale(damage) queue_free() func deal_damage(damage): _health -= damage if _health <= 0: + GameData.add_life(worth) queue_free() else: _update_color() func _update_color(): - var ratio : float = float(_health) / max_health + var ratio : float = _health / max_health var target_color = Color(1, ratio, ratio) $Sprite2D.modulate = target_color diff --git a/scenes/game_data/game_data.gd b/scenes/game_data/game_data.gd new file mode 100644 index 0000000..fd6a80e --- /dev/null +++ b/scenes/game_data/game_data.gd @@ -0,0 +1,29 @@ + +extends Node + +signal life_changed +signal morale_changed +var _life: int = 20 +var _morale: int = 10 + +func get_life() -> int: + return _life + +func add_life(amount: int): + _life += amount + emit_signal("life_changed", _life) + +func subtract_life(amount: int): + _life -= amount + emit_signal("life_changed", _life) + +func get_morale() -> int: + return _morale + +func add_morale(amount: int): + _morale += amount + emit_signal("morale_changed", _morale) + +func subtract_morale(amount: int): + _morale -= amount + emit_signal("life_changed", _morale) diff --git a/scenes/game_data/game_data.gd.uid b/scenes/game_data/game_data.gd.uid new file mode 100644 index 0000000..2c1f11b --- /dev/null +++ b/scenes/game_data/game_data.gd.uid @@ -0,0 +1 @@ +uid://c72ko8skbqiq5 |