50 lines
1.0 KiB
GDScript
50 lines
1.0 KiB
GDScript
class_name HealthComponent
|
|
extends Node
|
|
|
|
signal health_changed(current: int, maximum: int)
|
|
signal depleted
|
|
|
|
@export var maximum := 100
|
|
@export var current := 100
|
|
|
|
|
|
func _ready() -> void:
|
|
_emit_changed()
|
|
|
|
|
|
func set_values(next_current: int, next_maximum: int) -> void:
|
|
maximum = max(1, next_maximum)
|
|
current = clampi(next_current, 0, maximum)
|
|
_emit_changed()
|
|
|
|
|
|
func apply_damage(amount: int) -> void:
|
|
if amount <= 0:
|
|
return
|
|
current = clampi(current - amount, 0, maximum)
|
|
_emit_changed()
|
|
if current == 0:
|
|
depleted.emit()
|
|
|
|
|
|
func heal(amount: int) -> void:
|
|
if amount <= 0:
|
|
return
|
|
current = clampi(current + amount, 0, maximum)
|
|
_emit_changed()
|
|
|
|
|
|
func _emit_changed() -> void:
|
|
health_changed.emit(current, maximum)
|
|
_event_bus().emit_signal("player_health_changed", current, maximum)
|
|
|
|
|
|
func _event_bus() -> Node:
|
|
var root := get_tree().root
|
|
var bus := root.get_node_or_null("EventBus")
|
|
if bus == null:
|
|
bus = load("res://autoload/event_bus.gd").new()
|
|
bus.name = "EventBus"
|
|
root.add_child(bus)
|
|
return bus
|