fix: castle warp gate

fix: potential swamola issue fix
This commit is contained in:
aerinon
2024-01-26 13:48:34 -07:00
parent ba6f9e0493
commit a6e96720a3
6 changed files with 45 additions and 9 deletions

View File

@@ -521,7 +521,7 @@ def init_vanilla_sprites_ow():
create_sprite(0x1a, EnemySprite.GreenGuard, 0x0C, 0x0E, '', 0x09D0A3)
create_sprite(0x1a, EnemySprite.Faerie, 0x0D, 0x11, '', 0x09D0A6, fix=True)
create_sprite(0x1a, EnemySprite.BlueRupee, 0x17, 0x17, '', 0x09D0A9)
# create_sprite(0x1a, EnemySprite.SmallHeart, 0x0A, 0x18, '', 0x09D0AC)
create_sprite(0x1a, EnemySprite.SmallHeart, 0x0A, 0x18, '', 0x09D0AC)
create_sprite(0x1a, EnemySprite.RedSpearGuard, 0x0F, 0x18, '', 0x09D0AC) # was 0x09D0AF
# Screen1B_1:
create_sprite(0x1b, EnemySprite.Wiseman, 0x19, 0x12, '', 0x09D0B0)
@@ -843,7 +843,7 @@ def init_vanilla_sprites_ow():
create_sprite(0xaa, EnemySprite.BlueGuard, 0x0F, 0x08, '', 0x09D418)
create_sprite(0xaa, EnemySprite.BlueGuard, 0x0C, 0x0E, '', 0x09D41B)
create_sprite(0xaa, EnemySprite.Faerie, 0x0D, 0x11, '', 0x09D41E, fix=True)
# create_sprite(0xaa, EnemySprite.SmallHeart, 0x0A, 0x18, '', 0x09D421)
create_sprite(0xaa, EnemySprite.SmallHeart, 0x0A, 0x18, '', 0x09D421)
create_sprite(0xaa, EnemySprite.UsainBolt, 0x0F, 0x18, '', 0x09D421) # was 0x09D424
# Screen1B_2:
create_sprite(0xab, EnemySprite.Wiseman, 0x19, 0x12, '', 0x09D425)

View File

@@ -1,6 +1,6 @@
from collections import defaultdict
from Utils import snes_to_pc, int24_as_bytes, int16_as_bytes, load_cached_yaml
from Utils import snes_to_pc, int24_as_bytes, int16_as_bytes, load_cached_yaml, pc_to_snes
from source.dungeon.EnemyList import EnemyTable, init_vanilla_sprites, vanilla_sprites, init_enemy_stats, EnemySprite
from source.dungeon.EnemyList import sprite_translation
@@ -94,9 +94,7 @@ class DataTables:
# _00FA81 is LW normal
# _00FAC1 is LW post-aga
# _00FB01 is DW
for area, sprite_list in self.ow_enemy_table.items():
for sprite in sprite_list:
rom.write_bytes(snes_to_pc(sprite.original_address), sprite.sprite_data_ow())
self.write_ow_sprite_data_to_rom(rom)
for sprite, stats in self.enemy_stats.items():
# write health to rom
if stats.health is not None:
@@ -132,6 +130,42 @@ class DataTables:
0x0F, 0x01, 0x0F, 0x0F, 0x11, 0x0F, 0x0F, 0x03
])
def write_ow_sprite_data_to_rom(self, rom):
max_per_state = {0: 0x40, 1: 0x90, 2: 0x8D} # dropped max on state 2 to steal space for a couple extra sprites (Murahdahla)
pointer_address = snes_to_pc(0x09C881)
data_pointer = snes_to_pc(0x09CB3B) # was originally 0x09CB41 - stealing space for a couple extra sprites (Murahdahla)
empty_pointer = pc_to_snes(data_pointer) & 0xFFFF
rom.write_byte(data_pointer, 0xff)
cached_dark_world = {}
data_pointer += 1
for state in range(0, 3):
if state > 0: # move pointer to next section
pointer_address += max_per_state[state-1] * 2
for screen in range(0, max_per_state[state]):
internal_screen_id = screen
if state == 0:
internal_screen_id += 0x200
if state == 2 and screen < 0x40:
internal_screen_id += 0x90
if internal_screen_id not in self.ow_enemy_table: # has no sprites
rom.write_bytes(pointer_address + screen * 2, int16_as_bytes(empty_pointer))
else:
if state == 2 and screen >= 0x40: # state 2 uses state 1 pointer for screens >= 0x40
rom.write_bytes(pointer_address + screen * 2, cached_dark_world[screen])
# the sprites are already written out
else:
data_address = pc_to_snes(data_pointer) & 0xFFFF
ref = int16_as_bytes(data_address)
if screen >= 40:
cached_dark_world[screen] = ref
rom.write_bytes(pointer_address + screen * 2, ref)
for sprite in self.ow_enemy_table[internal_screen_id]:
data = sprite.sprite_data()
rom.write_bytes(data_pointer, data)
data_pointer += len(data)
rom.write_byte(data_pointer, 0xff)
data_pointer += 1
special_health_table = {
EnemySprite.Octorok: (0x068F76, 0x068F77),