From 6f62c41ec3e1e6cbbca75674cf7f6e616367ac2b Mon Sep 17 00:00:00 2001 From: StructuralMike <66819228+StructuralMike@users.noreply.github.com> Date: Mon, 8 Mar 2021 22:07:01 +0100 Subject: [PATCH] Removed futuro-stuff --- BaseClasses.py | 32 +++-------- CLI.py | 3 +- ItemList.py | 53 ++++++------------- Items.py | 2 +- Main.py | 24 ++++----- Mystery.py | 2 - Rom.py | 23 +++----- Rules.py | 23 ++++---- resources/app/cli/args.json | 4 -- resources/app/cli/lang/en.json | 4 -- resources/app/gui/lang/en.json | 1 - resources/app/gui/randomize/item/widgets.json | 3 +- source/classes/constants.py | 1 - 13 files changed, 57 insertions(+), 118 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index d8551373..8f3f626c 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -19,7 +19,7 @@ from RoomData import Room class World(object): def __init__(self, players, shuffle, doorShuffle, logic, mode, swords, difficulty, difficulty_adjustments, - timer, progressive, goal, algorithm, accessibility, shuffle_ganon, retro, futuro, custom, customitemarray, hints): + timer, progressive, goal, algorithm, accessibility, shuffle_ganon, retro, custom, customitemarray, hints): self.players = players self.teams = 1 self.shuffle = shuffle.copy() @@ -61,7 +61,6 @@ class World(object): self.shuffle_ganon = shuffle_ganon self.fix_gtower_exit = self.shuffle_ganon self.retro = retro.copy() - self.futuro = futuro.copy() self.custom = custom self.customitemarray = customitemarray self.can_take_damage = True @@ -92,9 +91,6 @@ class World(object): self.retro[player] = True def set_player_attr(attr, val): self.__dict__.setdefault(attr, {})[player] = val - # Futuro doesn't support standard start - if self.futuro[player] and self.mode[player] == "standard": - self.mode[player] == "open" set_player_attr('_region_cache', {}) set_player_attr('player_names', []) set_player_attr('remote_items', False) @@ -453,10 +449,6 @@ class World(object): return False - -# Items to test for ability to use magic in has() -magic_items = ['Magic Powder', 'Fire Rod', 'Ice Rod', 'Bombos', 'Ether', 'Quake', 'Cane of Somaria', 'Cane of Byrna', 'Cape'] - class CollectionState(object): def __init__(self, parent): @@ -578,10 +570,10 @@ class CollectionState(object): def can_reach_blue(self, region, player): - return region in self.reachable_regions[player] and self.reachable_regions[player][region] in [CrystalBarrier.Blue, CrystalBarrier.Either] and self.can_hit_switch(player) + return region in self.reachable_regions[player] and self.reachable_regions[player][region] in [CrystalBarrier.Blue, CrystalBarrier.Either] and self.can_hit_crystal(player) def can_reach_orange(self, region, player): - return region in self.reachable_regions[player] and self.reachable_regions[player][region] in [CrystalBarrier.Orange, CrystalBarrier.Either] and self.can_hit_switch(player) + return region in self.reachable_regions[player] and self.reachable_regions[player][region] in [CrystalBarrier.Orange, CrystalBarrier.Either] and self.can_hit_crystal(player) def _do_not_flood_the_keys(self, reachable_events): adjusted_checks = list(reachable_events) @@ -603,9 +595,6 @@ class CollectionState(object): return True def has(self, item, player, count=1): - if self.world.futuro[player]: - if item in magic_items and self.prog_items['Magic Upgrade (1/2)', player] == 0 and self.prog_items['Magic Upgrade (1/4)', player] == 0: - return False if count == 1: return (item, player) in self.prog_items return self.prog_items[item, player] >= count @@ -665,11 +654,6 @@ class CollectionState(object): basemagic = 16 else: basemagic = 8 - if self.world.futuro[player]: - if basemagic == 8: - basemagic = 0 - else: - basemagic = int(basemagic/2) if self.can_buy_unlimited('Green Potion', player) or self.can_buy_unlimited('Blue Potion', player): if self.world.difficulty_adjustments[player] == 'hard' and not fullrefill: basemagic = basemagic + int(basemagic * 0.5 * self.bottle_count(player)) @@ -687,10 +671,12 @@ class CollectionState(object): or self.has('Fire Rod', player) ) + # In the future, this can be used to check if the player starts without bombs def can_use_bombs(self, player): - return (self.has('Bomb Upgrade (+10)', player) or not self.world.futuro[player]) + StartingBombs = True + return (StartingBombs or self.has('Bomb Upgrade (+10)', player)) - def can_hit_switch(self, player): + def can_hit_crystal(self, player): return (self.can_use_bombs(player) or self.can_shoot_arrows(player) or self.has_blunt_weapon(player) @@ -702,7 +688,7 @@ class CollectionState(object): or self.has('Cane of Somaria', player) or self.has('Cane of Byrna', player)) - def can_hit_switch_through_barrier(self, player): + def can_hit_crystal_through_barrier(self, player): return (self.can_use_bombs(player) or self.can_shoot_arrows(player) or self.has_beam_sword(player) @@ -1959,7 +1945,6 @@ class Spoiler(object): 'logic': self.world.logic, 'mode': self.world.mode, 'retro': self.world.retro, - 'futuro': self.world.futuro, 'weapons': self.world.swords, 'goal': self.world.goal, 'shuffle': self.world.shuffle, @@ -2023,7 +2008,6 @@ class Spoiler(object): outfile.write('Logic: %s\n' % self.metadata['logic'][player]) outfile.write('Mode: %s\n' % self.metadata['mode'][player]) outfile.write('Retro: %s\n' % ('Yes' if self.metadata['retro'][player] else 'No')) - outfile.write('Futuro: %s\n' % ('Yes' if self.metadata['futuro'][player] else 'No')) outfile.write('Swords: %s\n' % self.metadata['weapons'][player]) outfile.write('Goal: %s\n' % self.metadata['goal'][player]) outfile.write('Difficulty: %s\n' % self.metadata['item_pool'][player]) diff --git a/CLI.py b/CLI.py index e383f25c..35204b65 100644 --- a/CLI.py +++ b/CLI.py @@ -90,7 +90,7 @@ def parse_cli(argv, no_defaults=False): for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', 'shuffle', 'door_shuffle', 'intensity', 'crystals_ganon', 'crystals_gt', 'openpyramid', 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory', - 'retro', 'futuro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', + 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', 'remote_items', 'keydropshuffle', 'mixed_travel', 'standardize_palettes']: @@ -108,7 +108,6 @@ def parse_settings(): settings = { "lang": "en", "retro": False, - "futuro": False, "mode": "open", "logic": "noglitches", "goal": "ganon", diff --git a/ItemList.py b/ItemList.py index 8c3a2980..78daa91b 100644 --- a/ItemList.py +++ b/ItemList.py @@ -257,10 +257,10 @@ def generate_itempool(world, player): # set up item pool if world.custom: - (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) = make_custom_item_pool(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.futuro[player], world.customitemarray) + (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) = make_custom_item_pool(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.customitemarray) world.rupoor_cost = min(world.customitemarray[player]["rupoorcost"], 9999) else: - (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) = get_pool_core(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.futuro[player], world.doorShuffle[player]) + (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) = get_pool_core(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.doorShuffle[player]) if player in world.pool_adjustment.keys(): amt = world.pool_adjustment[player] @@ -478,7 +478,7 @@ def set_up_shops(world, player): rss.locked = True -def get_pool_core(progressive, shuffle, difficulty, timer, goal, mode, swords, retro, futuro, door_shuffle): +def get_pool_core(progressive, shuffle, difficulty, timer, goal, mode, swords, retro, door_shuffle): pool = [] placed_items = {} precollected_items = [] @@ -604,28 +604,10 @@ def get_pool_core(progressive, shuffle, difficulty, timer, goal, mode, swords, r pool.extend(['Small Key (Universal)']) else: pool.extend(['Small Key (Universal)']) - - if futuro: - magic_count = 0 - bomb_count = 0 - for item in pool: - if item == 'Magic Upgrade (1/2)': - magic_count += 1 - if item == 'Bomb Upgrade (+10)': - bomb_count += 1 - if magic_count == 0: - pool.append('Magic Upgrade (1/2)') - if 'Magic Upgrade (1/4)' not in pool and magic_count < 2: - pool.append('Magic Upgrade (1/2)') - if bomb_count == 0: - pool.append('Bomb Upgrade (+10)') - pool.append('Bomb Upgrade (+10)') - elif bomb_count == 1: - pool.append('Bomb Upgrade (+10)') return (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) -def make_custom_item_pool(progressive, shuffle, difficulty, timer, goal, mode, swords, retro, futuro, customitemarray): +def make_custom_item_pool(progressive, shuffle, difficulty, timer, goal, mode, swords, retro, customitemarray): if isinstance(customitemarray,dict) and 1 in customitemarray: customitemarray = customitemarray[1] pool = [] @@ -740,21 +722,20 @@ def test(): for progressive in ['on', 'off']: for shuffle in ['full', 'insanity_legacy']: for retro in [True, False]: - for futuro in [True, False]: - for door_shuffle in ['basic', 'crossed', 'vanilla']: - out = get_pool_core(progressive, shuffle, difficulty, timer, goal, mode, swords, retro, futuro, door_shuffle) - count = len(out[0]) + len(out[1]) + for door_shuffle in ['basic', 'crossed', 'vanilla']: + out = get_pool_core(progressive, shuffle, difficulty, timer, goal, mode, swords, retro, door_shuffle) + count = len(out[0]) + len(out[1]) - correct_count = total_items_to_place - if goal == 'pedestal' and swords != 'vanilla': - # pedestal goals generate one extra item - correct_count += 1 - if retro: - correct_count += 28 - try: - assert count == correct_count, "expected {0} items but found {1} items for {2}".format(correct_count, count, (progressive, shuffle, difficulty, timer, goal, mode, swords, retro, futuro)) - except AssertionError as e: - print(e) + correct_count = total_items_to_place + if goal == 'pedestal' and swords != 'vanilla': + # pedestal goals generate one extra item + correct_count += 1 + if retro: + correct_count += 28 + try: + assert count == correct_count, "expected {0} items but found {1} items for {2}".format(correct_count, count, (progressive, shuffle, difficulty, timer, goal, mode, swords, retro)) + except AssertionError as e: + print(e) if __name__ == '__main__': test() diff --git a/Items.py b/Items.py index ceba0d56..b20ebe35 100644 --- a/Items.py +++ b/Items.py @@ -81,7 +81,7 @@ item_table = {'Bow': (True, False, None, 0x0B, 'You have\nchosen the\narcher cla 'Single Bomb': (False, False, None, 0x27, 'I make things\ngo BOOM! But\njust once.', 'and the explosion', 'the bomb-holding kid', 'firecracker for sale', 'blend fungus into bomb', '\'splosion boy explodes again', 'a bomb'), 'Bombs (3)': (False, False, None, 0x28, 'I make things\ngo triple\nBOOM!!!', 'and the explosions', 'the bomb-holding kid', 'firecrackers for sale', 'blend fungus into bombs', '\'splosion boy explodes again', 'three bombs'), 'Bombs (10)': (False, False, None, 0x31, 'I make things\ngo BOOM! Ten\ntimes!', 'and the explosions', 'the bomb-holding kid', 'firecrackers for sale', 'blend fungus into bombs', '\'splosion boy explodes again', 'ten bombs'), - 'Bomb Upgrade (+10)': (True, False, None, 0x52, 'increase bomb\nstorage, low\nlow price', 'and the bomb bag', 'boom-enlarging kid', 'bomb boost for sale', 'the shroom goes boom', 'upgrade boy explodes more again', 'bomb capacity'), + 'Bomb Upgrade (+10)': (False, False, None, 0x52, 'increase bomb\nstorage, low\nlow price', 'and the bomb bag', 'boom-enlarging kid', 'bomb boost for sale', 'the shroom goes boom', 'upgrade boy explodes more again', 'bomb capacity'), 'Bomb Upgrade (+5)': (False, False, None, 0x51, 'increase bomb\nstorage, low\nlow price', 'and the bomb bag', 'boom-enlarging kid', 'bomb boost for sale', 'the shroom goes boom', 'upgrade boy explodes more again', 'bomb capacity'), 'Blue Mail': (False, True, None, 0x22, 'Now you\'re a\nblue elf!', 'and the banana hat', 'the protected kid', 'banana hat for sale', 'the clothing store', 'tailor boy banana hatted again', 'the blue mail'), 'Red Mail': (False, True, None, 0x23, 'Now you\'re a\nred elf!', 'and the eggplant hat', 'well-protected kid', 'purple hat for sale', 'the nice clothing store', 'tailor boy fears nothing again', 'the red mail'), diff --git a/Main.py b/Main.py index 77b14742..09efcac4 100644 --- a/Main.py +++ b/Main.py @@ -41,7 +41,7 @@ def main(args, seed=None, fish=None): # initialize the world world = World(args.multi, args.shuffle, args.door_shuffle, args.logic, args.mode, args.swords, args.difficulty, args.item_functionality, args.timer, args.progressive, args.goal, args.algorithm, - args.accessibility, args.shuffleganon, args.retro, args.futuro, args.custom, args.customitemarray, args.hints) + args.accessibility, args.shuffleganon, args.retro, args.custom, args.customitemarray, args.hints) logger = logging.getLogger('') if seed is None: random.seed(None) @@ -278,17 +278,16 @@ def main(args, seed=None, fish=None): "algorithm": world.algorithm, # 8 "mscb": mcsb_name, # 9 "retro": world.retro[player], # A - "futuro": world.futuro[player], # B - "progressive": world.progressive, # C - "hints": 'True' if world.hints[player] else 'False' # D + "progressive": world.progressive, # B + "hints": 'True' if world.hints[player] else 'False' # C } - # 0 1 2 3 4 5 6 7 8 9 A B C D - outfilesuffix = ('_%s_%s-%s-%s-%s%s_%s_%s-%s%s%s%s%s%s' % ( + # 0 1 2 3 4 5 6 7 8 9 A B C + outfilesuffix = ('_%s_%s-%s-%s-%s%s_%s_%s-%s%s%s%s%s' % ( # 0 1 2 3 4 5 6 7 8 9 A B C D - # _noglitches_normal-normal-open-ganon-ohko_simple_basic-balanced-keysanity-retro-futuro-prog_swords-nohints + # _noglitches_normal-normal-open-ganon-ohko_simple_basic-balanced-keysanity-retro-prog_swords-nohints # _noglitches_normal-normal-open-ganon _simple_basic-balanced-keysanity-retro - # _noglitches_normal-normal-open-ganon _simple_basic-balanced-keysanity -prog_swords - # _noglitches_normal-normal-open-ganon _simple_basic-balanced-keysanity -nohints + # _noglitches_normal-normal-open-ganon _simple_basic-balanced-keysanity -prog_swords + # _noglitches_normal-normal-open-ganon _simple_basic-balanced-keysanity -nohints outfilestuffs["logic"], # 0 outfilestuffs["difficulty"], # 1 @@ -303,9 +302,8 @@ def main(args, seed=None, fish=None): outfilestuffs["mscb"], # 9 "-retro" if outfilestuffs["retro"] == "True" else "", # A - "-futuro" if outfilestuffs["futuro"] == "True" else "", # B - "-prog_" + outfilestuffs["progressive"] if outfilestuffs["progressive"] in ['off', 'random'] else "", # C - "-nohints" if not outfilestuffs["hints"] == "True" else "")) if not args.outputname else '' # D + "-prog_" + outfilestuffs["progressive"] if outfilestuffs["progressive"] in ['off', 'random'] else "", # B + "-nohints" if not outfilestuffs["hints"] == "True" else "")) if not args.outputname else '' # C rom.write_to_file(output_path(f'{outfilebase}{outfilepname}{outfilesuffix}.sfc')) if world.players > 1: @@ -358,7 +356,7 @@ def copy_world(world): # ToDo: Not good yet ret = World(world.players, world.shuffle, world.doorShuffle, world.logic, world.mode, world.swords, world.difficulty, world.difficulty_adjustments, world.timer, world.progressive, world.goal, world.algorithm, - world.accessibility, world.shuffle_ganon, world.retro, world.futuro, world.custom, world.customitemarray, world.hints) + world.accessibility, world.shuffle_ganon, world.retro, world.custom, world.customitemarray, world.hints) ret.teams = world.teams ret.player_names = copy.deepcopy(world.player_names) ret.remote_items = world.remote_items.copy() diff --git a/Mystery.py b/Mystery.py index 514f5750..e0a19467 100644 --- a/Mystery.py +++ b/Mystery.py @@ -174,8 +174,6 @@ def roll_settings(weights): ret.mode = 'open' ret.retro = True - ret.futuro = get_choice('futuro', weights) - ret.hints = get_choice('hints') == 'on' ret.swords = {'randomized': 'random', diff --git a/Rom.py b/Rom.py index e2900fe3..c27a66f6 100644 --- a/Rom.py +++ b/Rom.py @@ -27,8 +27,7 @@ from EntranceShuffle import door_addresses, exit_ids JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '8350a310f10293f2ef2b84305bad489e' - +RANDOMIZERBASEHASH = '30147375153cc57197805eddf38c2a23' class JsonRom(object): @@ -913,8 +912,9 @@ def patch_rom(world, rom, player, team, enemized): difficulty = world.difficulty_requirements[player] - #Shift magic consumption costs if futuro - if world.futuro[player]: + #Shift magic consumption costs if not starting with magic + StartingMagic = True + if not StartingMagic: for item in magic_cost: magic_cost[item][1][2] = magic_cost[item][1][1] magic_cost[item][1][1] = magic_cost[item][1][0] @@ -1015,7 +1015,7 @@ def patch_rom(world, rom, player, team, enemized): rom.write_bytes(0x184000, [ # original_item, limit, replacement_item, filler 0x12, 0x01, 0x35, 0xFF, # lamp -> 5 rupees - 0x51, 0x00 if world.futuro[player] else 0x06, 0x31 if world.futuro[player] else 0x52, 0xFF, # 6 +5 bomb upgrades -> +10 bomb upgrade. If bomb-futuro, turns into Bombs (10) + 0x51, 0x06, 0x52, 0xFF, # 6 +5 bomb upgrades -> +10 bomb upgrade. 0x53, 0x06, 0x54, 0xFF, # 6 +5 arrow upgrades -> +10 arrow upgrade 0x58, 0x01, 0x36 if world.retro[player] else 0x43, 0xFF, # silver arrows -> single arrow (red 20 in retro mode) 0x3E, difficulty.boss_heart_container_limit, 0x47, 0xff, # boss heart -> green 20 @@ -1128,7 +1128,7 @@ def patch_rom(world, rom, player, team, enemized): rom.write_byte(0x180171, 0x01 if world.ganon_at_pyramid[player] else 0x00) # Enable respawning on pyramid after ganon death rom.write_byte(0x180173, 0x01) # Bob is enabled rom.write_byte(0x180168, 0x08) # Spike Cave Damage - if world.futuro[player]: + if not StartingMagic: rom.write_bytes(0x18016B, [0x81, 0x04, 0x02]) # Set spike cave and MM spike room Byrna usage rom.write_bytes(0x18016E, [0x01, 0x04, 0x08]) # Set spike cave and MM spike room Cape usage else: @@ -1152,10 +1152,7 @@ def patch_rom(world, rom, player, team, enemized): equip[0x36C] = 0x18 equip[0x36D] = 0x18 equip[0x379] = 0x68 - if world.futuro[player]: - starting_max_bombs = 0 - else: - starting_max_bombs = 10 + starting_max_bombs = 10 starting_max_arrows = 30 startingstate = CollectionState(world) @@ -1291,12 +1288,6 @@ def patch_rom(world, rom, player, team, enemized): else: raise RuntimeError(f'Unsupported item in starting equipment: {item.name}') - # Set basepatch switches for the futuro mode - if world.futuro[player]: - rom.write_byte(0x18008D, 0x01) - else: - rom.write_byte(0x18008D, 0x00) - equip[0x343] = min(equip[0x343], starting_max_bombs) rom.write_byte(0x180034, starting_max_bombs) equip[0x377] = min(equip[0x377], starting_max_arrows) diff --git a/Rules.py b/Rules.py index 0450fd17..e9f0a870 100644 --- a/Rules.py +++ b/Rules.py @@ -28,8 +28,7 @@ def set_rules(world, player): else: raise NotImplementedError('Not implemented yet') - if world.futuro[player]: - bomb_rules(world, player) + bomb_rules(world, player) if world.logic[player] == 'noglitches': no_glitches_rules(world, player) @@ -284,7 +283,7 @@ def global_rules(world, player): set_rule(world.get_entrance('TR Hub EN', player), lambda state: state.has('Cane of Somaria', player)) set_rule(world.get_entrance('TR Hub NW', player), lambda state: state.has('Cane of Somaria', player)) set_rule(world.get_entrance('TR Hub NE', player), lambda state: state.has('Cane of Somaria', player)) - set_rule(world.get_location('Turtle Rock - Chain Chomps', player), lambda state: state.can_hit_switch_through_barrier(player)) + set_rule(world.get_location('Turtle Rock - Chain Chomps', player), lambda state: state.can_hit_crystal_through_barrier(player)) set_rule(world.get_entrance('TR Torches NW', player), lambda state: state.has('Cane of Somaria', player) and state.has('Fire Rod', player)) set_rule(world.get_entrance('TR Big Chest Entrance Gap', player), lambda state: state.has('Cane of Somaria', player) or state.has('Hookshot', player)) set_rule(world.get_entrance('TR Big Chest Gap', player), lambda state: state.has('Cane of Somaria', player) or state.has_Boots(player)) @@ -352,15 +351,15 @@ def global_rules(world, player): set_rule(world.get_entrance('Hera Front to Lobby Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('Hera Front', player), player)) set_rule(world.get_entrance('Hera Front to Down Stairs Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('Hera Front', player), player)) set_rule(world.get_entrance('Hera Down Stairs to Front Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('Hera Down Stairs Landing', player), player)) - set_rule(world.get_entrance('Hera Down Stairs Landing to Ranged Crystal', player), lambda state: state.can_hit_switch_through_barrier(player)) + set_rule(world.get_entrance('Hera Down Stairs Landing to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player)) set_rule(world.get_entrance('Hera Front to Up Stairs Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('Hera Front', player), player)) set_rule(world.get_entrance('Hera Up Stairs to Front Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('Hera Up Stairs Landing', player), player)) - set_rule(world.get_entrance('Hera Up Stairs Landing to Ranged Crystal', player), lambda state: state.can_hit_switch_through_barrier(player)) + set_rule(world.get_entrance('Hera Up Stairs Landing to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player)) set_rule(world.get_entrance('Hera Front to Back Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('Hera Front', player), player)) set_rule(world.get_entrance('Hera Back to Front Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('Hera Back', player), player)) set_rule(world.get_entrance('Hera Back to Ranged Crystal', player), lambda state: state.has_beam_sword(player) or state.can_shoot_arrows(player) or state.has('Fire Rod', player) or state.has('Ice Rod', player)) - set_rule(world.get_entrance('PoD Arena Main to Ranged Crystal', player), lambda state: state.can_hit_switch_through_barrier(player) or state.has('Hookshot', player)) + set_rule(world.get_entrance('PoD Arena Main to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player) or state.has('Hookshot', player)) set_rule(world.get_entrance('PoD Arena Bridge to Ranged Crystal', player), lambda state: state.has_beam_sword(player) or state.can_shoot_arrows(player) or state.has('Red Boomerang', player) or state.has('Fire Rod', player) or state.has('Ice Rod', player) or state.has('Cane of Somaria', player)) set_rule(world.get_entrance('PoD Arena Landing to Ranged Crystal', player), lambda state: state.has('Red Boomerang', player) or (state.has('Cane of Somaria', player) and state.has_Boots(player))) set_rule(world.get_entrance('PoD Arena Main to North Ranged Barrier - Orange', player), lambda state: state.can_use_bombs(player) or state.has('Cane of Somaria', player)) @@ -407,23 +406,23 @@ def global_rules(world, player): set_rule(world.get_entrance('Mire Crystal Dead End Right Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire Crystal Dead End', player), player)) set_rule(world.get_entrance('Mire South Fish Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire South Fish', player), player)) set_rule(world.get_entrance('Mire Compass Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire Compass Room', player), player)) - set_rule(world.get_entrance('Mire Tall Dark and Roomy to Ranged Crystal', player), lambda state: state.can_hit_switch_through_barrier(player) or state.has('Hookshot', player) or state.has_Boots(player)) + set_rule(world.get_entrance('Mire Tall Dark and Roomy to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player) or state.has('Hookshot', player) or state.has_Boots(player)) set_rule(world.get_entrance('Mire Crystal Mid Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire Crystal Mid', player), player)) set_rule(world.get_entrance('Mire Crystal Left Blue Barrier', player), lambda state: state.can_reach_blue(world.get_region('Mire Crystal Left', player), player)) set_rule(world.get_entrance('TR Chain Chomps Top to Bottom Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Chain Chomps Top', player), player)) set_rule(world.get_entrance('TR Chain Chomps Bottom to Top Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Chain Chomps Bottom', player), player)) - set_rule(world.get_entrance('TR Chain Chomps Bottom to Ranged Crystal', player), lambda state: state.can_hit_switch_through_barrier(player)) + set_rule(world.get_entrance('TR Chain Chomps Bottom to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player)) set_rule(world.get_entrance('TR Pokey 2 Top to Bottom Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Pokey 2 Top', player), player)) set_rule(world.get_entrance('TR Pokey 2 Bottom to Top Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Pokey 2 Bottom', player), player)) - set_rule(world.get_entrance('TR Pokey 2 Bottom to Ranged Crystal', player), lambda state: state.can_hit_switch_through_barrier(player)) + set_rule(world.get_entrance('TR Pokey 2 Bottom to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player)) set_rule(world.get_entrance('TR Crystaroller Bottom to Middle Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Crystaroller Bottom', player), player)) set_rule(world.get_entrance('TR Crystaroller Bottom to Ranged Crystal', player), lambda state: state.has_beam_sword(player) or state.can_shoot_arrows(player) or state.has('Fire Rod', player) or state.has('Ice Rod', player) or state.has('Cane of Somaria', player)) set_rule(world.get_entrance('TR Crystaroller Middle to Bottom Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Crystaroller Middle', player), player)) set_rule(world.get_entrance('TR Crystaroller Middle to Chest Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Crystaroller Middle', player), player)) set_rule(world.get_entrance('TR Crystaroller Middle to Top Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Crystaroller Middle', player), player)) - set_rule(world.get_entrance('TR Crystaroller Middle to Ranged Crystal', player), lambda state: state.can_hit_switch_through_barrier(player)) + set_rule(world.get_entrance('TR Crystaroller Middle to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player)) set_rule(world.get_entrance('TR Crystaroller Top to Middle Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('TR Crystaroller Top', player), player)) set_rule(world.get_entrance('TR Crystaroller Chest to Middle Barrier - Blue', player), lambda state: state.can_reach_blue(world.get_region('TR Crystaroller Chest', player), player)) @@ -463,7 +462,7 @@ def global_rules(world, player): set_rule(world.get_entrance('Mire Firesnake Skip Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Mire Firesnake Skip', player), player)) set_rule(world.get_entrance('Mire Antechamber Orange Barrier', player), lambda state: state.can_reach_orange(world.get_region('Mire Antechamber', player), player)) set_rule(world.get_entrance('GT Crystal Circles Barrier - Orange', player), lambda state: state.can_reach_orange(world.get_region('GT Crystal Circles', player), player)) - set_rule(world.get_entrance('GT Crystal Circles to Ranged Crystal', player), lambda state: state.can_hit_switch_through_barrier(player) or state.has_blunt_weapon(player) or state.has('Cane of Byrna', player)) + set_rule(world.get_entrance('GT Crystal Circles to Ranged Crystal', player), lambda state: state.can_hit_crystal_through_barrier(player) or state.has_blunt_weapon(player) or state.has('Cane of Byrna', player)) add_key_logic_rules(world, player) @@ -498,7 +497,7 @@ def bomb_rules(world, player): paradox_switch_chests = ['Paradox Cave Lower - Far Left', 'Paradox Cave Lower - Left', 'Paradox Cave Lower - Right', 'Paradox Cave Lower - Far Right', 'Paradox Cave Lower - Middle'] for location in paradox_switch_chests: - add_rule(world.get_location(location, player), lambda state: state.can_hit_switch_through_barrier(player)) + add_rule(world.get_location(location, player), lambda state: state.can_hit_crystal_through_barrier(player)) # Dungeon bomb logic for _,entrances in std_kill_rooms.items(): diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index 574a7d2a..70bc1148 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -210,10 +210,6 @@ "action": "store_true", "type": "bool" }, - "futuro": { - "action": "store_true", - "type": "bool" - }, "startinventory": {}, "usestartinventory": { "type": "bool" diff --git a/resources/app/cli/lang/en.json b/resources/app/cli/lang/en.json index 07d9d587..a0fa6296 100644 --- a/resources/app/cli/lang/en.json +++ b/resources/app/cli/lang/en.json @@ -261,10 +261,6 @@ "Keys are universal, shooting arrows costs rupees,", "and a few other little things make this more like Zelda-1. (default: %(default)s)" ], - "futuro": [ - "You start with 0 bomb capacity, and without magic meter,", - "you have to find your capacity upgrades to use them. (default: %(default)s)" - ], "startinventory": [ "Specifies a list of items that will be in your starting inventory (separated by commas). (default: %(default)s)" ], "usestartinventory": [ "Toggle usage of Starting Inventory." ], "custom": [ "Not supported." ], diff --git a/resources/app/gui/lang/en.json b/resources/app/gui/lang/en.json index c1555290..b3140d40 100644 --- a/resources/app/gui/lang/en.json +++ b/resources/app/gui/lang/en.json @@ -185,7 +185,6 @@ "randomizer.item.retro": "Retro mode (universal keys)", - "randomizer.item.futuro": "Futuro", "randomizer.item.worldstate": "World State", "randomizer.item.worldstate.standard": "Standard", diff --git a/resources/app/gui/randomize/item/widgets.json b/resources/app/gui/randomize/item/widgets.json index d5224ac0..d485cdb8 100644 --- a/resources/app/gui/randomize/item/widgets.json +++ b/resources/app/gui/randomize/item/widgets.json @@ -1,7 +1,6 @@ { "checkboxes": { - "retro": { "type": "checkbox" }, - "futuro": { "type": "checkbox" } + "retro": { "type": "checkbox" } }, "leftItemFrame": { "worldstate": { diff --git a/source/classes/constants.py b/source/classes/constants.py index 0b010c37..18bca6ac 100644 --- a/source/classes/constants.py +++ b/source/classes/constants.py @@ -56,7 +56,6 @@ SETTINGSTOPROCESS = { "randomizer": { "item": { "retro": "retro", - "futuro": "futuro", "worldstate": "mode", "logiclevel": "logic", "goal": "goal",