2024-04-16 22:55:17 +00:00
|
|
|
@icon("res://behaviours/sampler.svg")
|
2024-04-16 03:08:25 +00:00
|
|
|
extends Node
|
|
|
|
class_name Sampler
|
|
|
|
|
|
|
|
|
|
|
|
## Abstract base class for sampling a certain reference among multiple.
|
|
|
|
|
|
|
|
|
2024-04-18 23:26:02 +00:00
|
|
|
## [Array] of [Node]s that can be [func sample]d by this [Sampler].
|
2024-04-17 02:52:11 +00:00
|
|
|
@export var possibilities: Array[Node] = []
|
|
|
|
|
2024-04-23 07:43:17 +00:00
|
|
|
## If true, the [Sampler] will attempt to automatically [method sample_and_enable] on NOTIFICATION_READY.
|
|
|
|
@export var autoenable_on_ready: bool = true
|
2024-04-23 07:16:09 +00:00
|
|
|
|
|
|
|
|
2024-04-22 22:13:54 +00:00
|
|
|
var selected: Node = null;
|
|
|
|
|
2024-04-17 02:52:11 +00:00
|
|
|
|
2024-04-16 03:08:25 +00:00
|
|
|
## Get a reference.
|
2024-04-17 02:52:11 +00:00
|
|
|
func sample() -> Node:
|
2024-04-16 03:08:25 +00:00
|
|
|
Log.e(self, "Not implemented.")
|
|
|
|
return null
|
2024-04-17 02:52:11 +00:00
|
|
|
|
2024-04-18 23:26:02 +00:00
|
|
|
## Set the [field enabled] property to true on a [method sample]d node, and to false on all others.
|
2024-04-22 22:13:54 +00:00
|
|
|
func sample_and_enable() -> void:
|
|
|
|
set_enabled(sample())
|
|
|
|
|
|
|
|
func set_enabled(node: Node) -> void:
|
|
|
|
if node == selected:
|
|
|
|
return
|
|
|
|
selected = node
|
|
|
|
var selected_ref = get_ref(selected)
|
2024-04-18 23:26:02 +00:00
|
|
|
for possibility in get_all_refs():
|
2024-04-22 22:13:54 +00:00
|
|
|
possibility.enabled = (selected_ref == possibility)
|
2024-04-18 23:26:02 +00:00
|
|
|
|
2024-04-22 22:13:54 +00:00
|
|
|
func get_ref(node: Node) -> Node:
|
|
|
|
return node
|
2024-04-18 23:26:02 +00:00
|
|
|
|
|
|
|
## Get all possible nodes referenced by [field possibilities].
|
|
|
|
##
|
|
|
|
## Useful as it may be overridden by some other [Sampler]s, such as [SamplerPriority].
|
|
|
|
func get_all_refs() -> Array[Node]:
|
2024-04-23 07:16:09 +00:00
|
|
|
return possibilities
|
|
|
|
|
|
|
|
|
|
|
|
func _ready() -> void:
|
2024-04-23 07:43:17 +00:00
|
|
|
if autoenable_on_ready:
|
|
|
|
sample_and_enable.call_deferred()
|