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

124 lines
3.3 KiB
GDScript3
Raw Normal View History

2026-01-20 20:07:41 +00:00
## A dolly tweens all contents to and from two destination points, and to its origin.
class_name Dolly
extends Node3D
2026-01-20 21:47:44 +00:00
@export var index : int = -1
@export var signage_group : String
2026-01-20 17:35:37 +00:00
2026-01-21 17:16:11 +00:00
@export_group("Motion")
@export_subgroup("Arrival")
@export var pre_arrival_time : float = 17.0 # hold train for this long (to sync with audio!)
@export var arrival_time : float = 15.0 # train takes this long to enter (shorter = faster)
@export var trans_arrival : Tween.TransitionType = Tween.TRANS_CIRC
@export var ease_arrival : Tween.EaseType = Tween.EASE_OUT
@export_subgroup("In Station")
@export var station_wait_time : float = 20.0
@export_subgroup("Departure")
2026-01-20 17:35:37 +00:00
@export var door_close_time : float = 1.0
2026-01-21 17:16:11 +00:00
@export var leave_time : float = 15.0 # train takes this long to leave the platform
@export var trans_departure : Tween.TransitionType = Tween.TRANS_QUAD
@export var ease_departure : Tween.EaseType = Tween.EASE_IN
2026-01-20 11:37:17 +00:00
@onready var origination : Node3D = $Origination
2026-01-20 20:07:41 +00:00
@onready var destination : Node3D = $Destination
2026-01-20 11:37:17 +00:00
@onready var subway : SubwayTrain = $Subway
2026-01-20 16:23:11 +00:00
@onready var subway_audio_main : AudioStreamPlayer3D = %SubwayTrainAudio
@onready var subway_audio_2 : AudioStreamPlayer3D = %SubwayTrainAudioIntense
var player_on_board : bool:
get: return %EntryDetect.overlaps_body(State.player)
2026-01-20 11:37:17 +00:00
var tween : Tween = null
## Player is about to arrive
signal train_approaching(track : Dolly)
## Player has fully arrived at station
signal train_arrived(track : Dolly)
## Player is departing in train
signal train_departing(track : Dolly)
## Player has fully left the station with train
signal train_left(track : Dolly)
2026-01-20 20:07:41 +00:00
2026-01-20 21:47:44 +00:00
func _ready() -> void:
reset()
2026-01-24 12:59:14 +00:00
func set_line(line: StringName):
subway.set_line(line)
2026-01-20 20:07:41 +00:00
## One arrival and departure
2026-01-20 17:18:10 +00:00
func cycle() -> void:
await arrive()
await leave()
2026-01-20 21:47:44 +00:00
func reset() -> void:
if tween: tween.kill()
subway.global_position = origination.global_position
2026-01-20 21:47:44 +00:00
func _seat_player() -> void:
prints("Player departs inside Train", self.name)
State.player.reparent(subway)
2026-01-20 20:07:41 +00:00
func _unseat_player() -> void:
prints("Player arrives on Train", self.name)
State.player.reparent(get_parent())
2026-01-20 17:18:10 +00:00
2026-01-20 20:35:12 +00:00
2026-01-21 00:54:01 +00:00
func arrive(endstation : bool = false) -> void:
subway_audio_main.play()
subway_audio_2.play()
2026-01-20 17:35:37 +00:00
await get_tree().create_timer(pre_arrival_time).timeout
if player_on_board:
train_approaching.emit(self)
2026-01-20 11:37:17 +00:00
if tween: tween.kill()
2026-01-21 17:16:11 +00:00
tween = create_tween().set_trans(trans_arrival).set_ease(ease_arrival)
tween.parallel().tween_property(subway, "global_position", self.global_position, arrival_time)
2026-01-20 16:23:11 +00:00
await tween.finished
2026-01-20 20:07:41 +00:00
subway.door_open = true
if player_on_board:
_unseat_player()
train_arrived.emit(self)
2026-01-21 00:54:01 +00:00
if endstation:
subway_audio_main.stop()
subway_audio_2.stop()
2026-01-21 00:54:01 +00:00
2026-01-20 11:37:17 +00:00
func leave() -> void:
2026-01-21 17:16:11 +00:00
await get_tree().create_timer(station_wait_time).timeout
2026-01-20 17:18:10 +00:00
subway.door_open = false
2026-01-20 17:35:37 +00:00
await get_tree().create_timer(door_close_time).timeout
if player_on_board:
_seat_player()
train_departing.emit(self)
2026-01-20 17:18:10 +00:00
if tween: tween.kill()
2026-01-21 17:16:11 +00:00
tween = create_tween().set_trans(trans_departure).set_ease(ease_departure)
tween.parallel().tween_property(subway, "global_position", destination.global_position, leave_time)
# Player is on board and will be leaving
2026-01-20 16:23:11 +00:00
await tween.finished
2026-01-20 21:47:44 +00:00
# Player was on board and has left the station
if player_on_board: train_left.emit(self)
reset() # Warp back / rewind train position