gd: added menu template

This commit is contained in:
2025-06-10 18:46:20 +02:00
parent f9a6c42b14
commit c554e24b01
421 changed files with 12371 additions and 2 deletions

View File

@ -0,0 +1,168 @@
class_name LoadingScreen
extends CanvasLayer
const STALLED_ON_WEB = "\nIf running in a browser, try clicking out of the window, \nand then click back into the window. It might unstick.\nLasty, you may try refreshing the page.\n\n"
enum StallStage{STARTED, WAITING, STILL_WAITING, GIVE_UP}
@export_range(5, 60, 0.5, "or_greater") var state_change_delay : float = 15.0
@export_group("State Messages")
@export_subgroup("In Progress")
@export var _in_progress : String = "Loading..."
@export var _in_progress_waiting : String = "Still Loading..."
@export var _in_progress_still_waiting : String = "Still Loading... (%d seconds)"
@export_subgroup("Completed")
@export var _complete : String = "Loading Complete!"
@export var _complete_waiting : String = "Any Moment Now..."
@export var _complete_still_waiting : String = "Any Moment Now... (%d seconds)"
var _stall_stage : StallStage = StallStage.STARTED
var _scene_loading_complete : bool = false
var _scene_loading_progress : float = 0.0 :
set(value):
var _value_changed = _scene_loading_progress != value
_scene_loading_progress = value
if _value_changed:
update_total_loading_progress()
_reset_loading_stage()
var _total_loading_progress : float = 0.0 :
set(value):
_total_loading_progress = value
%ProgressBar.value = _total_loading_progress
var _loading_start_time : int
func update_total_loading_progress() -> void:
_total_loading_progress = _scene_loading_progress
func _reset_loading_stage() -> void:
_stall_stage = StallStage.STARTED
%LoadingTimer.start(state_change_delay)
func _reset_loading_start_time() -> void:
_loading_start_time = Time.get_ticks_msec()
func _get_seconds_waiting() -> int:
return int((Time.get_ticks_msec() - _loading_start_time) / 1000.0)
func _update_scene_loading_progress() -> void:
var new_progress = SceneLoader.get_progress()
if new_progress > _scene_loading_progress:
_scene_loading_progress = new_progress
func _set_scene_loading_complete() -> void:
_scene_loading_progress = 1.0
_scene_loading_complete = true
func _reset_scene_loading_progress() -> void:
_scene_loading_progress = 0.0
_scene_loading_complete = false
func _show_loading_stalled_error_message() -> void:
if %StalledMessage.visible:
return
if _scene_loading_progress == 0:
%StalledMessage.dialog_text = "Stalled at start. You may try waiting or restarting.\n"
else:
%StalledMessage.dialog_text = "Stalled at %d%%. You may try waiting or restarting.\n" % (_scene_loading_progress * 100.0)
if OS.has_feature("web"):
%StalledMessage.dialog_text += STALLED_ON_WEB
%StalledMessage.popup()
func _show_scene_switching_error_message() -> void:
if %ErrorMessage.visible:
return
%ErrorMessage.dialog_text = "Loading Error: Failed to switch scenes."
%ErrorMessage.popup()
func _hide_popups() -> void:
%ErrorMessage.hide()
%StalledMessage.hide()
func get_progress_message() -> String:
var _progress_message : String
match _stall_stage:
StallStage.STARTED:
if _scene_loading_complete:
_progress_message = _complete
else:
_progress_message = _in_progress
StallStage.WAITING:
if _scene_loading_complete:
_progress_message = _complete_waiting
else:
_progress_message = _in_progress_waiting
StallStage.STILL_WAITING, StallStage.GIVE_UP:
if _scene_loading_complete:
_progress_message = _complete_still_waiting
else:
_progress_message = _in_progress_still_waiting
if _progress_message.contains("%d"):
_progress_message = _progress_message % _get_seconds_waiting()
return _progress_message
func _update_progress_messaging() -> void:
%ProgressLabel.text = get_progress_message()
if _stall_stage == StallStage.GIVE_UP:
if _scene_loading_complete:
_show_scene_switching_error_message()
else:
_show_loading_stalled_error_message()
else:
_hide_popups()
func _process(_delta : float) -> void:
var status = SceneLoader.get_status()
match(status):
ResourceLoader.THREAD_LOAD_IN_PROGRESS:
_update_scene_loading_progress()
_update_progress_messaging()
ResourceLoader.THREAD_LOAD_LOADED:
_set_scene_loading_complete()
_update_progress_messaging()
ResourceLoader.THREAD_LOAD_FAILED:
%ErrorMessage.dialog_text = "Loading Error: %d" % status
%ErrorMessage.popup()
set_process(false)
ResourceLoader.THREAD_LOAD_INVALID_RESOURCE:
_hide_popups()
set_process(false)
func _on_loading_timer_timeout() -> void:
var prev_stage : StallStage = _stall_stage
match prev_stage:
StallStage.STARTED:
_stall_stage = StallStage.WAITING
%LoadingTimer.start(state_change_delay)
StallStage.WAITING:
_stall_stage = StallStage.STILL_WAITING
%LoadingTimer.start(state_change_delay)
StallStage.STILL_WAITING:
_stall_stage = StallStage.GIVE_UP
func _reload_main_scene_or_quit() -> void:
var err = get_tree().change_scene_to_file(ProjectSettings.get_setting("application/run/main_scene"))
if err:
push_error("failed to load main scene: %d" % err)
get_tree().quit()
func _on_error_message_confirmed() -> void:
_reload_main_scene_or_quit()
func _on_confirmation_dialog_canceled() -> void:
_reload_main_scene_or_quit()
func _on_confirmation_dialog_confirmed() -> void:
_reset_loading_stage()
func reset() -> void:
show()
_reset_loading_stage()
_reset_scene_loading_progress()
_reset_loading_start_time()
_hide_popups()
set_process(true)
func close() -> void:
set_process(false)
_hide_popups()
hide()

