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