From cb21e1e4e949308a0b594764c7df2ffca33fff57 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Mon, 22 Dec 2025 08:31:38 -0600 Subject: [PATCH] Fixed issue where OW sprite list data collides with following UW sprite pointer table --- source/dungeon/EnemyList.py | 9 +++++++-- source/rom/DataTables.py | 29 +++++++++++++++++------------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/source/dungeon/EnemyList.py b/source/dungeon/EnemyList.py index 32909d37..90ee3fba 100644 --- a/source/dungeon/EnemyList.py +++ b/source/dungeon/EnemyList.py @@ -2116,8 +2116,13 @@ class EnemyTable: self.room_map = defaultdict(list) self.special_bitmasks = None - def write_sprite_data_to_rom(self, rom): - pointer_address = snes_to_pc(0x09D62E) + def write_sprite_data_to_rom(self, rom, pointer_table): + ow_data_end = pointer_table['ow_sprites'][0] + pointer_table['ow_sprites'][1] + if ow_data_end > pointer_table['uw_sprites'][2]: + # moving pointer table down + pointer_table['uw_sprites'][2] = ow_data_end + rom.write_bytes(snes_to_pc(pointer_table['uw_sprites'][3]), int16_as_bytes(ow_data_end & 0xFFFF)) + pointer_address = snes_to_pc(pointer_table['uw_sprites'][2]) data_pointer = snes_to_pc(0x288000) empty_pointer = pc_to_snes(data_pointer) & 0xFFFF rom.write_bytes(data_pointer, [0x00, 0xff]) diff --git a/source/rom/DataTables.py b/source/rom/DataTables.py index f082a4f5..2ecfc518 100644 --- a/source/rom/DataTables.py +++ b/source/rom/DataTables.py @@ -29,6 +29,11 @@ class DataTables: self.ow_enemy_table = None self.pot_secret_table = None self.overworld_sprite_sheets = None + self.pointer_addresses = { + # table: [data_start, data_size, pointer_table, references] + 'ow_sprites': [ 0x09CB41, None, (0x09C881, 0x09C901, 0x09CA21), None ], + 'uw_sprites': [ 0x09D92E, None, 0x09D62E, 0x09C298 ], + } # associated data self.sprite_requirements = None @@ -77,13 +82,6 @@ class DataTables: # bank 0A uses 372A bytes # bank 1F uses 77CE bytes: total is about a bank and a half # probably should reuse bank 1F if writing all the rooms out - for sheet in self.sprite_sheets.values(): - sheet.write_to_rom(rom, snes_to_pc(0x00DB97)) # bank 00, SheetsTable_AA3 - if self.uw_enemy_table.size() > 0x2800: - raise Exception('Sprite table is too big for current area') - self.uw_enemy_table.write_sprite_data_to_rom(rom) - self.uw_enemy_table.check_special_bitmasks_size() - self.uw_enemy_table.write_special_bitmask_table(rom) for area_id, sheet in self.overworld_sprite_sheets.items(): if area_id in [0x80, 0x81]: offset = area_id - 0x80 # 02E575 for special areas? @@ -95,7 +93,14 @@ class DataTables: # _00FAC1 is LW post-aga # _00FB01 is DW # _00FA41 is rain state + for sheet in self.sprite_sheets.values(): + sheet.write_to_rom(rom, snes_to_pc(0x00DB97)) # bank 00, SheetsTable_AA3 self.write_ow_sprite_data_to_rom(rom) + if self.uw_enemy_table.size() > 0x2800: + raise Exception('Sprite table is too big for current area') + self.uw_enemy_table.write_sprite_data_to_rom(rom, self.pointer_addresses) + self.uw_enemy_table.check_special_bitmasks_size() + self.uw_enemy_table.write_special_bitmask_table(rom) for sprite, stats in self.enemy_stats.items(): # write health to rom if stats.health is not None: @@ -133,13 +138,13 @@ class DataTables: def write_ow_sprite_data_to_rom(self, rom): # calculate how big this table is going to be? - # bytes = sum(1+len(x)*3 for x in self.ow_enemy_table.values() if len(x) > 0)+1 + bytes = sum(1+len(x)*3 for x in self.ow_enemy_table.values() if len(x) > 0)+1 + self.pointer_addresses['ow_sprites'][1] = bytes # ending_byte = 0x09CB3B + bytes - max_per_state = {0: 0x40, 1: 0x90, 2: 0x8B} # dropped max on state 2 to steal space for a couple extra sprites (Murahdahla, extra tutorial guard) + max_per_state = {0: 0x40, 1: 0x90, 2: 0x90} - pointer_address = snes_to_pc(0x09C881) - # currently borrowed 10 bytes, used 9 (2xMurah + TutorialGuard) - data_pointer = snes_to_pc(0x09CB38) # was originally 0x09CB41 - stealing space for a couple extra sprites (Murahdahla, extra tutorial guard) + pointer_address = snes_to_pc(self.pointer_addresses['ow_sprites'][2][0]) + data_pointer = snes_to_pc(self.pointer_addresses['ow_sprites'][0]) empty_pointer = pc_to_snes(data_pointer) & 0xFFFF rom.write_byte(data_pointer, 0xff) cached_dark_world = {}