1
0
Fork 0
spacetac/units/base_unit.gd

167 lines
3.9 KiB
GDScript

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 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)