From 8c5c4863aeacb4afcf70f339df6d601e2df1a7a6 Mon Sep 17 00:00:00 2001 From: bd Date: Thu, 22 May 2025 13:50:49 -0400 Subject: Reorganized files into scenes and scripts --- scripts/base_animation_handler.gd | 24 +++++++++++++ scripts/base_animation_handler.gd.uid | 1 + scripts/base_defender.gd | 49 +++++++++++++++++++++++++ scripts/base_defender.gd.uid | 1 + scripts/cursor.gd | 61 ++++++++++++++++++++++++++++++++ scripts/cursor.gd.uid | 1 + scripts/game_data.gd | 29 +++++++++++++++ scripts/game_data.gd.uid | 1 + scripts/grid_manager.gd | 16 +++++++++ scripts/grid_manager.gd.uid | 1 + scripts/life.gd | 11 ++++++ scripts/life.gd.uid | 1 + scripts/morale.gd | 11 ++++++ scripts/morale.gd.uid | 1 + scripts/path_generator.gd | 11 ++++++ scripts/path_generator.gd.uid | 1 + scripts/path_spawner.gd | 7 ++++ scripts/path_spawner.gd.uid | 1 + scripts/soldier.gd | 27 ++++++++++++++ scripts/soldier.gd.uid | 1 + scripts/warlock.gd | 18 ++++++++++ scripts/warlock.gd.uid | 1 + scripts/warlock_animation_handler.gd | 6 ++++ scripts/warlock_animation_handler.gd.uid | 1 + scripts/warlock_projectile.gd | 23 ++++++++++++ scripts/warlock_projectile.gd.uid | 1 + scripts/wyvern.gd | 36 +++++++++++++++++++ scripts/wyvern.gd.uid | 1 + scripts/wyvern_animation_handler.gd | 6 ++++ scripts/wyvern_animation_handler.gd.uid | 1 + scripts/wyvern_projectile.gd | 18 ++++++++++ scripts/wyvern_projectile.gd.uid | 1 + 32 files changed, 369 insertions(+) create mode 100644 scripts/base_animation_handler.gd create mode 100644 scripts/base_animation_handler.gd.uid create mode 100644 scripts/base_defender.gd create mode 100644 scripts/base_defender.gd.uid create mode 100644 scripts/cursor.gd create mode 100644 scripts/cursor.gd.uid create mode 100644 scripts/game_data.gd create mode 100644 scripts/game_data.gd.uid create mode 100644 scripts/grid_manager.gd create mode 100644 scripts/grid_manager.gd.uid create mode 100644 scripts/life.gd create mode 100644 scripts/life.gd.uid create mode 100644 scripts/morale.gd create mode 100644 scripts/morale.gd.uid create mode 100644 scripts/path_generator.gd create mode 100644 scripts/path_generator.gd.uid create mode 100644 scripts/path_spawner.gd create mode 100644 scripts/path_spawner.gd.uid create mode 100644 scripts/soldier.gd create mode 100644 scripts/soldier.gd.uid create mode 100644 scripts/warlock.gd create mode 100644 scripts/warlock.gd.uid create mode 100644 scripts/warlock_animation_handler.gd create mode 100644 scripts/warlock_animation_handler.gd.uid create mode 100644 scripts/warlock_projectile.gd create mode 100644 scripts/warlock_projectile.gd.uid create mode 100644 scripts/wyvern.gd create mode 100644 scripts/wyvern.gd.uid create mode 100644 scripts/wyvern_animation_handler.gd create mode 100644 scripts/wyvern_animation_handler.gd.uid create mode 100644 scripts/wyvern_projectile.gd create mode 100644 scripts/wyvern_projectile.gd.uid (limited to 'scripts') diff --git a/scripts/base_animation_handler.gd b/scripts/base_animation_handler.gd new file mode 100644 index 0000000..c9e7630 --- /dev/null +++ b/scripts/base_animation_handler.gd @@ -0,0 +1,24 @@ +extends Sprite2D + +@onready var tile_map = preload("res://assets/tilemap.png") + +var idle : Rect2 +var attack : Rect2 +var is_idle : bool = true + +func _ready(): + update_texture() + +func update_texture(): + var atlas_texture = AtlasTexture.new() + atlas_texture.atlas = tile_map + atlas_texture.region = idle if is_idle else attack + texture = atlas_texture + +func attack_state(): + is_idle = false + update_texture() + +func idle_state(): + is_idle = true + update_texture() diff --git a/scripts/base_animation_handler.gd.uid b/scripts/base_animation_handler.gd.uid new file mode 100644 index 0000000..75b9ff2 --- /dev/null +++ b/scripts/base_animation_handler.gd.uid @@ -0,0 +1 @@ +uid://cb5we0gjjbcfu diff --git a/scripts/base_defender.gd b/scripts/base_defender.gd new file mode 100644 index 0000000..66be11d --- /dev/null +++ b/scripts/base_defender.gd @@ -0,0 +1,49 @@ +extends StaticBody2D + +@onready var sprite_node = $Sprite2D + +var defender_range : float +var fire_rate : float +var damage : int +var target : CharacterBody2D + +func _on_fire_timer_timeout() -> void: + # extending classes override here + pass + +func select_target() -> void: + var targets : Array = _find_targets() + + # this is all to select the furthest target on the track + var curr : PathFollow2D = null + for i in targets: + if curr == null: + curr = i.get_node("../") + else: + if i.get_parent().get_progress() > curr.get_progress(): + curr = i.get_node("../") + + _update_state_machine(curr) + +func _find_targets() -> Array: + var targets : Array = get_node("Tower").get_overlapping_bodies() + var tmp : Array = [] + for i in targets: + if "Crawler" in i.name: + tmp.append(i) + return tmp + +func _update_state_machine(curr : PathFollow2D) -> void: + if (curr == null): + target = null + sprite_node.idle_state() + else: + target = curr.get_child(0) + sprite_node.attack_state() + +func _on_tower_body_entered(_body: Node2D) -> void: + var old_target : CharacterBody2D = target + select_target() + if old_target == null && old_target != target: + $FireTimer.start(fire_rate) + _on_fire_timer_timeout() diff --git a/scripts/base_defender.gd.uid b/scripts/base_defender.gd.uid new file mode 100644 index 0000000..8d46a61 --- /dev/null +++ b/scripts/base_defender.gd.uid @@ -0,0 +1 @@ +uid://bpiajfyx3t7qx diff --git a/scripts/cursor.gd b/scripts/cursor.gd new file mode 100644 index 0000000..025679b --- /dev/null +++ b/scripts/cursor.gd @@ -0,0 +1,61 @@ +extends Node2D + +@onready var grid_manager = get_node("../GridManager") +@onready var tilemap = get_node("../L1") + +var tile_size : float +var max_x : float +var max_y : float + +var dirs = {"move_right": Vector2.RIGHT, + "move_left": Vector2.LEFT, + "move_up": Vector2.UP, + "move_down": Vector2.DOWN} +var towers : Dictionary = { + "place_warlock": { + "scene": preload("res://scenes/warlock.tscn"), + "cost": 10 + }, + "place_wyvern": { + "scene": preload("res://scenes/wyvern.tscn"), + "cost": 15 + } +} + +func _ready(): + tile_size = grid_manager.tile_size + max_x = 20 * tile_size + max_y = 15 * tile_size + position = position.snapped(Vector2.ONE * tile_size) + position += Vector2(max_x / 2, max_y / 2) + Vector2(1, 0) * tile_size / 2 + +func _unhandled_input(event): + for dir in dirs.keys(): + if event.is_action_pressed(dir): + handle_move(dirs[dir]) + return + for tower in towers.keys(): + if event.is_action_pressed(tower): + handle_tower(towers[tower]) + return + +func handle_tower(tower): + 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 + tile_size / 2) + position.x = min(position.x, max_x - (tile_size / 2)) + position.y = min(position.y, max_y - (tile_size / 2)) + +func is_valid_placement_tile(): + var tile_coords = tilemap.get_cell_atlas_coords(tilemap.local_to_map(global_position)) + return (tile_coords == (Vector2i(-1, -1))) && (!grid_manager.is_tile_occupied(position)) diff --git a/scripts/cursor.gd.uid b/scripts/cursor.gd.uid new file mode 100644 index 0000000..015cefa --- /dev/null +++ b/scripts/cursor.gd.uid @@ -0,0 +1 @@ +uid://bwiimenoyb5og diff --git a/scripts/game_data.gd b/scripts/game_data.gd new file mode 100644 index 0000000..fd6a80e --- /dev/null +++ b/scripts/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/scripts/game_data.gd.uid b/scripts/game_data.gd.uid new file mode 100644 index 0000000..2c1f11b --- /dev/null +++ b/scripts/game_data.gd.uid @@ -0,0 +1 @@ +uid://c72ko8skbqiq5 diff --git a/scripts/grid_manager.gd b/scripts/grid_manager.gd new file mode 100644 index 0000000..8fa59e5 --- /dev/null +++ b/scripts/grid_manager.gd @@ -0,0 +1,16 @@ +extends Node + +var occupied_tiles = {} + +@export var tile_size = 16.0 +@export var grid_width = 20 +@export var grid_height = 15 + +func is_tile_occupied(tile_position): + return occupied_tiles.has(tile_position) + +func occupy_tile(tile_position): + occupied_tiles[tile_position] = true + +func free_tile(tile_position): + occupied_tiles.erase(tile_position) diff --git a/scripts/grid_manager.gd.uid b/scripts/grid_manager.gd.uid new file mode 100644 index 0000000..424fc40 --- /dev/null +++ b/scripts/grid_manager.gd.uid @@ -0,0 +1 @@ +uid://c8p74tnba8rs8 diff --git a/scripts/life.gd b/scripts/life.gd new file mode 100644 index 0000000..b185cda --- /dev/null +++ b/scripts/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/scripts/life.gd.uid b/scripts/life.gd.uid new file mode 100644 index 0000000..6666d8d --- /dev/null +++ b/scripts/life.gd.uid @@ -0,0 +1 @@ +uid://dtj2opmwvh4y1 diff --git a/scripts/morale.gd b/scripts/morale.gd new file mode 100644 index 0000000..d5a8046 --- /dev/null +++ b/scripts/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/scripts/morale.gd.uid b/scripts/morale.gd.uid new file mode 100644 index 0000000..2424396 --- /dev/null +++ b/scripts/morale.gd.uid @@ -0,0 +1 @@ +uid://b8urrbmynk327 diff --git a/scripts/path_generator.gd b/scripts/path_generator.gd new file mode 100644 index 0000000..fae2c76 --- /dev/null +++ b/scripts/path_generator.gd @@ -0,0 +1,11 @@ +extends Node + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/scripts/path_generator.gd.uid b/scripts/path_generator.gd.uid new file mode 100644 index 0000000..d402d38 --- /dev/null +++ b/scripts/path_generator.gd.uid @@ -0,0 +1 @@ +uid://dtt3ncmdrhtta diff --git a/scripts/path_spawner.gd b/scripts/path_spawner.gd new file mode 100644 index 0000000..9b8f663 --- /dev/null +++ b/scripts/path_spawner.gd @@ -0,0 +1,7 @@ +extends Node2D + +@onready var path = preload("res://scenes/L1.tscn") + +func _on_timer_timeout(): + var tmp = path.instantiate() + add_child(tmp) diff --git a/scripts/path_spawner.gd.uid b/scripts/path_spawner.gd.uid new file mode 100644 index 0000000..a6ecd6a --- /dev/null +++ b/scripts/path_spawner.gd.uid @@ -0,0 +1 @@ +uid://i5bjnah05h14 diff --git a/scripts/soldier.gd b/scripts/soldier.gd new file mode 100644 index 0000000..d373237 --- /dev/null +++ b/scripts/soldier.gd @@ -0,0 +1,27 @@ +extends CharacterBody2D + +@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(tower_damage): + _health -= tower_damage + if _health <= 0: + GameData.add_life(worth) + queue_free() + else: + _update_color() + +func _update_color(): + var ratio : float = _health / max_health + var target_color = Color(1, ratio, ratio) + + $Sprite2D.modulate = target_color diff --git a/scripts/soldier.gd.uid b/scripts/soldier.gd.uid new file mode 100644 index 0000000..917b467 --- /dev/null +++ b/scripts/soldier.gd.uid @@ -0,0 +1 @@ +uid://gn1504blq1pf diff --git a/scripts/warlock.gd b/scripts/warlock.gd new file mode 100644 index 0000000..058f86f --- /dev/null +++ b/scripts/warlock.gd @@ -0,0 +1,18 @@ +extends "res://scripts/base_defender.gd" + +var projectile: PackedScene = preload("res://scenes/warlock_projectile.tscn") + +func _ready(): + damage = 5 + fire_rate = 1.0 + +func _on_fire_timer_timeout(): + select_target() + if (target != null): + var tmp_projectile = projectile.instantiate() + tmp_projectile.target = target + tmp_projectile.projectile_damage = damage + get_node("ProjectileContainer").call_deferred("add_child", tmp_projectile) + tmp_projectile.global_position = $Aim.global_position + else: + $FireTimer.stop() diff --git a/scripts/warlock.gd.uid b/scripts/warlock.gd.uid new file mode 100644 index 0000000..64a7007 --- /dev/null +++ b/scripts/warlock.gd.uid @@ -0,0 +1 @@ +uid://dvhqpgw6vhayu diff --git a/scripts/warlock_animation_handler.gd b/scripts/warlock_animation_handler.gd new file mode 100644 index 0000000..f7ac9c3 --- /dev/null +++ b/scripts/warlock_animation_handler.gd @@ -0,0 +1,6 @@ +extends "res://scripts/base_animation_handler.gd" + +func _ready(): + idle = Rect2(496, 16, 16, 16) + attack = Rect2(496, 32, 16, 16) + update_texture() diff --git a/scripts/warlock_animation_handler.gd.uid b/scripts/warlock_animation_handler.gd.uid new file mode 100644 index 0000000..4fa3cf7 --- /dev/null +++ b/scripts/warlock_animation_handler.gd.uid @@ -0,0 +1 @@ +uid://6i27kmcpl7ix diff --git a/scripts/warlock_projectile.gd b/scripts/warlock_projectile.gd new file mode 100644 index 0000000..060a27d --- /dev/null +++ b/scripts/warlock_projectile.gd @@ -0,0 +1,23 @@ +extends CharacterBody2D + +var target : CharacterBody2D +var speed : int = 100 +var projectile_damage : int + +func _physics_process(_delta: float): + if !is_instance_valid(target): + queue_free() + else: + _move_projectile() + +func _on_area_2d_body_entered(body: Node2D): + if "Crawler" in body.name: + body.deal_damage(projectile_damage) + queue_free() + +func _move_projectile(): + var pos : Vector2 + pos = target.global_position + velocity = global_position.direction_to(pos) * speed + look_at(pos) + move_and_slide() diff --git a/scripts/warlock_projectile.gd.uid b/scripts/warlock_projectile.gd.uid new file mode 100644 index 0000000..3225e3e --- /dev/null +++ b/scripts/warlock_projectile.gd.uid @@ -0,0 +1 @@ +uid://kolqesiin33p diff --git a/scripts/wyvern.gd b/scripts/wyvern.gd new file mode 100644 index 0000000..ecd92ad --- /dev/null +++ b/scripts/wyvern.gd @@ -0,0 +1,36 @@ +extends "res://scripts/base_defender.gd" + +var projectile: PackedScene = preload("res://scenes/wyvern_projectile.tscn") +var damage_tick_rate: float = 0.25 +var firing : bool = false + +func _ready(): + damage = 2 + fire_rate = 1.0 + +func _process(_delta): + select_target() + if firing: + if target == null: + $WyvernProjectile.queue_free() + firing = false + else: + $WyvernProjectile.target = target + $WyvernProjectile.move_projectile() + +func _on_tower_body_entered(_body: Node2D) -> void: + var old_target : CharacterBody2D = target + select_target() + if old_target == null && old_target != target: + $FireTimer.start(fire_rate) + +func _on_fire_timer_timeout(): + if (target != null): + var tmp_projectile = projectile.instantiate() + tmp_projectile.target = target + tmp_projectile.projectile_damage = damage + tmp_projectile.damage_tick_rate = 0.25 + add_child(tmp_projectile) + tmp_projectile.global_position = $Aim.global_position + firing = true + $FireTimer.stop() diff --git a/scripts/wyvern.gd.uid b/scripts/wyvern.gd.uid new file mode 100644 index 0000000..abe259e --- /dev/null +++ b/scripts/wyvern.gd.uid @@ -0,0 +1 @@ +uid://cfhnd8k1sy116 diff --git a/scripts/wyvern_animation_handler.gd b/scripts/wyvern_animation_handler.gd new file mode 100644 index 0000000..8cadc72 --- /dev/null +++ b/scripts/wyvern_animation_handler.gd @@ -0,0 +1,6 @@ +extends "res://scripts/base_animation_handler.gd" + +func _ready(): + idle = Rect2(384, 160, 16, 16) + attack = Rect2(400, 160, 16, 16) + update_texture() diff --git a/scripts/wyvern_animation_handler.gd.uid b/scripts/wyvern_animation_handler.gd.uid new file mode 100644 index 0000000..5c8f57b --- /dev/null +++ b/scripts/wyvern_animation_handler.gd.uid @@ -0,0 +1 @@ +uid://dl7a53e1auku7 diff --git a/scripts/wyvern_projectile.gd b/scripts/wyvern_projectile.gd new file mode 100644 index 0000000..9b59bb0 --- /dev/null +++ b/scripts/wyvern_projectile.gd @@ -0,0 +1,18 @@ +extends CharacterBody2D + +var target +var curr = "" +var projectile_damage +# todo hook this up +var damage_tick_rate + +func _on_damage_tick_timeout() -> void: + var enemies = $Area2D.get_overlapping_bodies() + for i in enemies: + if "Crawler" in i.name: + i.deal_damage(projectile_damage) + +func move_projectile() -> void: + var pos : Vector2 + pos = target.global_position + look_at(pos) diff --git a/scripts/wyvern_projectile.gd.uid b/scripts/wyvern_projectile.gd.uid new file mode 100644 index 0000000..3882240 --- /dev/null +++ b/scripts/wyvern_projectile.gd.uid @@ -0,0 +1 @@ +uid://brqwmj8ydtipd -- cgit v1.2.3