Some Inverted situations getting applied/removed in Mixed OW

This commit is contained in:
codemann8
2021-08-20 14:08:29 -05:00
parent d2610a891f
commit f051e3a0b2
9 changed files with 14 additions and 10 deletions

View File

@@ -104,6 +104,7 @@ class World(object):
self.__dict__.setdefault(attr, {})[player] = val
set_player_attr('_region_cache', {})
set_player_attr('player_names', [])
set_player_attr('owswaps', [[],[],[]])
set_player_attr('remote_items', False)
set_player_attr('required_medallions', ['Ether', 'Quake'])
set_player_attr('swamp_patch_required', False)
@@ -111,7 +112,7 @@ class World(object):
set_player_attr('ganon_at_pyramid', True)
set_player_attr('ganonstower_vanilla', True)
set_player_attr('sewer_light_cone', self.mode[player] == 'standard')
set_player_attr('fix_trock_doors', self.shuffle[player] != 'vanilla' or self.mode[player] == 'inverted')
set_player_attr('fix_trock_doors', self.shuffle[player] != 'vanilla' or ((self.mode[player] == 'inverted') != (0x05 in self.owswaps[player][0] and self.owMixed[player])))
set_player_attr('fix_skullwoods_exit', self.shuffle[player] not in ['vanilla', 'simple', 'restricted', 'dungeonssimple'] or self.doorShuffle[player] not in ['vanilla'])
set_player_attr('fix_palaceofdarkness_exit', self.shuffle[player] not in ['vanilla', 'simple', 'restricted', 'dungeonssimple'])
set_player_attr('fix_trock_exit', self.shuffle[player] not in ['vanilla', 'simple', 'restricted', 'dungeonssimple'])
@@ -149,7 +150,6 @@ class World(object):
set_player_attr('mixed_travel', 'prevent')
set_player_attr('standardize_palettes', 'standardize')
set_player_attr('force_fix', {'gt': False, 'sw': False, 'pod': False, 'tr': False})
set_player_attr('owswaps', [[],[],[]])
set_player_attr('prizes', {'pull': [0, 0, 0], 'crab': [0, 0], 'stun': 0, 'fish': 0})
set_player_attr('exp_cache', defaultdict(dict))
@@ -3049,7 +3049,6 @@ class Settings(object):
args.shufflepots[p] = True if settings[7] & 0x4 else False
@unique
class KeyRuleType(FastEnum):
WorstCase = 0
AllowSmall = 1

View File

@@ -89,7 +89,7 @@ def link_doors_main(world, player):
if world.mode[player] == 'standard':
world.get_portal('Sanctuary', player).destination = True
world.get_portal('Desert East', player).destination = True
if world.mode[player] == 'inverted':
if (world.mode[player] == 'inverted') != (0x30 in world.owswaps[player][0] and world.owMixed[player]):
world.get_portal('Desert West', player).destination = True
else:
world.get_portal('Skull 2 West', player).destination = True
@@ -1838,7 +1838,9 @@ def find_accessible_entrances(world, player, builder):
elif world.mode[player] != 'inverted':
start_regions = ['Links House', 'Sanctuary']
else:
start_regions = ['Links House', 'Dark Sanctuary Hint', 'Hyrule Castle Ledge']
start_regions = ['Links House', 'Dark Sanctuary Hint']
if (world.mode[player] == 'inverted') != (0x1b in world.owswaps[player][0] and world.owMixed[player]):
start_regions.append('Hyrule Castle Ledge')
regs = convert_regions(start_regions, world, player)
visited_regions = set()
visited_entrances = []
@@ -1853,7 +1855,7 @@ def find_accessible_entrances(world, player, builder):
while len(queue) > 0:
next_region = queue.popleft()
visited_regions.add(next_region)
if world.mode[player] == 'inverted' and next_region.name == 'Tower Agahnim 1':
if (world.mode[player] == 'inverted') != (0x1b in world.owswaps[player][0] and world.owMixed[player]) and next_region.name == 'Tower Agahnim 1':
connect = world.get_region('Hyrule Castle Ledge', player)
if connect not in queue and connect not in visited_regions:
queue.append(connect)

View File

@@ -1230,6 +1230,7 @@ def simple_shuffle_dungeons(world, player):
dungeon_entrances.append('Ganons Tower')
dungeon_exits.append('Ganons Tower Exit')
else:
# TODO: Should we be ignoring world.shuffle_ganon??
dungeon_entrances.append('Ganons Tower')
dungeon_exits.append('Agahnims Tower Exit')

View File

@@ -697,7 +697,7 @@ def balance_money_progression(world):
sphere_locations = get_sphere_locations(state, unchecked_locations)
checked_locations = []
for player in range(1, world.players+1):
kiki_payable = state.prog_items[('Moon Pearl', player)] > 0 or world.mode[player] == 'inverted'
kiki_payable = state.prog_items[('Moon Pearl', player)] > 0 or (world.mode[player] == 'inverted') != (0x1e in world.owswaps[player][0] and world.owMixed[player])
if kiki_payable and world.get_region('Palace of Darkness Area', player) in state.reachable_regions[player]:
if not kiki_paid[player]:
kiki_check[player] = True

View File

@@ -398,6 +398,7 @@ def set_up_take_anys(world, player):
if world.mode[player] == 'inverted':
if 'Dark Sanctuary Hint' in take_any_locations:
take_any_locations.remove('Dark Sanctuary Hint')
if (world.mode[player] == 'inverted') != (0x29 in world.owswaps[player][0] and world.owMixed[player]):
if 'Archery Game' in take_any_locations:
take_any_locations.remove('Archery Game')

View File

@@ -1898,7 +1898,7 @@ def val_mire(key_logic, world, player):
def val_turtle(key_logic, world, player):
# todo: check vanilla key logic when TR back doors are accessible
if world.shuffle[player] == 'vanilla' and world.mode[player] != 'inverted' and world.logic[player] in ('noglitches', 'minorglitches'):
if world.shuffle[player] == 'vanilla' and (world.mode[player] == 'inverted') == (0x05 in world.owswaps[player][0] and world.owMixed[player]) and world.logic[player] in ('noglitches', 'minorglitches'):
val_rule(key_logic.door_rules['TR Hub NW'], 1)
val_rule(key_logic.door_rules['TR Pokey 1 NW'], 2)
val_rule(key_logic.door_rules['TR Chain Chomps Down Stairs'], 3)

View File

@@ -1116,7 +1116,7 @@ def mark_dark_world_regions(world, player):
def create_shops(world, player):
world.shops[player] = []
for region_name, (room_id, type, shopkeeper, custom, locked, inventory, sram) in shop_table.items():
if world.mode[player] == 'inverted' and region_name == 'Dark Lake Hylia Shop':
if (world.mode[player] == 'inverted') != (0x35 in world.owswaps[player][0] and world.owMixed[player]) and region_name == 'Dark Lake Hylia Shop':
locked = True
inventory = [('Blue Potion', 160), ('Blue Shield', 50), ('Bombs (10)', 50)]
region = world.get_region(region_name, player)

1
Rom.py
View File

@@ -2471,6 +2471,7 @@ def set_inverted_mode(world, player, rom, inverted_buffer):
if world.doorShuffle[player] == 'vanilla' or world.intensity[player] < 3:
write_int16(rom, 0x15AEE + 2*0x38, 0x00E0)
write_int16(rom, 0x15AEE + 2*0x25, 0x000C)
if (world.mode[player] == 'inverted') != (0x03 in world.owswaps[player][0] and world.owMixed[player]):
if world.shuffle[player] in ['vanilla', 'dungeonsfull', 'dungeonssimple']:
rom.write_bytes(snes_to_pc(0x308350), [0x00, 0x00, 0x01]) # mountain cave starts on OW

View File

@@ -1491,8 +1491,8 @@ def swordless_rules(world, player):
set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_misery_mire_medallion(player)) # sword not required to use medallion for opening in swordless (!)
set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock Ledge', 'Region', player)) # sword not required to use medallion for opening in swordless (!)
add_bunny_rule(world.get_entrance('Turtle Rock', player), player)
add_bunny_rule(world.get_entrance('Misery Mire', player), player)
add_bunny_rule(world.get_entrance('Turtle Rock', player), player)
std_kill_rooms = {
'Hyrule Dungeon Armory Main': ['Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES'], # One green guard