Refactor rhythm action architecture
This commit is contained in:
54
scenes/components/energy_component.gd
Normal file
54
scenes/components/energy_component.gd
Normal file
@@ -0,0 +1,54 @@
|
||||
class_name EnergyComponent
|
||||
extends Node
|
||||
|
||||
signal energy_changed(current: int, maximum: int)
|
||||
|
||||
@export var maximum := 10
|
||||
@export var current := 0
|
||||
|
||||
|
||||
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 set_current(next_current: int) -> void:
|
||||
var clamped := clampi(next_current, 0, maximum)
|
||||
if clamped == current:
|
||||
return
|
||||
current = clamped
|
||||
_emit_changed()
|
||||
|
||||
|
||||
func change(delta: int) -> void:
|
||||
set_current(current + delta)
|
||||
|
||||
|
||||
func spend(cost: float) -> bool:
|
||||
var int_cost := int(ceil(cost))
|
||||
if int_cost <= 0:
|
||||
return true
|
||||
if current < int_cost:
|
||||
return false
|
||||
set_current(current - int_cost)
|
||||
return true
|
||||
|
||||
|
||||
func _emit_changed() -> void:
|
||||
energy_changed.emit(current, maximum)
|
||||
_event_bus().emit_signal("player_energy_changed", float(current), float(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
|
||||
Reference in New Issue
Block a user