tool extends Panel class_name BaseUnit const AnimHelper = preload("res://helpers/anims.gd") const BattleHelper = preload("res://helpers/battle.gd") export(Texture) var sprite setget set_sprite export var base_move_points = 0 setget set_base_move_points export var base_hull_points = 0 setget set_base_hull_points export var base_shield_points = 0 setget set_base_shield_points export var base_damage_points = 0 setget set_base_damage_points export var attacker = false setget set_attacker export var playable = false setget set_playable var selected_anchor var dragged func _ready(): $move_hint.visible = false set_sprite(sprite) set_base_damage_points(base_damage_points) set_base_move_points(base_move_points) set_base_hull_points(base_hull_points) set_base_shield_points(base_shield_points) set_attacker(attacker) set_playable(playable) func destroy(): if get_parent() is Anchor: (get_parent() as Anchor).set_content(null) queue_free() func set_attacker(val): attacker = val if has_node("points"): if attacker: $points.modulate = Color(1.0, 1.0, 1.0) else: $points.modulate = Color(1.0, 0.3, 0.3) func set_playable(val): playable = val if playable: modulate = Color(1.0, 1.0, 1.0) else: modulate = Color(0.5, 0.5, 0.5) func set_sprite(val): sprite = val if has_node("sprite"): $sprite.texture = sprite func set_base_move_points(val): base_move_points = val if has_node("points"): $points.move = val func set_base_hull_points(val): base_hull_points = val if has_node("points"): $points.hull = val func set_base_shield_points(val): base_shield_points = val if has_node("points"): $points.shield = val func set_base_damage_points(val): base_damage_points = val if has_node("points"): $points.damage = val func can_target(other): if not playable or not other or other == self: return false else: return other.attacker != attacker func can_be_used_on_anchor(anchor): return playable and anchor is Anchor and anchor.is_connected_to(get_parent()) and (anchor.is_empty() or can_target(anchor.get_content())) func update_anchors(): var cursor = rect_global_position + dragged if dragged else null selected_anchor = BattleHelper.update_anchors(get_tree(), cursor, funcref(self, "can_be_used_on_anchor")) func play(anchor): if playable: if anchor.is_empty(): move_to(anchor) else: var other = anchor.get_content() if other.has_method("get_points"): attack(other) return_to_base() func move_to(anchor): if $points.move: $points.move -= 1 var position = rect_global_position anchor.set_content(self) rect_position = position - anchor.position $sprite.rotation = atan2(-rect_position.y, -rect_position.x) AnimHelper.linear_goto(self, Vector2(-50, -50)) func get_points() -> UnitPoints: if $points is UnitPoints: return $points as UnitPoints else: return null func attack(other) -> bool: var selfpoints = get_points() var otherpoints = other.get_points() while selfpoints.damage: selfpoints.damage -= 1 if otherpoints.shield: otherpoints.shield -= 1 elif otherpoints.hull: otherpoints.hull -= 1 while otherpoints.damage: otherpoints.damage -= 1 if selfpoints.shield: selfpoints.shield -= 1 elif selfpoints.hull: selfpoints.hull -= 1 if selfpoints.hull <= 0: destroy() if otherpoints.hull <= 0: other.destroy() return selfpoints.hull > 0 && otherpoints.hull == 0 func return_to_base(): dragged = null $move_hint.visible = false $move_hint.set_point_position(1, Vector2(0, 0)) func _gui_input(event): if not playable: return if event is InputEventMouseButton and event.button_index == 1: if event.pressed: dragged = event.position $move_hint.visible = true elif dragged: dragged = null $move_hint.visible = false if selected_anchor: play(selected_anchor) else: return_to_base() if event is InputEventMouseMotion and event.button_mask == BUTTON_LEFT: dragged = event.position update_anchors() if dragged: $move_hint.set_point_position(1, selected_anchor.global_position - rect_global_position if selected_anchor else dragged)