godot-xterm/addons/gut/awaiter.gd
2023-01-21 15:33:25 +13:00

74 lines
1.4 KiB
GDScript

extends Node
signal timeout
signal wait_started
var _wait_time = 0.0
var _wait_frames = 0
var _signal_to_wait_on = null
var _elapsed_time = 0.0
var _elapsed_frames = 0
func _physics_process(delta):
if _wait_time != 0.0:
_elapsed_time += delta
if _elapsed_time >= _wait_time:
_end_wait()
if _wait_frames != 0:
_elapsed_frames += 1
if _elapsed_frames >= _wait_frames:
_end_wait()
func _end_wait():
_wait_time = 0.0
_wait_frames = 0
_signal_to_wait_on = null
_elapsed_time = 0.0
_elapsed_frames = 0
timeout.emit()
const ARG_NOT_SET = "_*_argument_*_is_*_not_set_*_"
func _signal_callback(
arg1 = ARG_NOT_SET,
arg2 = ARG_NOT_SET,
arg3 = ARG_NOT_SET,
arg4 = ARG_NOT_SET,
arg5 = ARG_NOT_SET,
arg6 = ARG_NOT_SET,
arg7 = ARG_NOT_SET,
arg8 = ARG_NOT_SET,
arg9 = ARG_NOT_SET
):
_signal_to_wait_on.disconnect(_signal_callback)
# DO NOT _end_wait here. For other parts of the test to get the signal that
# was waited on, we have to wait for a couple more frames. For example, the
# signal_watcher doesn't get the signal in time if we don't do this.
_wait_frames = 2
func wait_for(x):
_wait_time = x
wait_started.emit()
func wait_frames(x):
_wait_frames = x
wait_started.emit()
func wait_for_signal(the_signal, x):
the_signal.connect(_signal_callback)
_signal_to_wait_on = the_signal
_wait_time = x
wait_started.emit()
func is_waiting():
return _wait_time != 0.0 || _wait_frames != 0