From 9dfa0b1ec74cbeb5a317ab82594381619f9a22ab Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Mon, 8 Jul 2024 16:55:53 +0930 Subject: [PATCH] Make hot reloading ROMs actually work on the web build with battle_sprites --- scripts/loaders/RomLoader.gd | 9 +++++++-- scripts/loaders/SpriteLoader.gd | 25 ++++++++++++++++++++----- scripts/loaders/StringLoader.gd | 4 +++- test/battle_sprites.gd | 3 ++- widgets/FileSelect.gd | 6 ++++-- widgets/FileSelectWeb.gd | 6 ++++-- 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/scripts/loaders/RomLoader.gd b/scripts/loaders/RomLoader.gd index c730839..e9230fb 100644 --- a/scripts/loaders/RomLoader.gd +++ b/scripts/loaders/RomLoader.gd @@ -69,7 +69,9 @@ func _on_loader_loading_stage_updated(stage: String, loader: String) -> void: #print(Time.get_time_string_from_system() + ' ' + output) print('@%dms - %s' % [Time.get_ticks_msec() - load_start_tick, output]) emit_signal('loading_stage_updated', output) - yield(get_tree(), 'idle_frame') + var scenetree := get_tree() + if scenetree: + yield(scenetree, 'idle_frame') func _load_snes_audio(data_and_buffer: Array): yield(_on_loader_loading_stage_updated('Loading sound samples and music data', 'SoundLoader'), 'completed') @@ -91,8 +93,10 @@ func load_snes_rom_from_bytes(bytes: PoolByteArray) -> void: else: yield(self._load_snes_audio([self.snes_data, self.snes_buffer]), 'completed') 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') + + SpriteLoader.reset() + yield(_on_loader_loading_stage_updated('Loading sprites', 'SpriteLoader'), 'completed') SpriteLoader.load_from_structs(self.snes_data) yield(_on_loader_loading_stage_updated('Loading enemy battle sprites', 'SpriteLoader'), 'completed') @@ -141,6 +145,7 @@ func _ready(): STRUCT.parse_struct_definitions_from_tsv_filename('res://data/5/structs/SNES_save.tsv', structdefs) STRUCT.parse_struct_definitions_from_tsv_filename('res://data/5/structs/SNES.tsv', structdefs) var _error := psx_productcode_regex.compile('(S[A-Z]{3}_\\d{3}\\.\\d{2});(\\d)') + StringLoader.connect('loading_stage_updated', self, '_on_loader_loading_stage_updated', ['StringLoader']) # Debugging breakpoint pass diff --git a/scripts/loaders/SpriteLoader.gd b/scripts/loaders/SpriteLoader.gd index 39b69a9..946e228 100644 --- a/scripts/loaders/SpriteLoader.gd +++ b/scripts/loaders/SpriteLoader.gd @@ -44,6 +44,11 @@ var font_atlas_image: Image var font_atlas_texture: ImageTexture var font: BitmapFont +var strip_images = [] +var strip_textures = [] + +var battle_backgrounds := [] + var character_status_palette_replacements = { 'poison': {4: '$7EDB = #DEB5FF', 8: '$4DD3 = #9C739C'}, # Also kneel 'zombie': {3: '$7FFF = #FFFFFF', 4: '$3AF5 = #ADBD73', 8: '$3210 = #848463'}, # Also kneel in menu @@ -318,7 +323,6 @@ class BattleBackground: var tile_atlas_images: Array var tile_atlas_texs: Array -var battle_backgrounds := [] func load_battle_bgs(data: Dictionary, buffer: StreamPeerBuffer): var bg_palettes = data.battle_background_palettes for map in snes_battle_bgs.get_all_battle_background_tilemaps(buffer, data): @@ -516,7 +520,18 @@ func load_gba_rom(filename: String): # character_battle_sprite_palette_stone_texture = texture_from_image(generate_palette(rom, offset_Character_Battle_Sprite_Stone_Palette)) -var strip_images = [] -var strip_textures = [] -# func _ready(): - #pass +func reset() -> void: + # Clean out old arrays in case we are loading another ROM + worldmap_palette_imgs.clear() + worldmap_palette_textures.clear() + worldmap_tile_individual_imgs.clear() + worldmap_tile_atlas_textures.clear() + worldmap_block_tile_ids.clear() + worldmap_block_individual_imgs.clear() + worldmap_block_individual_textures.clear() + worldmap_block_atlas_imgs.clear() + worldmap_block_atlas_textures.clear() + battle_backgrounds.clear() + character_battle_sprite_palette_textures.clear() + strip_images.clear() + strip_textures.clear() diff --git a/scripts/loaders/StringLoader.gd b/scripts/loaders/StringLoader.gd index cc7800d..7215318 100644 --- a/scripts/loaders/StringLoader.gd +++ b/scripts/loaders/StringLoader.gd @@ -102,7 +102,9 @@ func load_snes_rom(buffer: StreamPeerBuffer, is_RPGe: bool = false) -> void: emit_signal('loading_stage_updated', 'load_snes_rom called') for block_name in SNES_block_addresses: emit_signal('loading_stage_updated', 'Loading string block "%s"'%block_name) - yield(get_tree(), 'idle_frame') + var scenetree := get_tree() + if scenetree: + yield(scenetree, 'idle_frame') self._load_block(block_name, buffer, is_RPGe) func get_ability_name(id: int) -> String: diff --git a/test/battle_sprites.gd b/test/battle_sprites.gd index 82b3ea0..93d389c 100644 --- a/test/battle_sprites.gd +++ b/test/battle_sprites.gd @@ -9,7 +9,8 @@ func initialize() -> void: # Clean up any existing for scn in PCs: remove_child(scn) - PCs = [] + PCs.clear() + print('Initializing battle sprites debug scene') # Make new sprites var strips = len(SpriteLoader.strip_textures) # * 4 / 5 diff --git a/widgets/FileSelect.gd b/widgets/FileSelect.gd index 28dc297..14e4732 100644 --- a/widgets/FileSelect.gd +++ b/widgets/FileSelect.gd @@ -118,10 +118,12 @@ func load_file(filename: String, full_path: bool = false): var ext := full_filename.rsplit('/', true, 1)[1].rsplit('.', true, 1)[1].to_lower() match ext: 'sfc', 'smc': - if current_mode == SELECT_ROM: + if true: # current_mode == SELECT_ROM: splash_filter.visible = true splash_label.text = 'Loading ROM: %s'%full_filename - yield(get_tree(), 'idle_frame') + var scenetree := get_tree() + if scenetree: + yield(scenetree, 'idle_frame') RomLoader.load_snes_rom(full_filename) 'srm': if current_mode == SELECT_ROM: diff --git a/widgets/FileSelectWeb.gd b/widgets/FileSelectWeb.gd index e455feb..175b940 100644 --- a/widgets/FileSelectWeb.gd +++ b/widgets/FileSelectWeb.gd @@ -75,10 +75,12 @@ func load_file(entry: String): var ext = entry.rsplit('.', true, 1)[1].to_lower() match ext: 'sfc', 'smc': - if current_mode == SELECT_ROM: + if true: # current_mode == SELECT_ROM: splash_filter.visible = true splash_label.text = 'Loading ROM: %s'%filename - yield(get_tree(), 'idle_frame') + var scenetree := get_tree() + if scenetree: + yield(scenetree, 'idle_frame') RomLoader.load_snes_rom_from_bytes(uploaded_files[entry]) 'srm': if current_mode != SELECT_ROM: