fix: castle warp gate
fix: potential swamola issue fix
This commit is contained in:
2
Main.py
2
Main.py
@@ -38,7 +38,7 @@ from source.enemizer.DamageTables import DamageTable
|
|||||||
from source.enemizer.Enemizer import randomize_enemies
|
from source.enemizer.Enemizer import randomize_enemies
|
||||||
from source.rom.DataTables import init_data_tables
|
from source.rom.DataTables import init_data_tables
|
||||||
|
|
||||||
version_number = '1.4.1.3'
|
version_number = '1.4.1.4'
|
||||||
version_branch = '-u'
|
version_branch = '-u'
|
||||||
__version__ = f'{version_number}{version_branch}'
|
__version__ = f'{version_number}{version_branch}'
|
||||||
|
|
||||||
|
|||||||
@@ -141,6 +141,9 @@ These are now independent of retro mode and have three options: None, Random, an
|
|||||||
|
|
||||||
# Bug Fixes and Notes
|
# Bug Fixes and Notes
|
||||||
|
|
||||||
|
* 1.4.1.4u
|
||||||
|
* Inverted: Castle warp should not appear after defeating Aga 1
|
||||||
|
* Enemzier: Fixed a crash with cached sprites Zora/Swamola
|
||||||
* 1.4.1.3v
|
* 1.4.1.3v
|
||||||
* Enemizer: Raven/Murderdactyls using the correct damage table
|
* Enemizer: Raven/Murderdactyls using the correct damage table
|
||||||
* Enemzier: Boss drops only center when boss shuffle is on
|
* Enemzier: Boss drops only center when boss shuffle is on
|
||||||
|
|||||||
3
Rom.py
3
Rom.py
@@ -42,7 +42,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings
|
|||||||
|
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||||
RANDOMIZERBASEHASH = 'd63715be60a548e080dc84ae588307e5'
|
RANDOMIZERBASEHASH = 'd47bab6e3c7de77295fcdc0b0ab84a9d'
|
||||||
|
|
||||||
|
|
||||||
class JsonRom(object):
|
class JsonRom(object):
|
||||||
@@ -2474,7 +2474,6 @@ def set_inverted_mode(world, player, rom):
|
|||||||
rom.write_byte(snes_to_pc(0x00D0e8), 0xE0)
|
rom.write_byte(snes_to_pc(0x00D0e8), 0xE0)
|
||||||
rom.write_byte(snes_to_pc(0x00D1c7), 0x00)
|
rom.write_byte(snes_to_pc(0x00D1c7), 0x00)
|
||||||
write_int16(rom, snes_to_pc(0x1BE8DA), 0x39AD)
|
write_int16(rom, snes_to_pc(0x1BE8DA), 0x39AD)
|
||||||
rom.write_byte(0xF6E58, 0x80) # no whirlpool under castle gate
|
|
||||||
rom.write_bytes(0x0086E, [0x5C, 0x00, 0xA0, 0xA1]) # TR tail
|
rom.write_bytes(0x0086E, [0x5C, 0x00, 0xA0, 0xA1]) # TR tail
|
||||||
rom.write_bytes(snes_to_pc(0x1BC67A), [0x2E, 0x0B, 0x82]) # add warps under rocks
|
rom.write_bytes(snes_to_pc(0x1BC67A), [0x2E, 0x0B, 0x82]) # add warps under rocks
|
||||||
rom.write_bytes(snes_to_pc(0x1BC81E), [0x94, 0x1D, 0x82])
|
rom.write_bytes(snes_to_pc(0x1BC81E), [0x94, 0x1D, 0x82])
|
||||||
|
|||||||
Binary file not shown.
@@ -521,7 +521,7 @@ def init_vanilla_sprites_ow():
|
|||||||
create_sprite(0x1a, EnemySprite.GreenGuard, 0x0C, 0x0E, '', 0x09D0A3)
|
create_sprite(0x1a, EnemySprite.GreenGuard, 0x0C, 0x0E, '', 0x09D0A3)
|
||||||
create_sprite(0x1a, EnemySprite.Faerie, 0x0D, 0x11, '', 0x09D0A6, fix=True)
|
create_sprite(0x1a, EnemySprite.Faerie, 0x0D, 0x11, '', 0x09D0A6, fix=True)
|
||||||
create_sprite(0x1a, EnemySprite.BlueRupee, 0x17, 0x17, '', 0x09D0A9)
|
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
|
create_sprite(0x1a, EnemySprite.RedSpearGuard, 0x0F, 0x18, '', 0x09D0AC) # was 0x09D0AF
|
||||||
# Screen1B_1:
|
# Screen1B_1:
|
||||||
create_sprite(0x1b, EnemySprite.Wiseman, 0x19, 0x12, '', 0x09D0B0)
|
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, 0x0F, 0x08, '', 0x09D418)
|
||||||
create_sprite(0xaa, EnemySprite.BlueGuard, 0x0C, 0x0E, '', 0x09D41B)
|
create_sprite(0xaa, EnemySprite.BlueGuard, 0x0C, 0x0E, '', 0x09D41B)
|
||||||
create_sprite(0xaa, EnemySprite.Faerie, 0x0D, 0x11, '', 0x09D41E, fix=True)
|
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
|
create_sprite(0xaa, EnemySprite.UsainBolt, 0x0F, 0x18, '', 0x09D421) # was 0x09D424
|
||||||
# Screen1B_2:
|
# Screen1B_2:
|
||||||
create_sprite(0xab, EnemySprite.Wiseman, 0x19, 0x12, '', 0x09D425)
|
create_sprite(0xab, EnemySprite.Wiseman, 0x19, 0x12, '', 0x09D425)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from collections import defaultdict
|
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 EnemyTable, init_vanilla_sprites, vanilla_sprites, init_enemy_stats, EnemySprite
|
||||||
from source.dungeon.EnemyList import sprite_translation
|
from source.dungeon.EnemyList import sprite_translation
|
||||||
@@ -94,9 +94,7 @@ class DataTables:
|
|||||||
# _00FA81 is LW normal
|
# _00FA81 is LW normal
|
||||||
# _00FAC1 is LW post-aga
|
# _00FAC1 is LW post-aga
|
||||||
# _00FB01 is DW
|
# _00FB01 is DW
|
||||||
for area, sprite_list in self.ow_enemy_table.items():
|
self.write_ow_sprite_data_to_rom(rom)
|
||||||
for sprite in sprite_list:
|
|
||||||
rom.write_bytes(snes_to_pc(sprite.original_address), sprite.sprite_data_ow())
|
|
||||||
for sprite, stats in self.enemy_stats.items():
|
for sprite, stats in self.enemy_stats.items():
|
||||||
# write health to rom
|
# write health to rom
|
||||||
if stats.health is not None:
|
if stats.health is not None:
|
||||||
@@ -132,6 +130,42 @@ class DataTables:
|
|||||||
0x0F, 0x01, 0x0F, 0x0F, 0x11, 0x0F, 0x0F, 0x03
|
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 = {
|
special_health_table = {
|
||||||
EnemySprite.Octorok: (0x068F76, 0x068F77),
|
EnemySprite.Octorok: (0x068F76, 0x068F77),
|
||||||
|
|||||||
Reference in New Issue
Block a user