Add loading screen feedback
now that dialog loading is uncomfortably long
This commit is contained in:
parent
fae527ec01
commit
7a57c6729d
|
@ -1,8 +1,10 @@
|
||||||
extends Node
|
extends Node
|
||||||
#warning-ignore-all:return_value_discarded
|
#warning-ignore-all:return_value_discarded
|
||||||
|
signal loading_stage_updated(stage) # String
|
||||||
signal rom_loaded
|
signal rom_loaded
|
||||||
|
|
||||||
|
const THREADED_LOADING := false
|
||||||
|
|
||||||
const STRUCT := preload('res://scripts/struct.gd')
|
const STRUCT := preload('res://scripts/struct.gd')
|
||||||
const STRUCT_SNES := preload('res://scripts/loaders/snes/structs.gd')
|
const STRUCT_SNES := preload('res://scripts/loaders/snes/structs.gd')
|
||||||
var structdefs := {}
|
var structdefs := {}
|
||||||
|
@ -19,7 +21,7 @@ var rom_snes := File.new()
|
||||||
var snes_data := {}
|
var snes_data := {}
|
||||||
var snes_bytes: PoolByteArray
|
var snes_bytes: PoolByteArray
|
||||||
var snes_buffer: StreamPeerBuffer
|
var snes_buffer: StreamPeerBuffer
|
||||||
#var thread := Thread.new()
|
var thread: Thread
|
||||||
|
|
||||||
func load_snes_structs(buffer: StreamPeerBuffer) -> Dictionary:
|
func load_snes_structs(buffer: StreamPeerBuffer) -> Dictionary:
|
||||||
var data := {}
|
var data := {}
|
||||||
|
@ -61,7 +63,14 @@ func load_snes_structs(buffer: StreamPeerBuffer) -> Dictionary:
|
||||||
data.job_levels.append(ability_list)
|
data.job_levels.append(ability_list)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
func load_snes_audio_thread(data_and_buffer: Array):
|
func _on_loader_loading_stage_updated(stage: String, loader: String) -> void:
|
||||||
|
var output := '%s: %s' % [loader, stage]
|
||||||
|
print(output)
|
||||||
|
emit_signal('loading_stage_updated', output)
|
||||||
|
yield(get_tree(), 'idle_frame')
|
||||||
|
|
||||||
|
func _load_snes_audio(data_and_buffer: Array):
|
||||||
|
yield(_on_loader_loading_stage_updated('Loading sound samples and music data', 'SoundLoader'), 'completed')
|
||||||
SoundLoader.parse_rom(data_and_buffer[0], data_and_buffer[1])
|
SoundLoader.parse_rom(data_and_buffer[0], data_and_buffer[1])
|
||||||
|
|
||||||
func load_snes_rom_from_bytes(bytes: PoolByteArray) -> void:
|
func load_snes_rom_from_bytes(bytes: PoolByteArray) -> void:
|
||||||
|
@ -71,16 +80,25 @@ func load_snes_rom_from_bytes(bytes: PoolByteArray) -> void:
|
||||||
self.snes_buffer = StreamPeerBuffer.new()
|
self.snes_buffer = StreamPeerBuffer.new()
|
||||||
self.snes_buffer.data_array = bytes
|
self.snes_buffer.data_array = bytes
|
||||||
|
|
||||||
|
yield(_on_loader_loading_stage_updated('Loading struct definitions', 'StructLoader'), 'completed')
|
||||||
self.snes_data = load_snes_structs(self.snes_buffer)
|
self.snes_data = load_snes_structs(self.snes_buffer)
|
||||||
#print(snes_data.job_levels)
|
if THREADED_LOADING:
|
||||||
# Give this its own buffer if threaded, avoid file pointer conflicts
|
# Give this its own buffer if threaded, avoid file pointer conflicts
|
||||||
self.load_snes_audio_thread([self.snes_data, self.snes_buffer])
|
var _thread_error = thread.start(self, '_load_snes_audio', [self.snes_data, self.snes_buffer.duplicate()])
|
||||||
# var _thread_error = thread.start(self, 'load_snes_audio_thread', [self.snes_data, self.snes_buffer.duplicate()])
|
else:
|
||||||
StringLoader.load_snes_rom(self.snes_buffer, true)
|
self._load_snes_audio([self.snes_data, self.snes_buffer])
|
||||||
|
yield(_on_loader_loading_stage_updated('Loading strings', 'StringLoader'), 'completed')
|
||||||
|
StringLoader.connect('loading_stage_updated', self, '_on_loader_loading_stage_updated', ['StringLoader'])
|
||||||
|
yield(StringLoader.load_snes_rom(self.snes_buffer, true), 'completed')
|
||||||
|
yield(_on_loader_loading_stage_updated('Loading sprites', 'SpriteLoader'), 'completed')
|
||||||
SpriteLoader.load_from_structs(self.snes_data)
|
SpriteLoader.load_from_structs(self.snes_data)
|
||||||
|
yield(_on_loader_loading_stage_updated('Loading enemy battle sprites', 'SpriteLoader'), 'completed')
|
||||||
SpriteLoader.load_enemy_battle_sprites(self.snes_data, self.snes_buffer)
|
SpriteLoader.load_enemy_battle_sprites(self.snes_data, self.snes_buffer)
|
||||||
|
yield(_on_loader_loading_stage_updated('Loading battle backgrounds', 'SpriteLoader'), 'completed')
|
||||||
SpriteLoader.load_battle_bgs(self.snes_data, self.snes_buffer)
|
SpriteLoader.load_battle_bgs(self.snes_data, self.snes_buffer)
|
||||||
|
yield(_on_loader_loading_stage_updated('Loading map data', 'MapLoader'), 'completed')
|
||||||
MapLoader.load_snes_rom(self.snes_buffer)
|
MapLoader.load_snes_rom(self.snes_buffer)
|
||||||
|
yield(_on_loader_loading_stage_updated('Finished loading!', 'RomLoader'), 'completed')
|
||||||
emit_signal('rom_loaded')
|
emit_signal('rom_loaded')
|
||||||
|
|
||||||
func load_snes_rom(filename: String) -> void:
|
func load_snes_rom(filename: String) -> void:
|
||||||
|
@ -111,6 +129,8 @@ func load_psx_image(filename: String):
|
||||||
|
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
|
if THREADED_LOADING:
|
||||||
|
thread = Thread.new()
|
||||||
structdefs.merge(STRUCT.get_base_structarraytypes())
|
structdefs.merge(STRUCT.get_base_structarraytypes())
|
||||||
structdefs.merge(STRUCT_SNES.get_structtypes())
|
structdefs.merge(STRUCT_SNES.get_structtypes())
|
||||||
STRUCT.parse_struct_definitions_from_tsv_filename('res://data/SNES_save.tsv', structdefs)
|
STRUCT.parse_struct_definitions_from_tsv_filename('res://data/SNES_save.tsv', structdefs)
|
||||||
|
@ -121,4 +141,5 @@ func _ready():
|
||||||
|
|
||||||
func _exit_tree() -> void:
|
func _exit_tree() -> void:
|
||||||
pass
|
pass
|
||||||
# thread.wait_to_finish()
|
if THREADED_LOADING:
|
||||||
|
thread.wait_to_finish()
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
extends Node
|
extends Node
|
||||||
|
signal loading_stage_updated(stage) # String
|
||||||
|
|
||||||
const ff5_dialog := preload('res://scripts/loaders/snes/ff5_dialog.gd')
|
const ff5_dialog := preload('res://scripts/loaders/snes/ff5_dialog.gd')
|
||||||
|
|
||||||
var SNES_block_addresses := Common.load_tsv('res://data/string_blocks.tsv')
|
var SNES_block_addresses := Common.load_tsv('res://data/string_blocks.tsv')
|
||||||
|
@ -98,6 +100,8 @@ func _load_block(block_name: String, buffer: StreamPeerBuffer, is_RPGe: bool = f
|
||||||
|
|
||||||
func load_snes_rom(buffer: StreamPeerBuffer, is_RPGe: bool = false) -> void:
|
func load_snes_rom(buffer: StreamPeerBuffer, is_RPGe: bool = false) -> void:
|
||||||
for block_name in SNES_block_addresses:
|
for block_name in SNES_block_addresses:
|
||||||
|
emit_signal('loading_stage_updated', 'Loading string block "%s"'%block_name)
|
||||||
|
yield(get_tree(), 'idle_frame')
|
||||||
self._load_block(block_name, buffer, is_RPGe)
|
self._load_block(block_name, buffer, is_RPGe)
|
||||||
|
|
||||||
func get_ability_name(id: int) -> String:
|
func get_ability_name(id: int) -> String:
|
||||||
|
|
|
@ -31,6 +31,8 @@ onready var lbl_filesize_header: Label = $'%lbl_filesize_header'
|
||||||
onready var lbl_filesize_content: Label = $'%lbl_filesize_content'
|
onready var lbl_filesize_content: Label = $'%lbl_filesize_content'
|
||||||
onready var lbl_fileinfo_header: Label = $'%lbl_fileinfo_header'
|
onready var lbl_fileinfo_header: Label = $'%lbl_fileinfo_header'
|
||||||
onready var lbl_fileinfo_content: Label = $'%lbl_fileinfo_content'
|
onready var lbl_fileinfo_content: Label = $'%lbl_fileinfo_content'
|
||||||
|
onready var splash_filter := $'%splash_filter'
|
||||||
|
onready var splash_label := $'%splash_label'
|
||||||
const inactive_modulate_color := Color(0.5, 0.5, 0.5)
|
const inactive_modulate_color := Color(0.5, 0.5, 0.5)
|
||||||
const active_modulate_color := Color.white
|
const active_modulate_color := Color.white
|
||||||
var last_dir := ''
|
var last_dir := ''
|
||||||
|
@ -115,6 +117,9 @@ func load_file(entry: String):
|
||||||
match ext:
|
match ext:
|
||||||
'sfc', 'smc':
|
'sfc', 'smc':
|
||||||
if current_mode == SELECT_ROM:
|
if current_mode == SELECT_ROM:
|
||||||
|
splash_filter.visible = true
|
||||||
|
splash_label.text = 'Loading ROM: %s'%filename
|
||||||
|
yield(get_tree(), 'idle_frame')
|
||||||
RomLoader.load_snes_rom(filename)
|
RomLoader.load_snes_rom(filename)
|
||||||
'srm':
|
'srm':
|
||||||
if current_mode == SELECT_ROM:
|
if current_mode == SELECT_ROM:
|
||||||
|
@ -214,6 +219,7 @@ func _ready() -> void:
|
||||||
btn_load.connect('pressed', self, 'activate_current_entry')
|
btn_load.connect('pressed', self, 'activate_current_entry')
|
||||||
btn_debug.connect('pressed', self, '_on_debug_pressed')
|
btn_debug.connect('pressed', self, '_on_debug_pressed')
|
||||||
RomLoader.connect('rom_loaded', self, '_on_rom_loaded')
|
RomLoader.connect('rom_loaded', self, '_on_rom_loaded')
|
||||||
|
RomLoader.connect('loading_stage_updated', self, '_on_loading_stage_updated')
|
||||||
print(ProjectSettings.globalize_path('user://'))
|
print(ProjectSettings.globalize_path('user://'))
|
||||||
print(ProjectSettings.globalize_path(dir.get_current_dir()))
|
print(ProjectSettings.globalize_path(dir.get_current_dir()))
|
||||||
|
|
||||||
|
@ -238,7 +244,11 @@ func _on_ItemList_item_activated(index: int) -> void:
|
||||||
func _on_ItemList_item_selected(index: int) -> void:
|
func _on_ItemList_item_selected(index: int) -> void:
|
||||||
view_entry(itemlist.get_item_text(index), index)
|
view_entry(itemlist.get_item_text(index), index)
|
||||||
|
|
||||||
|
func _on_loading_stage_updated(stage: String) -> void:
|
||||||
|
splash_label.text += '\n' + stage
|
||||||
|
|
||||||
func _on_rom_loaded() -> void:
|
func _on_rom_loaded() -> void:
|
||||||
|
splash_filter.visible = false
|
||||||
_set_mode(SELECT_SAVE)
|
_set_mode(SELECT_SAVE)
|
||||||
|
|
||||||
func _on_debug_pressed() -> void:
|
func _on_debug_pressed() -> void:
|
||||||
|
|
|
@ -184,5 +184,21 @@ size_flags_vertical = 8
|
||||||
disabled = true
|
disabled = true
|
||||||
text = "Debug Menu"
|
text = "Debug Menu"
|
||||||
|
|
||||||
|
[node name="splash_filter" type="ColorRect" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
visible = false
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
color = Color( 0, 0, 0, 0.627451 )
|
||||||
|
|
||||||
|
[node name="splash_label" type="Label" parent="splash_filter"]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
margin_left = 12.0
|
||||||
|
margin_top = -1000.0
|
||||||
|
margin_bottom = -12.0
|
||||||
|
valign = 2
|
||||||
|
|
||||||
[connection signal="item_activated" from="VBoxContainer/HBoxContainer/PanelContainer/ItemList" to="." method="_on_ItemList_item_activated"]
|
[connection signal="item_activated" from="VBoxContainer/HBoxContainer/PanelContainer/ItemList" to="." method="_on_ItemList_item_activated"]
|
||||||
[connection signal="item_selected" from="VBoxContainer/HBoxContainer/PanelContainer/ItemList" to="." method="_on_ItemList_item_selected"]
|
[connection signal="item_selected" from="VBoxContainer/HBoxContainer/PanelContainer/ItemList" to="." method="_on_ItemList_item_selected"]
|
||||||
|
|
|
@ -32,6 +32,8 @@ onready var lbl_filesize_header: Label = $'%lbl_filesize_header'
|
||||||
onready var lbl_filesize_content: Label = $'%lbl_filesize_content'
|
onready var lbl_filesize_content: Label = $'%lbl_filesize_content'
|
||||||
onready var lbl_fileinfo_header: Label = $'%lbl_fileinfo_header'
|
onready var lbl_fileinfo_header: Label = $'%lbl_fileinfo_header'
|
||||||
onready var lbl_fileinfo_content: Label = $'%lbl_fileinfo_content'
|
onready var lbl_fileinfo_content: Label = $'%lbl_fileinfo_content'
|
||||||
|
onready var splash_filter := $'%splash_filter'
|
||||||
|
onready var splash_label := $'%splash_label'
|
||||||
const inactive_modulate_color := Color(0.5, 0.5, 0.5)
|
const inactive_modulate_color := Color(0.5, 0.5, 0.5)
|
||||||
const active_modulate_color := Color.white
|
const active_modulate_color := Color.white
|
||||||
var last_dir := ''
|
var last_dir := ''
|
||||||
|
@ -74,6 +76,9 @@ func load_file(entry: String):
|
||||||
match ext:
|
match ext:
|
||||||
'sfc', 'smc':
|
'sfc', 'smc':
|
||||||
if current_mode == SELECT_ROM:
|
if current_mode == SELECT_ROM:
|
||||||
|
splash_filter.visible = true
|
||||||
|
splash_label.text = 'Loading ROM: %s'%filename
|
||||||
|
yield(get_tree(), 'idle_frame')
|
||||||
RomLoader.load_snes_rom_from_bytes(uploaded_files[entry])
|
RomLoader.load_snes_rom_from_bytes(uploaded_files[entry])
|
||||||
'srm':
|
'srm':
|
||||||
if current_mode != SELECT_ROM:
|
if current_mode != SELECT_ROM:
|
||||||
|
@ -148,6 +153,7 @@ func _ready() -> void:
|
||||||
btn_load.connect('pressed', self, 'activate_current_entry')
|
btn_load.connect('pressed', self, 'activate_current_entry')
|
||||||
btn_debug.connect('pressed', self, '_on_debug_pressed')
|
btn_debug.connect('pressed', self, '_on_debug_pressed')
|
||||||
RomLoader.connect('rom_loaded', self, '_on_rom_loaded')
|
RomLoader.connect('rom_loaded', self, '_on_rom_loaded')
|
||||||
|
RomLoader.connect('loading_stage_updated', self, '_on_loading_stage_updated')
|
||||||
HTML5.connect('uploaded_file', self, '_upload_file')
|
HTML5.connect('uploaded_file', self, '_upload_file')
|
||||||
|
|
||||||
func _set_mode(new_mode) -> void:
|
func _set_mode(new_mode) -> void:
|
||||||
|
@ -174,7 +180,11 @@ func _on_ItemList_item_selected(index: int) -> void:
|
||||||
func _on_btn_upload_pressed() -> void:
|
func _on_btn_upload_pressed() -> void:
|
||||||
HTML5.upload_file()
|
HTML5.upload_file()
|
||||||
|
|
||||||
|
func _on_loading_stage_updated(stage: String) -> void:
|
||||||
|
splash_label.text += '\n' + stage
|
||||||
|
|
||||||
func _on_rom_loaded() -> void:
|
func _on_rom_loaded() -> void:
|
||||||
|
splash_filter.visible = false
|
||||||
_set_mode(SELECT_SAVE)
|
_set_mode(SELECT_SAVE)
|
||||||
|
|
||||||
func _on_debug_pressed() -> void:
|
func _on_debug_pressed() -> void:
|
||||||
|
|
|
@ -195,6 +195,22 @@ size_flags_vertical = 8
|
||||||
disabled = true
|
disabled = true
|
||||||
text = "Debug Menu"
|
text = "Debug Menu"
|
||||||
|
|
||||||
|
[node name="splash_filter" type="ColorRect" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
visible = false
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
color = Color( 0, 0, 0, 0.627451 )
|
||||||
|
|
||||||
|
[node name="splash_label" type="Label" parent="splash_filter"]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
margin_left = 12.0
|
||||||
|
margin_top = -1000.0
|
||||||
|
margin_bottom = -12.0
|
||||||
|
valign = 2
|
||||||
|
|
||||||
[connection signal="pressed" from="VBoxContainer/ScrollContainer/folder_buttons/btn_upload" to="." method="_on_btn_upload_pressed"]
|
[connection signal="pressed" from="VBoxContainer/ScrollContainer/folder_buttons/btn_upload" to="." method="_on_btn_upload_pressed"]
|
||||||
[connection signal="item_activated" from="VBoxContainer/HBoxContainer/PanelContainer/ItemList" to="." method="_on_ItemList_item_activated"]
|
[connection signal="item_activated" from="VBoxContainer/HBoxContainer/PanelContainer/ItemList" to="." method="_on_ItemList_item_activated"]
|
||||||
[connection signal="item_selected" from="VBoxContainer/HBoxContainer/PanelContainer/ItemList" to="." method="_on_ItemList_item_selected"]
|
[connection signal="item_selected" from="VBoxContainer/HBoxContainer/PanelContainer/ItemList" to="." method="_on_ItemList_item_selected"]
|
||||||
|
|
Loading…
Reference in New Issue