Files
2026-07-06 22:59:47 -07:00

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