73 lines
2.0 KiB
GDScript
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."
|