View File

@ -0,0 +1 @@
uid://dgeewyjjpk4qn

View File

@ -0,0 +1,87 @@
[gd_scene load_steps=2 format=3 uid="uid://cd0jbh4metflb"]
[ext_resource type="Script" uid="uid://dgeewyjjpk4qn" path="res://addons/maaacks_game_template/base/scenes/loading_screen/loading_screen.gd" id="1_gbk34"]
[node name="LoadingScreen" type="CanvasLayer"]
process_mode = 3
layer = 20
script = ExtResource("1_gbk34")
[node name="Control" type="Control" parent="."]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="BackPanel" type="Panel" parent="Control"]
layout_mode = 0
anchor_right = 1.0
anchor_bottom = 1.0
[node name="BackgroundColor" type="ColorRect" parent="Control"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 0)
[node name="BackgroundTextureRect" type="TextureRect" parent="Control"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
expand_mode = 1
stretch_mode = 5
[node name="VBoxContainer" type="VBoxContainer" parent="Control"]
layout_mode = 0
anchor_top = 0.5
anchor_right = 1.0
anchor_bottom = 0.5
offset_left = 30.0
offset_top = -23.0
offset_right = -30.0
offset_bottom = 98.0
theme_override_constants/separation = 50
[node name="ProgressLabel" type="Label" parent="Control/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Loading..."
horizontal_alignment = 1
[node name="ProgressBar" type="ProgressBar" parent="Control/VBoxContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(0, 50)
layout_mode = 2
max_value = 1.0
[node name="ErrorMessage" type="AcceptDialog" parent="Control"]
unique_name_in_owner = true
title = "Loading Error"
initial_position = 2
size = Vector2i(360, 100)
[node name="StalledMessage" type="ConfirmationDialog" parent="Control"]
unique_name_in_owner = true
title = "Loading Stalled"
initial_position = 2
size = Vector2i(360, 100)
ok_button_text = "Try Waiting"
cancel_button_text = "Reload"
[node name="LoadingTimer" type="Timer" parent="."]
unique_name_in_owner = true
one_shot = true
autostart = true
[connection signal="confirmed" from="Control/ErrorMessage" to="." method="_on_error_message_confirmed"]
[connection signal="canceled" from="Control/StalledMessage" to="." method="_on_confirmation_dialog_canceled"]
[connection signal="confirmed" from="Control/StalledMessage" to="." method="_on_confirmation_dialog_confirmed"]
[connection signal="timeout" from="LoadingTimer" to="." method="_on_loading_timer_timeout"]