Files
MovementTests/addons/guide/triggers/guide_trigger_stability.gd
2025-05-27 19:20:46 +02:00

73 lines
2.0 KiB
GDScript

@tool
## Triggers depending on whether the input changes while actuated. This trigger is
## is implicit, so it must succeed for all other triggers to succeed.
class_name GUIDETriggerStability
extends GUIDETrigger
enum TriggerWhen {
## Input must be stable
INPUT_IS_STABLE,
## Input must change
INPUT_CHANGES
}
## The maximum amount that the input can change after actuation before it is
## considered "changed".
@export var max_deviation:float = 1
## When should the trigger trigger?
@export var trigger_when:TriggerWhen = TriggerWhen.INPUT_IS_STABLE
var _initial_value:Vector3
var _deviated:bool = false
func _get_trigger_type() -> GUIDETriggerType:
return GUIDETriggerType.IMPLICIT
func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState:
if _is_actuated(input, value_type):
if _deviated:
if trigger_when == TriggerWhen.INPUT_IS_STABLE:
return GUIDETriggerState.NONE
return GUIDETriggerState.TRIGGERED
if not _is_actuated(_last_value, value_type):
# we went from "not actuated" to actuated, start
_initial_value = input
if trigger_when == TriggerWhen.INPUT_IS_STABLE:
return GUIDETriggerState.TRIGGERED
else:
return GUIDETriggerState.ONGOING
# calculate how far the input is from the initial value
if _initial_value.distance_squared_to(input) > (max_deviation * max_deviation):
_deviated = true
if trigger_when == TriggerWhen.INPUT_IS_STABLE:
return GUIDETriggerState.NONE
return GUIDETriggerState.TRIGGERED
if trigger_when == TriggerWhen.INPUT_IS_STABLE:
return GUIDETriggerState.TRIGGERED
return GUIDETriggerState.ONGOING
# if the input is not actuated
_deviated = false
return GUIDETriggerState.NONE
func _editor_name() -> String:
return "Stability"
func _editor_description() -> String:
return "Triggers depending on whether the input changes while actuated. This trigger\n" +\
"is implicit, so it must succeed for all other triggers to succeed."