91 lines
2.5 KiB
GDScript3
91 lines
2.5 KiB
GDScript3
|
class_name LevelCardCutIn extends Control
|
||
|
|
||
|
enum Phase {COMING, STAYING, GOING}
|
||
|
|
||
|
signal storyboard_should_start_loading_level
|
||
|
|
||
|
@export var test_mode := false
|
||
|
|
||
|
@onready var level_label := (
|
||
|
$PanelContainer/VBoxContainer/Level as Label
|
||
|
)
|
||
|
@onready var mission_label := (
|
||
|
$PanelContainer/VBoxContainer/Mission as Label
|
||
|
)
|
||
|
@onready var best_time_label := (
|
||
|
$PanelContainer/VBoxContainer/BestTime as Label
|
||
|
)
|
||
|
@onready var audio_player := $AudioStreamPlayer as AudioStreamPlayer
|
||
|
|
||
|
var viewport_rect: Rect2
|
||
|
var phase := Phase.COMING
|
||
|
var time_came_usecs: int = -1
|
||
|
var level_descriptor: LevelDescriptor
|
||
|
var mission_descriptor: MissionDescriptor
|
||
|
var game_mode: LevelDescriptor.GameMode
|
||
|
var save_data: MapCompletionMark
|
||
|
|
||
|
func _ready() -> void:
|
||
|
viewport_rect = get_viewport().get_visible_rect()
|
||
|
get_viewport().size_changed.connect(_on_viewport_size_changed)
|
||
|
position = viewport_rect.position
|
||
|
position.x += viewport_rect.size.x
|
||
|
if not test_mode:
|
||
|
var args := UI.Args(self)
|
||
|
level_descriptor = args[&'level_descriptor']
|
||
|
mission_descriptor = args.get(&'mission_descriptor')
|
||
|
game_mode = args.get(
|
||
|
&'game_mode',
|
||
|
LevelDescriptor.GameMode.MISSION if mission_descriptor
|
||
|
else LevelDescriptor.GameMode.FREERUN
|
||
|
)
|
||
|
save_data = args.get(&'save_data')
|
||
|
modulate = level_descriptor.color
|
||
|
level_label.text = level_descriptor.name
|
||
|
match game_mode:
|
||
|
LevelDescriptor.GameMode.MISSION:
|
||
|
mission_label.text = mission_descriptor.name
|
||
|
if save_data:
|
||
|
best_time_label.text = (
|
||
|
TimeIntervalFormatting.format_realtime_interval(
|
||
|
save_data.best_time
|
||
|
)
|
||
|
)
|
||
|
pass
|
||
|
else:
|
||
|
best_time_label.visible = false
|
||
|
LevelDescriptor.GameMode.FREERUN:
|
||
|
mission_label.text = "Show your stuff!"
|
||
|
best_time_label.visible = false
|
||
|
_:
|
||
|
mission_label.visible = false
|
||
|
best_time_label.visible = false
|
||
|
|
||
|
func _on_viewport_size_changed() -> void:
|
||
|
viewport_rect = get_viewport().get_visible_rect()
|
||
|
|
||
|
func _process(_delta: float) -> void:
|
||
|
match phase:
|
||
|
Phase.COMING:
|
||
|
if abs(position.x - viewport_rect.position.x) < 1.0:
|
||
|
time_came_usecs = Time.get_ticks_usec()
|
||
|
phase = Phase.STAYING
|
||
|
if not test_mode:
|
||
|
storyboard_should_start_loading_level.emit()
|
||
|
else:
|
||
|
position.x = lerpf(
|
||
|
position.x, viewport_rect.position.x, 0.03125
|
||
|
)
|
||
|
Phase.STAYING:
|
||
|
pass
|
||
|
Phase.GOING:
|
||
|
if position.x < -viewport_rect.size.x:
|
||
|
UI.Return(self, true)
|
||
|
else:
|
||
|
position.x -= (
|
||
|
abs(viewport_rect.position.x - position.x) + 1.0
|
||
|
)
|
||
|
|
||
|
func on_loading_finished() -> void:
|
||
|
phase = Phase.GOING
|