Some Inverted situations getting applied/removed in Mixed OW
This commit is contained in:
@@ -104,6 +104,7 @@ class World(object):
|
|||||||
self.__dict__.setdefault(attr, {})[player] = val
|
self.__dict__.setdefault(attr, {})[player] = val
|
||||||
set_player_attr('_region_cache', {})
|
set_player_attr('_region_cache', {})
|
||||||
set_player_attr('player_names', [])
|
set_player_attr('player_names', [])
|
||||||
|
set_player_attr('owswaps', [[],[],[]])
|
||||||
set_player_attr('remote_items', False)
|
set_player_attr('remote_items', False)
|
||||||
set_player_attr('required_medallions', ['Ether', 'Quake'])
|
set_player_attr('required_medallions', ['Ether', 'Quake'])
|
||||||
set_player_attr('swamp_patch_required', False)
|
set_player_attr('swamp_patch_required', False)
|
||||||
@@ -111,7 +112,7 @@ class World(object):
|
|||||||
set_player_attr('ganon_at_pyramid', True)
|
set_player_attr('ganon_at_pyramid', True)
|
||||||
set_player_attr('ganonstower_vanilla', True)
|
set_player_attr('ganonstower_vanilla', True)
|
||||||
set_player_attr('sewer_light_cone', self.mode[player] == 'standard')
|
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_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_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'])
|
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('mixed_travel', 'prevent')
|
||||||
set_player_attr('standardize_palettes', 'standardize')
|
set_player_attr('standardize_palettes', 'standardize')
|
||||||
set_player_attr('force_fix', {'gt': False, 'sw': False, 'pod': False, 'tr': False})
|
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('prizes', {'pull': [0, 0, 0], 'crab': [0, 0], 'stun': 0, 'fish': 0})
|
||||||
|
|
||||||
set_player_attr('exp_cache', defaultdict(dict))
|
set_player_attr('exp_cache', defaultdict(dict))
|
||||||
@@ -3049,7 +3049,6 @@ class Settings(object):
|
|||||||
args.shufflepots[p] = True if settings[7] & 0x4 else False
|
args.shufflepots[p] = True if settings[7] & 0x4 else False
|
||||||
|
|
||||||
|
|
||||||
@unique
|
|
||||||
class KeyRuleType(FastEnum):
|
class KeyRuleType(FastEnum):
|
||||||
WorstCase = 0
|
WorstCase = 0
|
||||||
AllowSmall = 1
|
AllowSmall = 1
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ def link_doors_main(world, player):
|
|||||||
if world.mode[player] == 'standard':
|
if world.mode[player] == 'standard':
|
||||||
world.get_portal('Sanctuary', player).destination = True
|
world.get_portal('Sanctuary', player).destination = True
|
||||||
world.get_portal('Desert East', 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
|
world.get_portal('Desert West', player).destination = True
|
||||||
else:
|
else:
|
||||||
world.get_portal('Skull 2 West', player).destination = True
|
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':
|
elif world.mode[player] != 'inverted':
|
||||||
start_regions = ['Links House', 'Sanctuary']
|
start_regions = ['Links House', 'Sanctuary']
|
||||||
else:
|
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)
|
regs = convert_regions(start_regions, world, player)
|
||||||
visited_regions = set()
|
visited_regions = set()
|
||||||
visited_entrances = []
|
visited_entrances = []
|
||||||
@@ -1853,7 +1855,7 @@ def find_accessible_entrances(world, player, builder):
|
|||||||
while len(queue) > 0:
|
while len(queue) > 0:
|
||||||
next_region = queue.popleft()
|
next_region = queue.popleft()
|
||||||
visited_regions.add(next_region)
|
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)
|
connect = world.get_region('Hyrule Castle Ledge', player)
|
||||||
if connect not in queue and connect not in visited_regions:
|
if connect not in queue and connect not in visited_regions:
|
||||||
queue.append(connect)
|
queue.append(connect)
|
||||||
|
|||||||
@@ -1230,6 +1230,7 @@ def simple_shuffle_dungeons(world, player):
|
|||||||
dungeon_entrances.append('Ganons Tower')
|
dungeon_entrances.append('Ganons Tower')
|
||||||
dungeon_exits.append('Ganons Tower Exit')
|
dungeon_exits.append('Ganons Tower Exit')
|
||||||
else:
|
else:
|
||||||
|
# TODO: Should we be ignoring world.shuffle_ganon??
|
||||||
dungeon_entrances.append('Ganons Tower')
|
dungeon_entrances.append('Ganons Tower')
|
||||||
dungeon_exits.append('Agahnims Tower Exit')
|
dungeon_exits.append('Agahnims Tower Exit')
|
||||||
|
|
||||||
|
|||||||
2
Fill.py
2
Fill.py
@@ -697,7 +697,7 @@ def balance_money_progression(world):
|
|||||||
sphere_locations = get_sphere_locations(state, unchecked_locations)
|
sphere_locations = get_sphere_locations(state, unchecked_locations)
|
||||||
checked_locations = []
|
checked_locations = []
|
||||||
for player in range(1, world.players+1):
|
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 kiki_payable and world.get_region('Palace of Darkness Area', player) in state.reachable_regions[player]:
|
||||||
if not kiki_paid[player]:
|
if not kiki_paid[player]:
|
||||||
kiki_check[player] = True
|
kiki_check[player] = True
|
||||||
|
|||||||
@@ -398,6 +398,7 @@ def set_up_take_anys(world, player):
|
|||||||
if world.mode[player] == 'inverted':
|
if world.mode[player] == 'inverted':
|
||||||
if 'Dark Sanctuary Hint' in take_any_locations:
|
if 'Dark Sanctuary Hint' in take_any_locations:
|
||||||
take_any_locations.remove('Dark Sanctuary Hint')
|
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:
|
if 'Archery Game' in take_any_locations:
|
||||||
take_any_locations.remove('Archery Game')
|
take_any_locations.remove('Archery Game')
|
||||||
|
|
||||||
|
|||||||
@@ -1898,7 +1898,7 @@ def val_mire(key_logic, world, player):
|
|||||||
|
|
||||||
def val_turtle(key_logic, world, player):
|
def val_turtle(key_logic, world, player):
|
||||||
# todo: check vanilla key logic when TR back doors are accessible
|
# 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 Hub NW'], 1)
|
||||||
val_rule(key_logic.door_rules['TR Pokey 1 NW'], 2)
|
val_rule(key_logic.door_rules['TR Pokey 1 NW'], 2)
|
||||||
val_rule(key_logic.door_rules['TR Chain Chomps Down Stairs'], 3)
|
val_rule(key_logic.door_rules['TR Chain Chomps Down Stairs'], 3)
|
||||||
|
|||||||
@@ -1116,7 +1116,7 @@ def mark_dark_world_regions(world, player):
|
|||||||
def create_shops(world, player):
|
def create_shops(world, player):
|
||||||
world.shops[player] = []
|
world.shops[player] = []
|
||||||
for region_name, (room_id, type, shopkeeper, custom, locked, inventory, sram) in shop_table.items():
|
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
|
locked = True
|
||||||
inventory = [('Blue Potion', 160), ('Blue Shield', 50), ('Bombs (10)', 50)]
|
inventory = [('Blue Potion', 160), ('Blue Shield', 50), ('Bombs (10)', 50)]
|
||||||
region = world.get_region(region_name, player)
|
region = world.get_region(region_name, player)
|
||||||
|
|||||||
1
Rom.py
1
Rom.py
@@ -2471,6 +2471,7 @@ def set_inverted_mode(world, player, rom, inverted_buffer):
|
|||||||
if world.doorShuffle[player] == 'vanilla' or world.intensity[player] < 3:
|
if world.doorShuffle[player] == 'vanilla' or world.intensity[player] < 3:
|
||||||
write_int16(rom, 0x15AEE + 2*0x38, 0x00E0)
|
write_int16(rom, 0x15AEE + 2*0x38, 0x00E0)
|
||||||
write_int16(rom, 0x15AEE + 2*0x25, 0x000C)
|
write_int16(rom, 0x15AEE + 2*0x25, 0x000C)
|
||||||
|
|
||||||
if (world.mode[player] == 'inverted') != (0x03 in world.owswaps[player][0] and world.owMixed[player]):
|
if (world.mode[player] == 'inverted') != (0x03 in world.owswaps[player][0] and world.owMixed[player]):
|
||||||
if world.shuffle[player] in ['vanilla', 'dungeonsfull', 'dungeonssimple']:
|
if world.shuffle[player] in ['vanilla', 'dungeonsfull', 'dungeonssimple']:
|
||||||
rom.write_bytes(snes_to_pc(0x308350), [0x00, 0x00, 0x01]) # mountain cave starts on OW
|
rom.write_bytes(snes_to_pc(0x308350), [0x00, 0x00, 0x01]) # mountain cave starts on OW
|
||||||
|
|||||||
2
Rules.py
2
Rules.py
@@ -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('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 (!)
|
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('Misery Mire', player), player)
|
||||||
|
add_bunny_rule(world.get_entrance('Turtle Rock', player), player)
|
||||||
|
|
||||||
std_kill_rooms = {
|
std_kill_rooms = {
|
||||||
'Hyrule Dungeon Armory Main': ['Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES'], # One green guard
|
'Hyrule Dungeon Armory Main': ['Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES'], # One green guard
|
||||||
|
|||||||
Reference in New Issue
Block a user