56 lines
1.0 KiB
GDScript
56 lines
1.0 KiB
GDScript
class_name ComboWindow
|
|
extends RefCounted
|
|
|
|
signal window_cleared(reason: String)
|
|
|
|
const SIZE := 4
|
|
|
|
var slots: Array[String] = []
|
|
var pending_clear_reason := ""
|
|
|
|
|
|
func record(input: String) -> void:
|
|
if input.is_empty():
|
|
return
|
|
slots.append(input)
|
|
if slots.size() >= SIZE:
|
|
pending_clear_reason = "full"
|
|
|
|
|
|
func get_slots() -> Array[String]:
|
|
return slots.duplicate()
|
|
|
|
|
|
func has_pending_clear() -> bool:
|
|
return not pending_clear_reason.is_empty()
|
|
|
|
|
|
func consume_pending_clear_reason() -> String:
|
|
var reason := pending_clear_reason
|
|
pending_clear_reason = ""
|
|
return reason
|
|
|
|
|
|
func get_pattern() -> String:
|
|
var pattern := ""
|
|
for slot: String in slots:
|
|
if slot != "Ø":
|
|
pattern += slot
|
|
return pattern
|
|
|
|
|
|
func get_contiguous_pattern() -> String:
|
|
var pattern := ""
|
|
for index: int in range(slots.size() - 1, -1, -1):
|
|
var slot := slots[index]
|
|
if slot == "Ø":
|
|
break
|
|
pattern = slot + pattern
|
|
return pattern
|
|
|
|
|
|
func clear(reason := "") -> void:
|
|
slots.clear()
|
|
pending_clear_reason = ""
|
|
window_cleared.emit(reason)
|