summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-05-22 13:50:49 -0400
committerbd <bdunahu@operationnull.com>2025-05-22 13:50:49 -0400
commit8c5c4863aeacb4afcf70f339df6d601e2df1a7a6 (patch)
tree6c2af54a18271534864a7a1daed7814ebac5abd1 /scripts
parent80e145ba2b85e08f895e76ba6a03bb67bc9ce9ea (diff)
Reorganized files into scenes and scripts
Diffstat (limited to 'scripts')
-rw-r--r--scripts/base_animation_handler.gd24
-rw-r--r--scripts/base_animation_handler.gd.uid1
-rw-r--r--scripts/base_defender.gd49
-rw-r--r--scripts/base_defender.gd.uid1
-rw-r--r--scripts/cursor.gd61
-rw-r--r--scripts/cursor.gd.uid1
-rw-r--r--scripts/game_data.gd29
-rw-r--r--scripts/game_data.gd.uid1
-rw-r--r--scripts/grid_manager.gd16
-rw-r--r--scripts/grid_manager.gd.uid1
-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/path_generator.gd11
-rw-r--r--scripts/path_generator.gd.uid1
-rw-r--r--scripts/path_spawner.gd7
-rw-r--r--scripts/path_spawner.gd.uid1
-rw-r--r--scripts/soldier.gd27
-rw-r--r--scripts/soldier.gd.uid1
-rw-r--r--scripts/warlock.gd18
-rw-r--r--scripts/warlock.gd.uid1
-rw-r--r--scripts/warlock_animation_handler.gd6
-rw-r--r--scripts/warlock_animation_handler.gd.uid1
-rw-r--r--scripts/warlock_projectile.gd23
-rw-r--r--scripts/warlock_projectile.gd.uid1
-rw-r--r--scripts/wyvern.gd36
-rw-r--r--scripts/wyvern.gd.uid1
-rw-r--r--scripts/wyvern_animation_handler.gd6
-rw-r--r--scripts/wyvern_animation_handler.gd.uid1
-rw-r--r--scripts/wyvern_projectile.gd18
-rw-r--r--scripts/wyvern_projectile.gd.uid1
32 files changed, 369 insertions, 0 deletions
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