Tales-of-PKMN/game/ui/hints/hints.gd
2026-10-13 09:50:50 +02:00

42 lines
1.3 KiB
GDScript

extends Node
signal changed
var _layers : Dictionary = {} #source (objet ou StringName) -> Array[Hint]
func show_hints(source : Variant, list : Array) -> void:
var clean : Array = list.filter(func(h) -> bool: return h != null) #un Hint non assigne est ignore
if clean.is_empty():
clear_hints(source)
return
if _layers.get(source) == clean: return
_layers[source] = clean
changed.emit()
func clear_hints(source : Variant) -> void:
if _layers.erase(source): changed.emit()
func get_visible() -> Array[Hint]:
#aplatit toutes les sources, en gardant l'ordre d'arrivee pour departager les priorites egales
var entries : Array = [] #[hint, ordre]
for source in _layers.keys():
if typeof(source) == TYPE_OBJECT and !is_instance_valid(source):
_layers.erase(source) #source detruite sans avoir appele clear_hints
continue
for h in _layers[source]:
entries.append([h, entries.size()])
entries.sort_custom(func(a : Array, b : Array) -> bool:
if a[0].priority != b[0].priority: return a[0].priority > b[0].priority
return a[1] < b[1])
#une action = un seul hint (le plus prioritaire)
var result : Array[Hint] = []
var used : Dictionary = {}
for e in entries:
var h : Hint = e[0]
if used.has(h.action): continue
used[h.action] = true
result.append(h)
return result