64 lines
1.8 KiB
GDScript
64 lines
1.8 KiB
GDScript
class_name StreakCounter
|
|
extends Node
|
|
|
|
## Sole writer of the streak count (AnchorV1.0 "ComboCounter").
|
|
## Pure fact subscriber: +1 on skill_executed, reset on miss / chart_reset.
|
|
|
|
var streak := 0
|
|
|
|
|
|
func _ready() -> void:
|
|
for bus: Node in _event_buses():
|
|
if bus.has_signal("skill_executed") and not bus.is_connected("skill_executed", _on_skill_executed):
|
|
bus.connect("skill_executed", _on_skill_executed)
|
|
if bus.has_signal("judgement_made") and not bus.is_connected("judgement_made", _on_judgement_made):
|
|
bus.connect("judgement_made", _on_judgement_made)
|
|
if bus.has_signal("time_anchor_resolved") and not bus.is_connected("time_anchor_resolved", _on_time_anchor_resolved):
|
|
bus.connect("time_anchor_resolved", _on_time_anchor_resolved)
|
|
if bus.has_signal("chart_reset") and not bus.is_connected("chart_reset", _on_chart_reset):
|
|
bus.connect("chart_reset", _on_chart_reset)
|
|
|
|
|
|
func _on_skill_executed(_skill: Resource, _judgement: StringName) -> void:
|
|
streak += 1
|
|
_broadcast()
|
|
|
|
|
|
func _on_judgement_made(quality: StringName, _offset_ms: float, _beat_index: int) -> void:
|
|
if quality != &"miss":
|
|
return
|
|
reset()
|
|
|
|
|
|
func _on_time_anchor_resolved(_anchor: Dictionary, held: bool, _judgement: Dictionary) -> void:
|
|
if held:
|
|
return
|
|
reset()
|
|
|
|
|
|
func _on_chart_reset(_chart_id: StringName) -> void:
|
|
reset()
|
|
|
|
|
|
func reset() -> void:
|
|
if streak == 0:
|
|
return
|
|
streak = 0
|
|
_broadcast()
|
|
|
|
|
|
func _broadcast() -> void:
|
|
for bus: Node in _event_buses():
|
|
if bus.has_signal("streak_changed"):
|
|
bus.emit_signal("streak_changed", streak)
|
|
|
|
|
|
func _event_buses() -> Array[Node]:
|
|
var buses: Array[Node] = []
|
|
if not is_inside_tree():
|
|
return buses
|
|
for child: Node in get_tree().root.get_children():
|
|
if child.has_signal("skill_executed") and child.has_signal("streak_changed"):
|
|
buses.append(child)
|
|
return buses
|