Merge branch 'OriginOverworldShuffle' into GwaaKiwi

This commit is contained in:
2025-07-01 14:11:59 -05:00
12 changed files with 461 additions and 33 deletions

View File

@@ -75,6 +75,8 @@ def add_moldorm_to_list(sprite_list, room_id):
def add_helmasaur_king_to_list(sprite_list, room_id):
if room_id == 0x29: # preserves helma-copter behavior in skull woods
sprite_list.clear()
sprite_list.insert(0, create_sprite(room_id, EnemySprite.HelmasaurKing, 0x00, 0, 0x07, 0x06))
@@ -146,8 +148,6 @@ def boss_writes(world, player, rom):
rom.write_byte(snes_to_pc(0x368102), eye_number) # enemizer flag
rom.write_byte(snes_to_pc(0x1DDBB3), eye_number) # loop variable
data_tables = world.data_tables[player]
arrghus_can_swim = True
water_tiles_on = True
for dungeon in world.get_dungeons(player):
for level, boss in dungeon.bosses.items():
if not boss or boss.name in ['Agahnim', 'Agahnim2']:
@@ -157,10 +157,6 @@ def boss_writes(world, player, rom):
# room changes
if boss.name == 'Arrghus' and (dungeon.name != 'Swamp Palace' or level is not None):
rom.write_byte(snes_to_pc(0x0DB6BE), 0) # arrghus can stand on ground
arrghus_can_swim = False
if boss.name != 'Arrghus' and dungeon.name == 'Swamp Palace' and level is None:
remove_water_tiles(data_tables)
water_tiles_on = False
if boss.name == 'Trinexx' and (dungeon.name != 'Turtle Rock' or level is not None):
add_shell_to_boss_room(data_tables, dungeon.name, level, 0xFF2)
data_tables.room_headers[room_id].byte_0 = 0x60
@@ -181,8 +177,6 @@ def boss_writes(world, player, rom):
if not world.shuffle_followers[player]:
# maiden is deleted
del data_tables.uw_enemy_table.room_map[0x45][0]
if not arrghus_can_swim and water_tiles_on:
remove_water_tiles(data_tables)
boss_defaults = {

View File

@@ -372,7 +372,7 @@ def init_sprite_requirements():
SpriteRequirement(EnemySprite.DiggingGameNPC).affix().sub_group(1, 0x2a),
SpriteRequirement(EnemySprite.Ganon).exalt().sub_group(0, 0x21).sub_group(1, 0x41)
.sub_group(2, 0x45).sub_group(3, 0x33),
SpriteRequirement(EnemySprite.Faerie).immune(),
SpriteRequirement(EnemySprite.Faerie).ow_skip().immune(),
SpriteRequirement(EnemySprite.FakeMasterSword).immune().sub_group(3, 0x11),
SpriteRequirement(EnemySprite.MagicShopAssistant).affix().sub_group(0, 0x4b).sub_group(3, 0x5a),
SpriteRequirement(EnemySprite.SomariaPlatform).affix().sub_group(2, 0x27),

View File

@@ -114,7 +114,7 @@ def create_item_pool_config(world):
single_arrow_placement.append('Red Shield Shop - Right')
config.static_placement[player]['Single Arrow'] = single_arrow_placement
config.location_groups[player] = [
LocationGroup('Major').locs(mode_grouping['Overworld Major'] + mode_grouping['Big Chests'] + mode_grouping['Heart Containers']),
LocationGroup('Major').locs(mode_grouping['Overworld Major'] + mode_grouping['Big Chests'] + mode_grouping['Heart Containers'] + mode_grouping['Prizes']),
LocationGroup('bkhp').locs(mode_grouping['Heart Pieces']),
LocationGroup('bktrash').locs(mode_grouping['Overworld Trash'] + mode_grouping['Dungeon Trash']),
LocationGroup('bkgt').locs(mode_grouping['GT Trash'])]
@@ -129,11 +129,9 @@ def create_item_pool_config(world):
LocationGroup('Backup')
]
config.item_pool = {}
init_set = mode_grouping['Overworld Major'] + mode_grouping['Big Chests'] + mode_grouping['Heart Containers']
init_set = mode_grouping['Overworld Major'] + mode_grouping['Big Chests'] + mode_grouping['Heart Containers'] + mode_grouping['Prizes']
for player in range(1, world.players + 1):
groups = LocationGroup('Major').locs(init_set)
if world.prizeshuffle[player] != 'none':
groups.locations.extend(mode_grouping['Prizes'])
if world.bigkeyshuffle[player] != 'none':
groups.locations.extend(mode_grouping['Big Keys'])
if world.dropshuffle[player] != 'none':
@@ -167,7 +165,7 @@ def create_item_pool_config(world):
dungeon_set = (mode_grouping['Big Chests'] + mode_grouping['Dungeon Trash'] + mode_grouping['Big Keys'] +
mode_grouping['Heart Containers'] + mode_grouping['GT Trash'] + mode_grouping['Small Keys'] +
mode_grouping['Compasses'] + mode_grouping['Maps'] + mode_grouping['Key Drops'] +
mode_grouping['Pot Keys'] + mode_grouping['Big Key Drops'])
mode_grouping['Pot Keys'] + mode_grouping['Big Key Drops'] + mode_grouping['Prizes'])
dungeon_set = set(dungeon_set)
for loc in world.get_locations():
if loc.parent_region.dungeon and loc.type in [LocationType.Pot, LocationType.Drop]:
@@ -859,7 +857,7 @@ major_items = {'Bombos', 'Book of Mudora', 'Cane of Somaria', 'Ether', 'Fire Rod
'Sanctuary Heart Container', 'Boss Heart Container', 'Progressive Shield', 'Ocarina (Activated)',
'Mirror Shield', 'Progressive Armor', 'Blue Mail', 'Red Mail', 'Progressive Sword', 'Fighter Sword',
'Master Sword', 'Tempered Sword', 'Golden Sword', 'Bow', 'Silver Arrows', 'Triforce Piece', 'Moon Pearl',
'Progressive Bow', 'Progressive Bow (Alt)'}
'Progressive Bow', 'Progressive Bow (Alt)', 'Triforce'}
vanilla_swords = {"Link's Uncle", 'Master Sword Pedestal', 'Blacksmith', 'Pyramid Fairy - Left'}

View File

@@ -11,9 +11,8 @@ def check_requirements(console=False):
'pyyaml': 'yaml'}
missing = []
for package, import_name in check_packages.items():
try:
__import__(import_name)
except ImportError:
spec = importlib.util.find_spec(import_name)
if spec is None:
missing.append(package)
if len(missing) > 0:
packages = ','.join(missing)