frame-of-mind/src/base-environments/transition/code/dolly.gd

81 lines
2.2 KiB
GDScript

## A dolly tweens all contents to and from two destination points, and to its origin.
class_name Dolly
extends Node3D
@export var index : int = -1
@export var signage_group : String
@export var pre_arrival_time : float = 17.0
@export var arrival_time : float = 15.0
@export var pre_leave_time : float = 20.0
@export var door_close_time : float = 1.0
@export var leave_time : float = 15.0
@export var post_leave_time : float = 5.0
@onready var origination : Node3D = $Origination
@onready var destination : Node3D = $Destination
@onready var subway : SubwayTrain = $Subway
var tween : Tween = null
signal departure(index : int)
func _ready() -> void:
reset()
## One arrival and departure
func cycle() -> void:
await arrive()
await leave()
func reset() -> void:
if tween: tween.kill()
subway.global_position = origination.global_position
func _seat_player_if_inside() -> bool:
if %EntryDetect.overlaps_body(State.player):
prints("Player departs inside Train", self.name)
State.player.reparent(subway)
return true
return false
func _unseat_player_if_inside() -> void:
if %EntryDetect.overlaps_body(State.player):
prints("Player arrives on Train", self.name)
State.player.reparent(get_parent())
func arrive(endstation : bool = false) -> void:
%SubwayTrainAudio.play(0)
%SubwayTrainAudioIntense.play(0)
await get_tree().create_timer(pre_arrival_time).timeout
if tween: tween.kill()
tween = create_tween().set_trans(Tween.TRANS_CIRC).set_ease(Tween.EASE_OUT)
tween.parallel().tween_property(subway, "global_position", self.global_position, arrival_time)
await tween.finished
subway.door_open = true
_unseat_player_if_inside()
if endstation:
%SubwayTrainAudio.stop()
%SubwayTrainAudioIntense.stop()
func leave() -> void:
await get_tree().create_timer(pre_leave_time).timeout
subway.door_open = false
await get_tree().create_timer(door_close_time).timeout
var seated := _seat_player_if_inside()
if tween: tween.kill()
tween = create_tween().set_trans(Tween.TRANS_QUART).set_ease(Tween.EASE_IN)
tween.parallel().tween_property(subway, "global_position", destination.global_position, leave_time)
await tween.finished
await %SubwayTrainAudio.finished
# Player was on board and has left the station
if seated: departure.emit(index)
reset()