tool extends Node2D class_name BaseUnit signal combat_simulation(attacker, defender) 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"): $points.enemy = not attacker 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(): selected_anchor = BattleHelper.update_anchors(get_tree(), dragged, funcref(self, "can_be_used_on_anchor")) func play(anchor): if playable and anchor: if anchor.is_empty(): move_to(anchor) else: var other = anchor.get_content() if other.has_method("get_points"): attack(other) reset_state() func simulate(anchor): if playable and anchor and not anchor.is_empty(): var other = anchor.get_content() if other.has_method("get_points"): emit_signal("combat_simulation", self, other) else: emit_signal("combat_simulation", null, null) else: emit_signal("combat_simulation", null, null) func move_to(anchor): if $points.move: $points.move -= 1 var old_position = global_position anchor.set_content(self) set_position(old_position - anchor.position) $sprite.rotation = atan2(-position.y, -position.x) AnimHelper.linear_goto(self, Vector2()) func get_points() -> UnitPoints: if $points is UnitPoints: return $points as UnitPoints else: return null func attack(other): var selfpoints = get_points() var otherpoints = other.get_points() BattleHelper.apply_combat(selfpoints, otherpoints) if selfpoints.hull <= 0: destroy() if otherpoints.hull <= 0: other.destroy() func do_damage(val): var selfpoints = get_points() var fakepoints = load("res://units/points.tscn").instance() fakepoints.damage = val BattleHelper.apply_combat(fakepoints, get_points()) if selfpoints.hull <= 0: destroy() func reset_state(): dragged = null $move_hint.visible = false $move_hint.set_point_position(1, Vector2(0, 0)) func turn_ended(): $points.move = base_move_points $points.damage = base_damage_points $points.shield = base_shield_points func on_dragged(active, relative, absolute): if not playable: return if active: simulate(selected_anchor) elif dragged: simulate(null) play(selected_anchor) $move_hint.visible = active if active: dragged = absolute else: dragged = null update_anchors() if dragged: $move_hint.set_point_position(1, (selected_anchor.global_position if selected_anchor else dragged) - global_position)