broken_seals_roguelike/game/player/NamePlate.gd

131 lines
3.4 KiB
GDScript3
Raw Normal View History

extends VBoxContainer
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
export(float) var max_distance : float = 70 setget set_max_distance
var max_distance_squared : float = max_distance * max_distance
export(NodePath) var name_label_path : NodePath = "Name"
export(NodePath) var health_bar_path : NodePath = "HealthBar"
export(NodePath) var health_bar_label_path : NodePath = "HealthBar"
export(Color) var normal_color : Color = Color("#e7e7e7")
export(Vector2) var normal_scale : Vector2 = Vector2(0.75, 0.75)
export(Color) var mouseover_color : Color = Color("#ffffff")
export(Vector2) var mouseover_scale : Vector2 = Vector2(0.85, 0.85)
export(Color) var targeted_color : Color = Color("#ffffff")
export(Vector2) var targeted_scale : Vector2 = Vector2(0.85, 0.85)
var target_scale : Vector2
var interpolating : bool
var targeted : bool = false
var name_label : Label = null
var health_bar : TextureProgress = null
var health_bar_label : Label = null
var entity : Entity = null
var health : Stat = null
func _ready():
name_label = get_node(name_label_path) as Label
health_bar = get_node(health_bar_path) as TextureProgress
health_bar_label = get_node(health_bar_label_path) as Label
entity = get_node("..") as Entity
health = entity.get_health()
health.connect("c_changed", self, "c_health_changed")
name_label.text = entity.centity_name
entity.connect("cname_changed", self, "cname_changed")
entity.connect("onc_mouse_entered", self, "onc_entity_mouse_entered")
entity.connect("onc_mouse_exited", self, "onc_entity_mouse_exited")
entity.connect("onc_targeted", self, "onc_targeted")
entity.connect("onc_untargeted", self, "onc_untargeted")
c_health_changed(health)
modulate = normal_color
set_scale(normal_scale)
target_scale = normal_scale
interpolating = false
set_process(true)
func _process(delta):
if interpolating:
var d : Vector2 = ((target_scale - get_scale()).normalized() * delta) + get_scale()
set_scale(d)
if (get_scale() - target_scale).length() < 0.04:
interpolating = false
var position : Vector2 = entity.position
position = get_global_transform().xform_inv(position)
position.x -= (rect_size.x / 2.0 + 24) * rect_scale.x
position.y -= 130 * rect_scale.y
set_position(position)
func set_max_distance(var value : float) -> void:
max_distance_squared = value * value
max_distance = value
func c_health_changed(stat : Stat) -> void:
if health.cmax == 0:
health_bar.max_value = 1
health_bar.value = 0
return
health_bar.max_value = stat.cmax
health_bar.value = stat.ccurrent
# if stat.cmax != 0:
# health_bar_label.text = str(int(stat.ccurrent / stat.cmax * 100))
func cname_changed(ent : Entity) -> void:
name_label.text = ent.centity_name
func onc_entity_mouse_entered() -> void:
if targeted:
return
modulate = mouseover_color
interpolate_scale(mouseover_scale)
func onc_entity_mouse_exited() -> void:
if targeted:
return
modulate = normal_color
interpolate_scale(normal_scale)
func onc_targeted() -> void:
targeted = true
modulate = targeted_color
interpolate_scale(targeted_scale)
func onc_untargeted() -> void:
targeted = false
modulate = normal_color
interpolate_scale(normal_scale)
func interpolate_scale(target : Vector2) -> void:
target_scale = target
interpolating = true