diff options
Diffstat (limited to 'Tower.gd')
-rw-r--r-- | Tower.gd | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/Tower.gd b/Tower.gd new file mode 100644 index 0000000..d8d94ea --- /dev/null +++ b/Tower.gd @@ -0,0 +1,96 @@ +class_name Tower +extends StaticBody2D + + +signal selected + +static var selected_tower: Tower + +var is_selected = false : + set(value): + if value: + Tower.selected_tower = self + selected.emit() + else: + if Tower.selected_tower == self: + Tower.selected_tower = null + get_tree().current_scene.get_node("%Tower").text = "" + is_selected = value + queue_redraw() + +var is_hovered = false : + set(value): + is_hovered = value + queue_redraw() + +var mobs_in_range: Array = [] + +@export var attack_range: int = 16 +@export var attack_power: int = 1 +@export var attack_speed: int = 1 + + +func _ready(): + $Range/CollisionShape2D.shape.radius = attack_range + $ShootCooldown.wait_time = attack_speed + + +func _draw(): + if is_selected: + draw_circle( + Vector2.ZERO, + 8 + attack_range, + Color(1, 1, 1, 0.75), + false, + 1.0 + ) + modulate = Color(1.5, 1.5, 1.5) + elif is_hovered: + if Game.mode == Game.Mode.DEFAULT: + draw_circle( + Vector2.ZERO, + 8 + attack_range, + Color(1, 1, 1, 0.5), + false, + 1.0 + ) + modulate = Color(1.25, 1.25, 1.25) + else: + modulate = Color(1, 1, 1) + + +func _process(_delta: float) -> void: + if $ShootCooldown.is_stopped() and not mobs_in_range.is_empty(): + shoot() + $ShootCooldown.start() + + +func _on_input_event(_viewport: Node, event: InputEvent, _shape_idx: int): + if Game.mode == Game.Mode.DEFAULT: + if event.is_action_pressed("builder_tower_select"): + is_selected = true + if event.is_action_pressed("builder_cancel"): + Game.remove_tower(self) + + +func _on_range_body_entered(body: Node2D) -> void: + mobs_in_range.append(body) + +func _on_range_body_exited(body: Node2D) -> void: + mobs_in_range.remove_at(mobs_in_range.find(body)) + + +func _on_mouse_entered() -> void: + is_hovered = true + +func _on_mouse_exited() -> void: + is_hovered = false + + +func shoot(): + var target = mobs_in_range.pick_random() as Mob + target.set_hp(target.hp - 1) + + +func _on_tree_exiting() -> void: + is_selected = false |