generated from krampus/template-godot4
111 lines
3.0 KiB
GDScript
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
|