gfolf2/src/ui/shot_hud/shot_hud.gd

111 lines
3.0 KiB
GDScript

class_name ShotHUD extends Control
## HUD for main gameplay loop
## Scale factor for the life bar rumble intensity on taking damage
const LIFE_BAR_DAMAGE_RUMBLE_SCALE := 0.2
## Time it takes to dampen the life bar rumble on taking damage, in seconds
const LIFE_BAR_DAMAGE_RUMBLE_TIME := 0.2
var _life_signal: Signal
@onready var power_bar: TextureProgressBar = %PowerBar
@onready var curve_bar: ProgressBar = %CurveBar
@onready var life_bar: TextureProgressBar = %LifeBar
@onready var club_selector: ClubSelector = %ClubSelector
@onready var hud_state_machine: AnimationTree = %HUDStateMachine
@onready var _curve_animation: AnimationPlayer = %CurveAnimation
@onready var _power_animation: AnimationPlayer = %PowerAnimation
@onready var _nice_animation: AnimationPlayer = %NiceAnimation
@onready var _wasted_animation: AnimationPlayer = %WastedAnimation
@onready var _player_name: Label = %PlayerName
@onready var _life_bar_rumbler: Rumbler = %LifeBarRumbler
@onready var _state: AnimationNodeStateMachinePlayback = hud_state_machine["parameters/playback"]
## Set any HUD state specific to the player.
func set_state_for_player(player: WorldPlayer) -> void:
print_debug("Setting HUD for player ", player.name)
club_selector.set_state_for_player(player)
_player_name.text = player.name
# TODO animate on life loss?
life_bar.value = player.life
life_bar.tint_progress = player.color
# TODO this is soooooo wack...
# TODO we should just revert to having distinct ShotHUDs for each player
if _life_signal and _life_signal.is_connected(set_life_value):
_life_signal.disconnect(set_life_value)
_life_signal = player.on_life_changed
_life_signal.connect(set_life_value)
# TODO special equipment
# TODO abilities
func show_hud() -> void:
_state.travel("visible")
func hide_hud() -> void:
_state.travel("hidden")
func start_power_bar() -> void:
_power_animation.play("fill")
func stop_power_bar() -> void:
_power_animation.pause()
func reset_power_bar() -> void:
_power_animation.stop()
func start_curve_bar() -> void:
_curve_animation.play("fill")
func stop_curve_bar() -> void:
_curve_animation.pause()
func reset_curve_bar() -> void:
_curve_animation.stop()
func play_nice_animation() -> void:
_nice_animation.play("display")
func play_wasted_animation() -> void:
_wasted_animation.play("display")
## Set the value of the life bar, potentially playing some kind of effect in response.
##
## To set the life bar without triggering an effect, set it directly with `life_bar.value`
func set_life_value(new_value: float) -> void:
var difference := new_value - life_bar.value
if difference < 0:
# Taking damage
_life_bar_rumbler.intensity = LIFE_BAR_DAMAGE_RUMBLE_SCALE * abs(difference)
var tween := get_tree().create_tween()
(
tween
. tween_property(_life_bar_rumbler, "intensity", 0, LIFE_BAR_DAMAGE_RUMBLE_TIME)
. set_trans(Tween.TRANS_CUBIC)
)
elif difference > 0:
# Restoring health
# TODO: something for this?
pass
life_bar.value = new_value