From 1ced726d31981d6fbea9896a54ba1b2c82d55057 Mon Sep 17 00:00:00 2001 From: PoryGone <98504756+PoryGone@users.noreply.github.com> Date: Tue, 27 Jun 2023 17:38:58 -0400 Subject: [PATCH] SA2B: v2.2 Content Update (#1904) * Ice Trap Support * Support Animalsanity * Add option for controlling number of emblems in pool * Support Slow Trap * Support Cutscene Traps * Support Voice Shuffle * Handle Boss Rush goals * Fix create item reference to self.multiworld * Support Ringlink * Reduce beep frequency to 20 * Add Boss Rush Chaos Emerald Hunt Goal * Fix Eternal Engine - Pipe 1 logic * Add Chao voice shuffle * Remove unused option * Adjust wording of Required Cannon's Core Missions * Fix incorrect region assignment * Fix incorrect animal logics * Fix Chao Race tooltip * Remove Green Hill Animal Location * Add Location Count info to tooltips * Don't allow M4 first if animalsanity is active * Add Iron Boots to Standard Logic Egg Quarters 5 * Make Vanilla Boss Rush actually Vanilla * Increment Mod Version * Increment Data Package Version --------- Co-authored-by: RaspberrySpaceJam --- worlds/sa2b/GateBosses.py | 42 + worlds/sa2b/Items.py | 3 + worlds/sa2b/Locations.py | 520 +++++++++- worlds/sa2b/Missions.py | 8 +- worlds/sa2b/Names/ItemName.py | 4 + worlds/sa2b/Names/LocationName.py | 1518 +++++++++++++++++++---------- worlds/sa2b/Options.py | 138 ++- worlds/sa2b/Regions.py | 467 ++++++++- worlds/sa2b/Rules.py | 848 +++++++++++++++- worlds/sa2b/__init__.py | 104 +- 10 files changed, 3067 insertions(+), 585 deletions(-) diff --git a/worlds/sa2b/GateBosses.py b/worlds/sa2b/GateBosses.py index afbca993abcd..e89d4c4557ef 100644 --- a/worlds/sa2b/GateBosses.py +++ b/worlds/sa2b/GateBosses.py @@ -29,6 +29,14 @@ king_boom_boo: 10, } +extra_boss_rush_bosses_table = { + speed_characters_1: 11, + speed_characters_2: 12, + mech_characters_1: 13, + mech_characters_2: 14, + hunt_characters_1: 15, +} + all_gate_bosses_table = { **gate_bosses_no_requirements_table, **gate_bosses_with_requirements_table, @@ -42,6 +50,9 @@ def get_boss_name(boss: int): for key, value in gate_bosses_with_requirements_table.items(): if value == boss: return key + for key, value in extra_boss_rush_bosses_table.items(): + if value == boss: + return key def boss_has_requirement(boss: int): @@ -67,3 +78,34 @@ def get_gate_bosses(world, player: int): bosses: typing.Dict[int, int] = dict(zip(boss_gates, selected_bosses)) return bosses + + +def get_boss_rush_bosses(multiworld, player: int): + + if multiworld.boss_rush_shuffle[player] == 0: + boss_list_o = list(range(0, 16)) + boss_list_s = [5, 2, 0, 10, 8, 4, 3, 1, 6, 13, 7, 11, 9, 15, 14, 12] + + return dict(zip(boss_list_o, boss_list_s)) + elif multiworld.boss_rush_shuffle[player] == 1: + boss_list_o = list(range(0, 16)) + boss_list_s = boss_list_o.copy() + multiworld.random.shuffle(boss_list_s) + + return dict(zip(boss_list_o, boss_list_s)) + elif multiworld.boss_rush_shuffle[player] == 2: + boss_list_o = list(range(0, 16)) + boss_list_s = [multiworld.random.choice(boss_list_o) for i in range(0, 16)] + if 10 not in boss_list_s: + boss_list_s[multiworld.random.randint(0, 15)] = 10 + + return dict(zip(boss_list_o, boss_list_s)) + elif multiworld.boss_rush_shuffle[player] == 3: + boss_list_o = list(range(0, 16)) + boss_list_s = [multiworld.random.choice(boss_list_o)] * len(boss_list_o) + if 10 not in boss_list_s: + boss_list_s[multiworld.random.randint(0, 15)] = 10 + + return dict(zip(boss_list_o, boss_list_s)) + else: + return dict() diff --git a/worlds/sa2b/Items.py b/worlds/sa2b/Items.py index 28f71fca7a28..2b862c66afbf 100644 --- a/worlds/sa2b/Items.py +++ b/worlds/sa2b/Items.py @@ -79,6 +79,9 @@ def __init__(self, name, classification: ItemClassification, code: int = None, p ItemName.gravity_trap: ItemData(0xFF0034, False, True), ItemName.exposition_trap: ItemData(0xFF0035, False, True), #ItemName.darkness_trap: ItemData(0xFF0036, False, True), + ItemName.ice_trap: ItemData(0xFF0037, False, True), + ItemName.slow_trap: ItemData(0xFF0038, False, True), + ItemName.cutscene_trap: ItemData(0xFF0039, False, True), ItemName.pong_trap: ItemData(0xFF0050, False, True), } diff --git a/worlds/sa2b/Locations.py b/worlds/sa2b/Locations.py index 82fe3aa5bee9..461580bb6e39 100644 --- a/worlds/sa2b/Locations.py +++ b/worlds/sa2b/Locations.py @@ -733,6 +733,487 @@ class SA2BLocation(Location): LocationName.city_escape_omo_14: 0xFF09A0, } +animal_location_table = { + LocationName.city_escape_animal_1: 0xFF0B00, + LocationName.wild_canyon_animal_1: 0xFF0B01, + LocationName.prison_lane_animal_1: 0xFF0B02, + LocationName.metal_harbor_animal_1: 0xFF0B03, + LocationName.green_forest_animal_1: 0xFF0B04, + LocationName.pumpkin_hill_animal_1: 0xFF0B05, + LocationName.mission_street_animal_1: 0xFF0B06, + LocationName.aquatic_mine_animal_1: 0xFF0B07, + LocationName.hidden_base_animal_1: 0xFF0B09, + LocationName.pyramid_cave_animal_1: 0xFF0B0A, + LocationName.death_chamber_animal_1: 0xFF0B0B, + LocationName.eternal_engine_animal_1: 0xFF0B0C, + LocationName.meteor_herd_animal_1: 0xFF0B0D, + LocationName.crazy_gadget_animal_1: 0xFF0B0E, + LocationName.final_rush_animal_1: 0xFF0B0F, + + LocationName.iron_gate_animal_1: 0xFF0B10, + LocationName.dry_lagoon_animal_1: 0xFF0B11, + LocationName.sand_ocean_animal_1: 0xFF0B12, + LocationName.radical_highway_animal_1: 0xFF0B13, + LocationName.egg_quarters_animal_1: 0xFF0B14, + LocationName.lost_colony_animal_1: 0xFF0B15, + LocationName.weapons_bed_animal_1: 0xFF0B16, + LocationName.security_hall_animal_1: 0xFF0B17, + LocationName.white_jungle_animal_1: 0xFF0B18, + LocationName.sky_rail_animal_1: 0xFF0B1A, + LocationName.mad_space_animal_1: 0xFF0B1B, + LocationName.cosmic_wall_animal_1: 0xFF0B1C, + LocationName.final_chase_animal_1: 0xFF0B1D, + + LocationName.cannon_core_animal_1: 0xFF0B1E, + + LocationName.city_escape_animal_2: 0xFF0B20, + LocationName.wild_canyon_animal_2: 0xFF0B21, + LocationName.prison_lane_animal_2: 0xFF0B22, + LocationName.metal_harbor_animal_2: 0xFF0B23, + LocationName.green_forest_animal_2: 0xFF0B24, + LocationName.pumpkin_hill_animal_2: 0xFF0B25, + LocationName.mission_street_animal_2: 0xFF0B26, + LocationName.aquatic_mine_animal_2: 0xFF0B27, + LocationName.hidden_base_animal_2: 0xFF0B29, + LocationName.pyramid_cave_animal_2: 0xFF0B2A, + LocationName.death_chamber_animal_2: 0xFF0B2B, + LocationName.eternal_engine_animal_2: 0xFF0B2C, + LocationName.meteor_herd_animal_2: 0xFF0B2D, + LocationName.crazy_gadget_animal_2: 0xFF0B2E, + LocationName.final_rush_animal_2: 0xFF0B2F, + + LocationName.iron_gate_animal_2: 0xFF0B30, + LocationName.dry_lagoon_animal_2: 0xFF0B31, + LocationName.sand_ocean_animal_2: 0xFF0B32, + LocationName.radical_highway_animal_2: 0xFF0B33, + LocationName.egg_quarters_animal_2: 0xFF0B34, + LocationName.lost_colony_animal_2: 0xFF0B35, + LocationName.weapons_bed_animal_2: 0xFF0B36, + LocationName.security_hall_animal_2: 0xFF0B37, + LocationName.white_jungle_animal_2: 0xFF0B38, + LocationName.sky_rail_animal_2: 0xFF0B3A, + LocationName.mad_space_animal_2: 0xFF0B3B, + LocationName.cosmic_wall_animal_2: 0xFF0B3C, + LocationName.final_chase_animal_2: 0xFF0B3D, + + LocationName.cannon_core_animal_2: 0xFF0B3E, + + LocationName.city_escape_animal_3: 0xFF0B40, + LocationName.wild_canyon_animal_3: 0xFF0B41, + LocationName.prison_lane_animal_3: 0xFF0B42, + LocationName.metal_harbor_animal_3: 0xFF0B43, + LocationName.green_forest_animal_3: 0xFF0B44, + LocationName.pumpkin_hill_animal_3: 0xFF0B45, + LocationName.mission_street_animal_3: 0xFF0B46, + LocationName.aquatic_mine_animal_3: 0xFF0B47, + LocationName.hidden_base_animal_3: 0xFF0B49, + LocationName.pyramid_cave_animal_3: 0xFF0B4A, + LocationName.death_chamber_animal_3: 0xFF0B4B, + LocationName.eternal_engine_animal_3: 0xFF0B4C, + LocationName.meteor_herd_animal_3: 0xFF0B4D, + LocationName.crazy_gadget_animal_3: 0xFF0B4E, + LocationName.final_rush_animal_3: 0xFF0B4F, + + LocationName.iron_gate_animal_3: 0xFF0B50, + LocationName.dry_lagoon_animal_3: 0xFF0B51, + LocationName.sand_ocean_animal_3: 0xFF0B52, + LocationName.radical_highway_animal_3: 0xFF0B53, + LocationName.egg_quarters_animal_3: 0xFF0B54, + LocationName.lost_colony_animal_3: 0xFF0B55, + LocationName.weapons_bed_animal_3: 0xFF0B56, + LocationName.security_hall_animal_3: 0xFF0B57, + LocationName.white_jungle_animal_3: 0xFF0B58, + LocationName.sky_rail_animal_3: 0xFF0B5A, + LocationName.mad_space_animal_3: 0xFF0B5B, + LocationName.cosmic_wall_animal_3: 0xFF0B5C, + LocationName.final_chase_animal_3: 0xFF0B5D, + + LocationName.cannon_core_animal_3: 0xFF0B5E, + + LocationName.city_escape_animal_4: 0xFF0B60, + LocationName.wild_canyon_animal_4: 0xFF0B61, + LocationName.prison_lane_animal_4: 0xFF0B62, + LocationName.metal_harbor_animal_4: 0xFF0B63, + LocationName.green_forest_animal_4: 0xFF0B64, + LocationName.pumpkin_hill_animal_4: 0xFF0B65, + LocationName.mission_street_animal_4: 0xFF0B66, + LocationName.aquatic_mine_animal_4: 0xFF0B67, + LocationName.hidden_base_animal_4: 0xFF0B69, + LocationName.pyramid_cave_animal_4: 0xFF0B6A, + LocationName.death_chamber_animal_4: 0xFF0B6B, + LocationName.eternal_engine_animal_4: 0xFF0B6C, + LocationName.meteor_herd_animal_4: 0xFF0B6D, + LocationName.crazy_gadget_animal_4: 0xFF0B6E, + LocationName.final_rush_animal_4: 0xFF0B6F, + + LocationName.iron_gate_animal_4: 0xFF0B70, + LocationName.dry_lagoon_animal_4: 0xFF0B71, + LocationName.sand_ocean_animal_4: 0xFF0B72, + LocationName.radical_highway_animal_4: 0xFF0B73, + LocationName.egg_quarters_animal_4: 0xFF0B74, + LocationName.lost_colony_animal_4: 0xFF0B75, + LocationName.weapons_bed_animal_4: 0xFF0B76, + LocationName.security_hall_animal_4: 0xFF0B77, + LocationName.white_jungle_animal_4: 0xFF0B78, + LocationName.sky_rail_animal_4: 0xFF0B7A, + LocationName.mad_space_animal_4: 0xFF0B7B, + LocationName.cosmic_wall_animal_4: 0xFF0B7C, + LocationName.final_chase_animal_4: 0xFF0B7D, + + LocationName.cannon_core_animal_4: 0xFF0B7E, + + LocationName.city_escape_animal_5: 0xFF0B80, + LocationName.wild_canyon_animal_5: 0xFF0B81, + LocationName.prison_lane_animal_5: 0xFF0B82, + LocationName.metal_harbor_animal_5: 0xFF0B83, + LocationName.green_forest_animal_5: 0xFF0B84, + LocationName.pumpkin_hill_animal_5: 0xFF0B85, + LocationName.mission_street_animal_5: 0xFF0B86, + LocationName.aquatic_mine_animal_5: 0xFF0B87, + LocationName.hidden_base_animal_5: 0xFF0B89, + LocationName.pyramid_cave_animal_5: 0xFF0B8A, + LocationName.death_chamber_animal_5: 0xFF0B8B, + LocationName.eternal_engine_animal_5: 0xFF0B8C, + LocationName.meteor_herd_animal_5: 0xFF0B8D, + LocationName.crazy_gadget_animal_5: 0xFF0B8E, + LocationName.final_rush_animal_5: 0xFF0B8F, + + LocationName.iron_gate_animal_5: 0xFF0B90, + LocationName.dry_lagoon_animal_5: 0xFF0B91, + LocationName.sand_ocean_animal_5: 0xFF0B92, + LocationName.radical_highway_animal_5: 0xFF0B93, + LocationName.egg_quarters_animal_5: 0xFF0B94, + LocationName.lost_colony_animal_5: 0xFF0B95, + LocationName.weapons_bed_animal_5: 0xFF0B96, + LocationName.security_hall_animal_5: 0xFF0B97, + LocationName.white_jungle_animal_5: 0xFF0B98, + LocationName.sky_rail_animal_5: 0xFF0B9A, + LocationName.mad_space_animal_5: 0xFF0B9B, + LocationName.cosmic_wall_animal_5: 0xFF0B9C, + LocationName.final_chase_animal_5: 0xFF0B9D, + + LocationName.cannon_core_animal_5: 0xFF0B9E, + + LocationName.city_escape_animal_6: 0xFF0BA0, + LocationName.wild_canyon_animal_6: 0xFF0BA1, + LocationName.prison_lane_animal_6: 0xFF0BA2, + LocationName.metal_harbor_animal_6: 0xFF0BA3, + LocationName.green_forest_animal_6: 0xFF0BA4, + LocationName.pumpkin_hill_animal_6: 0xFF0BA5, + LocationName.mission_street_animal_6: 0xFF0BA6, + LocationName.aquatic_mine_animal_6: 0xFF0BA7, + LocationName.hidden_base_animal_6: 0xFF0BA9, + LocationName.pyramid_cave_animal_6: 0xFF0BAA, + LocationName.death_chamber_animal_6: 0xFF0BAB, + LocationName.eternal_engine_animal_6: 0xFF0BAC, + LocationName.meteor_herd_animal_6: 0xFF0BAD, + LocationName.crazy_gadget_animal_6: 0xFF0BAE, + LocationName.final_rush_animal_6: 0xFF0BAF, + + LocationName.iron_gate_animal_6: 0xFF0BB0, + LocationName.dry_lagoon_animal_6: 0xFF0BB1, + LocationName.sand_ocean_animal_6: 0xFF0BB2, + LocationName.radical_highway_animal_6: 0xFF0BB3, + LocationName.egg_quarters_animal_6: 0xFF0BB4, + LocationName.lost_colony_animal_6: 0xFF0BB5, + LocationName.weapons_bed_animal_6: 0xFF0BB6, + LocationName.security_hall_animal_6: 0xFF0BB7, + LocationName.white_jungle_animal_6: 0xFF0BB8, + LocationName.sky_rail_animal_6: 0xFF0BBA, + LocationName.mad_space_animal_6: 0xFF0BBB, + LocationName.cosmic_wall_animal_6: 0xFF0BBC, + LocationName.final_chase_animal_6: 0xFF0BBD, + + LocationName.cannon_core_animal_6: 0xFF0BBE, + + LocationName.city_escape_animal_7: 0xFF0BC0, + LocationName.wild_canyon_animal_7: 0xFF0BC1, + LocationName.prison_lane_animal_7: 0xFF0BC2, + LocationName.metal_harbor_animal_7: 0xFF0BC3, + LocationName.green_forest_animal_7: 0xFF0BC4, + LocationName.pumpkin_hill_animal_7: 0xFF0BC5, + LocationName.mission_street_animal_7: 0xFF0BC6, + LocationName.aquatic_mine_animal_7: 0xFF0BC7, + LocationName.hidden_base_animal_7: 0xFF0BC9, + LocationName.pyramid_cave_animal_7: 0xFF0BCA, + LocationName.death_chamber_animal_7: 0xFF0BCB, + LocationName.eternal_engine_animal_7: 0xFF0BCC, + LocationName.meteor_herd_animal_7: 0xFF0BCD, + LocationName.crazy_gadget_animal_7: 0xFF0BCE, + LocationName.final_rush_animal_7: 0xFF0BCF, + + LocationName.iron_gate_animal_7: 0xFF0BD0, + LocationName.dry_lagoon_animal_7: 0xFF0BD1, + LocationName.sand_ocean_animal_7: 0xFF0BD2, + LocationName.radical_highway_animal_7: 0xFF0BD3, + LocationName.egg_quarters_animal_7: 0xFF0BD4, + LocationName.lost_colony_animal_7: 0xFF0BD5, + LocationName.weapons_bed_animal_7: 0xFF0BD6, + LocationName.security_hall_animal_7: 0xFF0BD7, + LocationName.white_jungle_animal_7: 0xFF0BD8, + LocationName.sky_rail_animal_7: 0xFF0BDA, + LocationName.mad_space_animal_7: 0xFF0BDB, + LocationName.cosmic_wall_animal_7: 0xFF0BDC, + LocationName.final_chase_animal_7: 0xFF0BDD, + + LocationName.cannon_core_animal_7: 0xFF0BDE, + + LocationName.city_escape_animal_8: 0xFF0BE0, + LocationName.wild_canyon_animal_8: 0xFF0BE1, + LocationName.prison_lane_animal_8: 0xFF0BE2, + LocationName.metal_harbor_animal_8: 0xFF0BE3, + LocationName.green_forest_animal_8: 0xFF0BE4, + LocationName.pumpkin_hill_animal_8: 0xFF0BE5, + LocationName.mission_street_animal_8: 0xFF0BE6, + LocationName.aquatic_mine_animal_8: 0xFF0BE7, + LocationName.hidden_base_animal_8: 0xFF0BE9, + LocationName.pyramid_cave_animal_8: 0xFF0BEA, + LocationName.death_chamber_animal_8: 0xFF0BEB, + LocationName.eternal_engine_animal_8: 0xFF0BEC, + LocationName.meteor_herd_animal_8: 0xFF0BED, + LocationName.crazy_gadget_animal_8: 0xFF0BEE, + LocationName.final_rush_animal_8: 0xFF0BEF, + + LocationName.iron_gate_animal_8: 0xFF0BF0, + LocationName.dry_lagoon_animal_8: 0xFF0BF1, + LocationName.sand_ocean_animal_8: 0xFF0BF2, + LocationName.radical_highway_animal_8: 0xFF0BF3, + LocationName.egg_quarters_animal_8: 0xFF0BF4, + LocationName.lost_colony_animal_8: 0xFF0BF5, + LocationName.weapons_bed_animal_8: 0xFF0BF6, + LocationName.security_hall_animal_8: 0xFF0BF7, + LocationName.white_jungle_animal_8: 0xFF0BF8, + LocationName.sky_rail_animal_8: 0xFF0BFA, + LocationName.mad_space_animal_8: 0xFF0BFB, + LocationName.cosmic_wall_animal_8: 0xFF0BFC, + LocationName.final_chase_animal_8: 0xFF0BFD, + + LocationName.cannon_core_animal_8: 0xFF0BFE, + + LocationName.city_escape_animal_9: 0xFF0C00, + LocationName.wild_canyon_animal_9: 0xFF0C01, + LocationName.prison_lane_animal_9: 0xFF0C02, + LocationName.metal_harbor_animal_9: 0xFF0C03, + LocationName.green_forest_animal_9: 0xFF0C04, + LocationName.pumpkin_hill_animal_9: 0xFF0C05, + LocationName.mission_street_animal_9: 0xFF0C06, + LocationName.aquatic_mine_animal_9: 0xFF0C07, + LocationName.hidden_base_animal_9: 0xFF0C09, + LocationName.pyramid_cave_animal_9: 0xFF0C0A, + LocationName.death_chamber_animal_9: 0xFF0C0B, + LocationName.eternal_engine_animal_9: 0xFF0C0C, + LocationName.meteor_herd_animal_9: 0xFF0C0D, + LocationName.crazy_gadget_animal_9: 0xFF0C0E, + LocationName.final_rush_animal_9: 0xFF0C0F, + + LocationName.iron_gate_animal_9: 0xFF0C10, + LocationName.dry_lagoon_animal_9: 0xFF0C11, + LocationName.sand_ocean_animal_9: 0xFF0C12, + LocationName.radical_highway_animal_9: 0xFF0C13, + LocationName.egg_quarters_animal_9: 0xFF0C14, + LocationName.lost_colony_animal_9: 0xFF0C15, + LocationName.weapons_bed_animal_9: 0xFF0C16, + LocationName.white_jungle_animal_9: 0xFF0C18, + LocationName.sky_rail_animal_9: 0xFF0C1A, + LocationName.mad_space_animal_9: 0xFF0C1B, + LocationName.cosmic_wall_animal_9: 0xFF0C1C, + LocationName.final_chase_animal_9: 0xFF0C1D, + + LocationName.cannon_core_animal_9: 0xFF0C1E, + + LocationName.city_escape_animal_10: 0xFF0C20, + LocationName.wild_canyon_animal_10: 0xFF0C21, + LocationName.prison_lane_animal_10: 0xFF0C22, + LocationName.metal_harbor_animal_10: 0xFF0C23, + LocationName.green_forest_animal_10: 0xFF0C24, + LocationName.pumpkin_hill_animal_10: 0xFF0C25, + LocationName.mission_street_animal_10: 0xFF0C26, + LocationName.aquatic_mine_animal_10: 0xFF0C27, + LocationName.hidden_base_animal_10: 0xFF0C29, + LocationName.pyramid_cave_animal_10: 0xFF0C2A, + LocationName.death_chamber_animal_10: 0xFF0C2B, + LocationName.eternal_engine_animal_10: 0xFF0C2C, + LocationName.meteor_herd_animal_10: 0xFF0C2D, + LocationName.crazy_gadget_animal_10: 0xFF0C2E, + LocationName.final_rush_animal_10: 0xFF0C2F, + + LocationName.iron_gate_animal_10: 0xFF0C30, + LocationName.dry_lagoon_animal_10: 0xFF0C31, + LocationName.sand_ocean_animal_10: 0xFF0C32, + LocationName.radical_highway_animal_10: 0xFF0C33, + LocationName.egg_quarters_animal_10: 0xFF0C34, + LocationName.lost_colony_animal_10: 0xFF0C35, + LocationName.weapons_bed_animal_10: 0xFF0C36, + LocationName.white_jungle_animal_10: 0xFF0C38, + LocationName.sky_rail_animal_10: 0xFF0C3A, + LocationName.mad_space_animal_10: 0xFF0C3B, + LocationName.cosmic_wall_animal_10: 0xFF0C3C, + LocationName.final_chase_animal_10: 0xFF0C3D, + + LocationName.cannon_core_animal_10: 0xFF0C3E, + + LocationName.city_escape_animal_11: 0xFF0C40, + LocationName.prison_lane_animal_11: 0xFF0C42, + LocationName.metal_harbor_animal_11: 0xFF0C43, + LocationName.green_forest_animal_11: 0xFF0C44, + LocationName.pumpkin_hill_animal_11: 0xFF0C45, + LocationName.mission_street_animal_11: 0xFF0C46, + LocationName.hidden_base_animal_11: 0xFF0C49, + LocationName.pyramid_cave_animal_11: 0xFF0C4A, + LocationName.eternal_engine_animal_11: 0xFF0C4C, + LocationName.meteor_herd_animal_11: 0xFF0C4D, + LocationName.crazy_gadget_animal_11: 0xFF0C4E, + LocationName.final_rush_animal_11: 0xFF0C4F, + + LocationName.iron_gate_animal_11: 0xFF0C50, + LocationName.sand_ocean_animal_11: 0xFF0C52, + LocationName.radical_highway_animal_11: 0xFF0C53, + LocationName.lost_colony_animal_11: 0xFF0C55, + LocationName.weapons_bed_animal_11: 0xFF0C56, + LocationName.white_jungle_animal_11: 0xFF0C58, + LocationName.sky_rail_animal_11: 0xFF0C5A, + LocationName.cosmic_wall_animal_11: 0xFF0C5C, + LocationName.final_chase_animal_11: 0xFF0C5D, + + LocationName.cannon_core_animal_11: 0xFF0C5E, + + LocationName.city_escape_animal_12: 0xFF0C60, + LocationName.prison_lane_animal_12: 0xFF0C62, + LocationName.metal_harbor_animal_12: 0xFF0C63, + LocationName.green_forest_animal_12: 0xFF0C64, + LocationName.mission_street_animal_12: 0xFF0C66, + LocationName.hidden_base_animal_12: 0xFF0C69, + LocationName.pyramid_cave_animal_12: 0xFF0C6A, + LocationName.eternal_engine_animal_12: 0xFF0C6C, + LocationName.crazy_gadget_animal_12: 0xFF0C6E, + LocationName.final_rush_animal_12: 0xFF0C6F, + + LocationName.iron_gate_animal_12: 0xFF0C70, + LocationName.sand_ocean_animal_12: 0xFF0C72, + LocationName.radical_highway_animal_12: 0xFF0C73, + LocationName.lost_colony_animal_12: 0xFF0C75, + LocationName.weapons_bed_animal_12: 0xFF0C76, + LocationName.white_jungle_animal_12: 0xFF0C78, + LocationName.sky_rail_animal_12: 0xFF0C7A, + LocationName.cosmic_wall_animal_12: 0xFF0C7C, + LocationName.final_chase_animal_12: 0xFF0C7D, + + LocationName.cannon_core_animal_12: 0xFF0C7E, + + LocationName.city_escape_animal_13: 0xFF0C80, + LocationName.prison_lane_animal_13: 0xFF0C82, + LocationName.metal_harbor_animal_13: 0xFF0C83, + LocationName.green_forest_animal_13: 0xFF0C84, + LocationName.mission_street_animal_13: 0xFF0C86, + LocationName.hidden_base_animal_13: 0xFF0C89, + LocationName.pyramid_cave_animal_13: 0xFF0C8A, + LocationName.eternal_engine_animal_13: 0xFF0C8C, + LocationName.crazy_gadget_animal_13: 0xFF0C8E, + LocationName.final_rush_animal_13: 0xFF0C8F, + + LocationName.iron_gate_animal_13: 0xFF0C90, + LocationName.sand_ocean_animal_13: 0xFF0C92, + LocationName.radical_highway_animal_13: 0xFF0C93, + LocationName.lost_colony_animal_13: 0xFF0C95, + LocationName.weapons_bed_animal_13: 0xFF0C96, + LocationName.white_jungle_animal_13: 0xFF0C98, + LocationName.sky_rail_animal_13: 0xFF0C9A, + LocationName.cosmic_wall_animal_13: 0xFF0C9C, + LocationName.final_chase_animal_13: 0xFF0C9D, + + LocationName.cannon_core_animal_13: 0xFF0C9E, + + LocationName.city_escape_animal_14: 0xFF0CA0, + LocationName.prison_lane_animal_14: 0xFF0CA2, + LocationName.metal_harbor_animal_14: 0xFF0CA3, + LocationName.green_forest_animal_14: 0xFF0CA4, + LocationName.mission_street_animal_14: 0xFF0CA6, + LocationName.hidden_base_animal_14: 0xFF0CA9, + LocationName.pyramid_cave_animal_14: 0xFF0CAA, + LocationName.eternal_engine_animal_14: 0xFF0CAC, + LocationName.crazy_gadget_animal_14: 0xFF0CAE, + LocationName.final_rush_animal_14: 0xFF0CAF, + + LocationName.iron_gate_animal_14: 0xFF0CB0, + LocationName.sand_ocean_animal_14: 0xFF0CB2, + LocationName.radical_highway_animal_14: 0xFF0CB3, + LocationName.lost_colony_animal_14: 0xFF0CB5, + LocationName.weapons_bed_animal_14: 0xFF0CB6, + LocationName.white_jungle_animal_14: 0xFF0CB8, + LocationName.sky_rail_animal_14: 0xFF0CBA, + LocationName.cosmic_wall_animal_14: 0xFF0CBC, + LocationName.final_chase_animal_14: 0xFF0CBD, + + LocationName.cannon_core_animal_14: 0xFF0CBE, + + LocationName.city_escape_animal_15: 0xFF0CC0, + LocationName.prison_lane_animal_15: 0xFF0CC2, + LocationName.green_forest_animal_15: 0xFF0CC4, + LocationName.mission_street_animal_15: 0xFF0CC6, + LocationName.hidden_base_animal_15: 0xFF0CC9, + LocationName.pyramid_cave_animal_15: 0xFF0CCA, + LocationName.eternal_engine_animal_15: 0xFF0CCC, + LocationName.crazy_gadget_animal_15: 0xFF0CCE, + LocationName.final_rush_animal_15: 0xFF0CCF, + + LocationName.iron_gate_animal_15: 0xFF0CD0, + LocationName.sand_ocean_animal_15: 0xFF0CD2, + LocationName.radical_highway_animal_15: 0xFF0CD3, + LocationName.weapons_bed_animal_15: 0xFF0CD6, + LocationName.white_jungle_animal_15: 0xFF0CD8, + LocationName.sky_rail_animal_15: 0xFF0CDA, + LocationName.cosmic_wall_animal_15: 0xFF0CDC, + LocationName.final_chase_animal_15: 0xFF0CDD, + + LocationName.cannon_core_animal_15: 0xFF0CDE, + + LocationName.city_escape_animal_16: 0xFF0CE0, + LocationName.green_forest_animal_16: 0xFF0CE4, + LocationName.mission_street_animal_16: 0xFF0CE6, + LocationName.pyramid_cave_animal_16: 0xFF0CEA, + LocationName.crazy_gadget_animal_16: 0xFF0CEE, + LocationName.final_rush_animal_16: 0xFF0CEF, + + LocationName.radical_highway_animal_16: 0xFF0CF3, + LocationName.white_jungle_animal_16: 0xFF0CF8, + LocationName.sky_rail_animal_16: 0xFF0CFA, + LocationName.final_chase_animal_16: 0xFF0CFD, + + LocationName.cannon_core_animal_16: 0xFF0CFE, + + LocationName.city_escape_animal_17: 0xFF0D00, + LocationName.green_forest_animal_17: 0xFF0D04, + LocationName.pyramid_cave_animal_17: 0xFF0D0A, + + LocationName.radical_highway_animal_17: 0xFF0D13, + LocationName.sky_rail_animal_17: 0xFF0D1A, + LocationName.final_chase_animal_17: 0xFF0D1D, + + LocationName.cannon_core_animal_17: 0xFF0D1E, + + LocationName.city_escape_animal_18: 0xFF0D20, + LocationName.green_forest_animal_18: 0xFF0D24, + LocationName.pyramid_cave_animal_18: 0xFF0D2A, + + LocationName.radical_highway_animal_18: 0xFF0D33, + LocationName.sky_rail_animal_18: 0xFF0D3A, + + LocationName.cannon_core_animal_18: 0xFF0D3E, + + LocationName.city_escape_animal_19: 0xFF0D40, + LocationName.pyramid_cave_animal_19: 0xFF0D4A, + + LocationName.radical_highway_animal_19: 0xFF0D53, + LocationName.sky_rail_animal_19: 0xFF0D5A, + + LocationName.cannon_core_animal_19: 0xFF0D5E, + + LocationName.city_escape_animal_20: 0xFF0D60, + + LocationName.radical_highway_animal_20: 0xFF0D73, + LocationName.sky_rail_animal_20: 0xFF0D7A, +} + boss_gate_location_table = { LocationName.gate_1_boss: 0xFF0100, LocationName.gate_2_boss: 0xFF0101, @@ -741,6 +1222,25 @@ class SA2BLocation(Location): LocationName.gate_5_boss: 0xFF0104, } +boss_rush_location_table = { + LocationName.boss_rush_1: 0xFF0105, + LocationName.boss_rush_2: 0xFF0106, + LocationName.boss_rush_3: 0xFF0107, + LocationName.boss_rush_4: 0xFF0108, + LocationName.boss_rush_5: 0xFF0109, + LocationName.boss_rush_6: 0xFF010A, + LocationName.boss_rush_7: 0xFF010B, + LocationName.boss_rush_8: 0xFF010C, + LocationName.boss_rush_9: 0xFF010D, + LocationName.boss_rush_10: 0xFF010E, + LocationName.boss_rush_11: 0xFF010F, + LocationName.boss_rush_12: 0xFF0110, + LocationName.boss_rush_13: 0xFF0111, + LocationName.boss_rush_14: 0xFF0112, + LocationName.boss_rush_15: 0xFF0113, + LocationName.boss_rush_16: 0xFF0114, +} + chao_garden_beginner_location_table = { LocationName.chao_race_crab_pool_1: 0xFF0200, LocationName.chao_race_crab_pool_2: 0xFF0201, @@ -862,6 +1362,10 @@ class SA2BLocation(Location): LocationName.green_hill_chao_1: 0xFF041F, } +green_hill_animal_location_table = { + #LocationName.green_hill_animal_1: 0xFF0B1F, # Disabled for technical reasons, may return +} + final_boss_location_table = { # LocationName.biolizard: 0xFF003F, LocationName.finalhazard: 0xFF005F, @@ -875,11 +1379,13 @@ class SA2BLocation(Location): **mission_location_table, **upgrade_location_table, **boss_gate_location_table, + **boss_rush_location_table, **chao_key_location_table, **pipe_location_table, **hidden_whistle_location_table, **beetle_location_table, **omochao_location_table, + **animal_location_table, **chao_garden_beginner_location_table, **chao_garden_intermediate_location_table, **chao_garden_expert_location_table, @@ -889,6 +1395,7 @@ class SA2BLocation(Location): **kart_race_mini_location_table, **green_hill_location_table, **green_hill_chao_location_table, + **green_hill_animal_location_table, **final_boss_location_table, **grand_prix_location_table, } @@ -975,6 +1482,9 @@ def setup_locations(world: MultiWorld, player: int, mission_map: typing.Dict[int if world.omosanity[player]: location_table.update({**omochao_location_table}) + if world.animalsanity[player]: + location_table.update({**animal_location_table}) + if world.kart_race_checks[player] == 2: location_table.update({**kart_race_beginner_location_table}) location_table.update({**kart_race_standard_location_table}) @@ -982,15 +1492,21 @@ def setup_locations(world: MultiWorld, player: int, mission_map: typing.Dict[int elif world.kart_race_checks[player] == 1: location_table.update({**kart_race_mini_location_table}) - if world.goal[player].value == 0 or world.goal[player].value == 2: + if world.goal[player].value in [0, 2, 4, 5, 6]: location_table.update({**final_boss_location_table}) - if world.goal[player].value == 1 or world.goal[player].value == 2: + if world.goal[player].value in [1, 2]: location_table.update({**green_hill_location_table}) if world.keysanity[player]: location_table.update({**green_hill_chao_location_table}) + if world.animalsanity[player]: + location_table.update({**green_hill_animal_location_table}) + + if world.goal[player].value in [4, 5, 6]: + location_table.update({**boss_rush_location_table}) + if world.chao_garden_difficulty[player].value >= 1: chao_location_table.update({**chao_garden_beginner_location_table}) if world.chao_garden_difficulty[player].value >= 2: diff --git a/worlds/sa2b/Missions.py b/worlds/sa2b/Missions.py index fbff62c13615..1fcd2aed87c4 100644 --- a/worlds/sa2b/Missions.py +++ b/worlds/sa2b/Missions.py @@ -190,7 +190,7 @@ "Mad Space - ", "Cosmic Wall - ", "Final Chase - ", - "Cannon Core - ", + "Cannon's Core - ", ] def get_mission_count_table(multiworld: MultiWorld, player: int): @@ -290,9 +290,13 @@ def get_mission_table(multiworld: MultiWorld, player: int): # The first mission must be M1, M2, M3, or M4 first_mission = 1 + first_mission_options = [1, 2, 3] + + if not multiworld.animalsanity[player]: + first_mission_options.append(4) if multiworld.mission_shuffle[player]: - first_mission = multiworld.random.choice([mission for mission in level_active_missions if mission in [1, 2, 3, 4]]) + first_mission = multiworld.random.choice([mission for mission in level_active_missions if mission in first_mission_options]) level_active_missions.remove(first_mission) diff --git a/worlds/sa2b/Names/ItemName.py b/worlds/sa2b/Names/ItemName.py index 7fa34ea722b9..eb088ceb4057 100644 --- a/worlds/sa2b/Names/ItemName.py +++ b/worlds/sa2b/Names/ItemName.py @@ -51,6 +51,10 @@ gravity_trap = "Gravity Trap" exposition_trap = "Exposition Trap" darkness_trap = "Darkness Trap" +ice_trap = "Ice Trap" +slow_trap = "Slow Trap" +cutscene_trap = "Cutscene Trap" + pong_trap = "Pong Trap" white_emerald = "White Chaos Emerald" diff --git a/worlds/sa2b/Names/LocationName.py b/worlds/sa2b/Names/LocationName.py index 9a970bda7521..f0638430fc50 100644 --- a/worlds/sa2b/Names/LocationName.py +++ b/worlds/sa2b/Names/LocationName.py @@ -1,513 +1,879 @@ # Sonic Mission Definitions -city_escape_1 = "City Escape - 1" -city_escape_2 = "City Escape - 2" -city_escape_3 = "City Escape - 3" -city_escape_4 = "City Escape - 4" -city_escape_5 = "City Escape - 5" -city_escape_chao_1 = "City Escape - Chao Key 1" -city_escape_chao_2 = "City Escape - Chao Key 2" -city_escape_chao_3 = "City Escape - Chao Key 3" -city_escape_pipe_1 = "City Escape - Pipe 1" -city_escape_pipe_2 = "City Escape - Pipe 2" -city_escape_pipe_3 = "City Escape - Pipe 3" -city_escape_pipe_4 = "City Escape - Pipe 4" -city_escape_hidden_1 = "City Escape - Hidden 1" -city_escape_hidden_2 = "City Escape - Hidden 2" -city_escape_hidden_3 = "City Escape - Hidden 3" -city_escape_hidden_4 = "City Escape - Hidden 4" -city_escape_hidden_5 = "City Escape - Hidden 5" -city_escape_omo_1 = "City Escape - Omochao 1" -city_escape_omo_2 = "City Escape - Omochao 2" -city_escape_omo_3 = "City Escape - Omochao 3" -city_escape_omo_4 = "City Escape - Omochao 4" -city_escape_omo_5 = "City Escape - Omochao 5" -city_escape_omo_6 = "City Escape - Omochao 6" -city_escape_omo_7 = "City Escape - Omochao 7" -city_escape_omo_8 = "City Escape - Omochao 8" -city_escape_omo_9 = "City Escape - Omochao 9" -city_escape_omo_10 = "City Escape - Omochao 10" -city_escape_omo_11 = "City Escape - Omochao 11" -city_escape_omo_12 = "City Escape - Omochao 12" -city_escape_omo_13 = "City Escape - Omochao 13" -city_escape_omo_14 = "City Escape - Omochao 14" -city_escape_beetle = "City Escape - Gold Beetle" -city_escape_upgrade = "City Escape - Upgrade" -metal_harbor_1 = "Metal Harbor - 1" -metal_harbor_2 = "Metal Harbor - 2" -metal_harbor_3 = "Metal Harbor - 3" -metal_harbor_4 = "Metal Harbor - 4" -metal_harbor_5 = "Metal Harbor - 5" -metal_harbor_chao_1 = "Metal Harbor - Chao Key 1" -metal_harbor_chao_2 = "Metal Harbor - Chao Key 2" -metal_harbor_chao_3 = "Metal Harbor - Chao Key 3" -metal_harbor_pipe_1 = "Metal Harbor - Pipe 1" -metal_harbor_omo_1 = "Metal Harbor - Omochao 1" -metal_harbor_omo_2 = "Metal Harbor - Omochao 2" -metal_harbor_omo_3 = "Metal Harbor - Omochao 3" -metal_harbor_omo_4 = "Metal Harbor - Omochao 4" -metal_harbor_omo_5 = "Metal Harbor - Omochao 5" -metal_harbor_beetle = "Metal Harbor - Gold Beetle" -metal_harbor_upgrade = "Metal Harbor - Upgrade" -green_forest_1 = "Green Forest - 1" -green_forest_2 = "Green Forest - 2" -green_forest_3 = "Green Forest - 3" -green_forest_4 = "Green Forest - 4" -green_forest_5 = "Green Forest - 5" -green_forest_chao_1 = "Green Forest - Chao Key 1" -green_forest_chao_2 = "Green Forest - Chao Key 2" -green_forest_chao_3 = "Green Forest - Chao Key 3" -green_forest_pipe_1 = "Green Forest - Pipe 1" -green_forest_pipe_2 = "Green Forest - Pipe 2" -green_forest_hidden_1 = "Green Forest - Hidden 1" -green_forest_hidden_2 = "Green Forest - Hidden 2" -green_forest_hidden_3 = "Green Forest - Hidden 3" -green_forest_hidden_4 = "Green Forest - Hidden 4" -green_forest_beetle = "Green Forest - Gold Beetle" -green_forest_upgrade = "Green Forest - Upgrade" -pyramid_cave_1 = "Pyramid Cave - 1" -pyramid_cave_2 = "Pyramid Cave - 2" -pyramid_cave_3 = "Pyramid Cave - 3" -pyramid_cave_4 = "Pyramid Cave - 4" -pyramid_cave_5 = "Pyramid Cave - 5" -pyramid_cave_chao_1 = "Pyramid Cave - Chao Key 1" -pyramid_cave_chao_2 = "Pyramid Cave - Chao Key 2" -pyramid_cave_chao_3 = "Pyramid Cave - Chao Key 3" -pyramid_cave_pipe_1 = "Pyramid Cave - Pipe 1" -pyramid_cave_pipe_2 = "Pyramid Cave - Pipe 2" -pyramid_cave_pipe_3 = "Pyramid Cave - Pipe 3" -pyramid_cave_pipe_4 = "Pyramid Cave - Pipe 4" -pyramid_cave_omo_1 = "Pyramid Cave - Omochao 1" -pyramid_cave_omo_2 = "Pyramid Cave - Omochao 2" -pyramid_cave_omo_3 = "Pyramid Cave - Omochao 3" -pyramid_cave_omo_4 = "Pyramid Cave - Omochao 4" -pyramid_cave_beetle = "Pyramid Cave - Gold Beetle" -pyramid_cave_upgrade = "Pyramid Cave - Upgrade" -crazy_gadget_1 = "Crazy Gadget - 1" -crazy_gadget_2 = "Crazy Gadget - 2" -crazy_gadget_3 = "Crazy Gadget - 3" -crazy_gadget_4 = "Crazy Gadget - 4" -crazy_gadget_5 = "Crazy Gadget - 5" -crazy_gadget_chao_1 = "Crazy Gadget - Chao Key 1" -crazy_gadget_chao_2 = "Crazy Gadget - Chao Key 2" -crazy_gadget_chao_3 = "Crazy Gadget - Chao Key 3" -crazy_gadget_pipe_1 = "Crazy Gadget - Pipe 1" -crazy_gadget_pipe_2 = "Crazy Gadget - Pipe 2" -crazy_gadget_pipe_3 = "Crazy Gadget - Pipe 3" -crazy_gadget_pipe_4 = "Crazy Gadget - Pipe 4" -crazy_gadget_hidden_1 = "Crazy Gadget - Hidden 1" -crazy_gadget_omo_1 = "Crazy Gadget - Omochao 1" -crazy_gadget_omo_2 = "Crazy Gadget - Omochao 2" -crazy_gadget_omo_3 = "Crazy Gadget - Omochao 3" -crazy_gadget_omo_4 = "Crazy Gadget - Omochao 4" -crazy_gadget_omo_5 = "Crazy Gadget - Omochao 5" -crazy_gadget_omo_6 = "Crazy Gadget - Omochao 6" -crazy_gadget_omo_7 = "Crazy Gadget - Omochao 7" -crazy_gadget_omo_8 = "Crazy Gadget - Omochao 8" -crazy_gadget_omo_9 = "Crazy Gadget - Omochao 9" -crazy_gadget_omo_10 = "Crazy Gadget - Omochao 10" -crazy_gadget_omo_11 = "Crazy Gadget - Omochao 11" -crazy_gadget_omo_12 = "Crazy Gadget - Omochao 12" -crazy_gadget_omo_13 = "Crazy Gadget - Omochao 13" -crazy_gadget_beetle = "Crazy Gadget - Gold Beetle" -crazy_gadget_upgrade = "Crazy Gadget - Upgrade" -final_rush_1 = "Final Rush - 1" -final_rush_2 = "Final Rush - 2" -final_rush_3 = "Final Rush - 3" -final_rush_4 = "Final Rush - 4" -final_rush_5 = "Final Rush - 5" -final_rush_chao_1 = "Final Rush - Chao Key 1" -final_rush_chao_2 = "Final Rush - Chao Key 2" -final_rush_chao_3 = "Final Rush - Chao Key 3" -final_rush_pipe_1 = "Final Rush - Pipe 1" -final_rush_pipe_2 = "Final Rush - Pipe 2" -final_rush_omo_1 = "Final Rush - Omochao 1" -final_rush_omo_2 = "Final Rush - Omochao 2" -final_rush_omo_3 = "Final Rush - Omochao 3" -final_rush_beetle = "Final Rush - Gold Beetle" -final_rush_upgrade = "Final Rush - Upgrade" +city_escape_1 = "City Escape - 1" +city_escape_2 = "City Escape - 2" +city_escape_3 = "City Escape - 3" +city_escape_4 = "City Escape - 4" +city_escape_5 = "City Escape - 5" +city_escape_chao_1 = "City Escape - Chao Key 1" +city_escape_chao_2 = "City Escape - Chao Key 2" +city_escape_chao_3 = "City Escape - Chao Key 3" +city_escape_pipe_1 = "City Escape - Pipe 1" +city_escape_pipe_2 = "City Escape - Pipe 2" +city_escape_pipe_3 = "City Escape - Pipe 3" +city_escape_pipe_4 = "City Escape - Pipe 4" +city_escape_hidden_1 = "City Escape - Hidden 1" +city_escape_hidden_2 = "City Escape - Hidden 2" +city_escape_hidden_3 = "City Escape - Hidden 3" +city_escape_hidden_4 = "City Escape - Hidden 4" +city_escape_hidden_5 = "City Escape - Hidden 5" +city_escape_omo_1 = "City Escape - Omochao 1" +city_escape_omo_2 = "City Escape - Omochao 2" +city_escape_omo_3 = "City Escape - Omochao 3" +city_escape_omo_4 = "City Escape - Omochao 4" +city_escape_omo_5 = "City Escape - Omochao 5" +city_escape_omo_6 = "City Escape - Omochao 6" +city_escape_omo_7 = "City Escape - Omochao 7" +city_escape_omo_8 = "City Escape - Omochao 8" +city_escape_omo_9 = "City Escape - Omochao 9" +city_escape_omo_10 = "City Escape - Omochao 10" +city_escape_omo_11 = "City Escape - Omochao 11" +city_escape_omo_12 = "City Escape - Omochao 12" +city_escape_omo_13 = "City Escape - Omochao 13" +city_escape_omo_14 = "City Escape - Omochao 14" +city_escape_beetle = "City Escape - Gold Beetle" +city_escape_animal_1 = "City Escape - 1 Animal" +city_escape_animal_2 = "City Escape - 2 Animals" +city_escape_animal_3 = "City Escape - 3 Animals" +city_escape_animal_4 = "City Escape - 4 Animals" +city_escape_animal_5 = "City Escape - 5 Animals" +city_escape_animal_6 = "City Escape - 6 Animals" +city_escape_animal_7 = "City Escape - 7 Animals" +city_escape_animal_8 = "City Escape - 8 Animals" +city_escape_animal_9 = "City Escape - 9 Animals" +city_escape_animal_10 = "City Escape - 10 Animals" +city_escape_animal_11 = "City Escape - 11 Animals" +city_escape_animal_12 = "City Escape - 12 Animals" +city_escape_animal_13 = "City Escape - 13 Animals" +city_escape_animal_14 = "City Escape - 14 Animals" +city_escape_animal_15 = "City Escape - 15 Animals" +city_escape_animal_16 = "City Escape - 16 Animals" +city_escape_animal_17 = "City Escape - 17 Animals" +city_escape_animal_18 = "City Escape - 18 Animals" +city_escape_animal_19 = "City Escape - 19 Animals" +city_escape_animal_20 = "City Escape - 20 Animals" +city_escape_upgrade = "City Escape - Upgrade" +metal_harbor_1 = "Metal Harbor - 1" +metal_harbor_2 = "Metal Harbor - 2" +metal_harbor_3 = "Metal Harbor - 3" +metal_harbor_4 = "Metal Harbor - 4" +metal_harbor_5 = "Metal Harbor - 5" +metal_harbor_chao_1 = "Metal Harbor - Chao Key 1" +metal_harbor_chao_2 = "Metal Harbor - Chao Key 2" +metal_harbor_chao_3 = "Metal Harbor - Chao Key 3" +metal_harbor_pipe_1 = "Metal Harbor - Pipe 1" +metal_harbor_omo_1 = "Metal Harbor - Omochao 1" +metal_harbor_omo_2 = "Metal Harbor - Omochao 2" +metal_harbor_omo_3 = "Metal Harbor - Omochao 3" +metal_harbor_omo_4 = "Metal Harbor - Omochao 4" +metal_harbor_omo_5 = "Metal Harbor - Omochao 5" +metal_harbor_beetle = "Metal Harbor - Gold Beetle" +metal_harbor_animal_1 = "Metal Harbor - 1 Animal" +metal_harbor_animal_2 = "Metal Harbor - 2 Animals" +metal_harbor_animal_3 = "Metal Harbor - 3 Animals" +metal_harbor_animal_4 = "Metal Harbor - 4 Animals" +metal_harbor_animal_5 = "Metal Harbor - 5 Animals" +metal_harbor_animal_6 = "Metal Harbor - 6 Animals" +metal_harbor_animal_7 = "Metal Harbor - 7 Animals" +metal_harbor_animal_8 = "Metal Harbor - 8 Animals" +metal_harbor_animal_9 = "Metal Harbor - 9 Animals" +metal_harbor_animal_10 = "Metal Harbor - 10 Animals" +metal_harbor_animal_11 = "Metal Harbor - 11 Animals" +metal_harbor_animal_12 = "Metal Harbor - 12 Animals" +metal_harbor_animal_13 = "Metal Harbor - 13 Animals" +metal_harbor_animal_14 = "Metal Harbor - 14 Animals" +metal_harbor_upgrade = "Metal Harbor - Upgrade" +green_forest_1 = "Green Forest - 1" +green_forest_2 = "Green Forest - 2" +green_forest_3 = "Green Forest - 3" +green_forest_4 = "Green Forest - 4" +green_forest_5 = "Green Forest - 5" +green_forest_chao_1 = "Green Forest - Chao Key 1" +green_forest_chao_2 = "Green Forest - Chao Key 2" +green_forest_chao_3 = "Green Forest - Chao Key 3" +green_forest_pipe_1 = "Green Forest - Pipe 1" +green_forest_pipe_2 = "Green Forest - Pipe 2" +green_forest_hidden_1 = "Green Forest - Hidden 1" +green_forest_hidden_2 = "Green Forest - Hidden 2" +green_forest_hidden_3 = "Green Forest - Hidden 3" +green_forest_hidden_4 = "Green Forest - Hidden 4" +green_forest_beetle = "Green Forest - Gold Beetle" +green_forest_animal_1 = "Green Forest - 1 Animal" +green_forest_animal_2 = "Green Forest - 2 Animals" +green_forest_animal_3 = "Green Forest - 3 Animals" +green_forest_animal_4 = "Green Forest - 4 Animals" +green_forest_animal_5 = "Green Forest - 5 Animals" +green_forest_animal_6 = "Green Forest - 6 Animals" +green_forest_animal_7 = "Green Forest - 7 Animals" +green_forest_animal_8 = "Green Forest - 8 Animals" +green_forest_animal_9 = "Green Forest - 9 Animals" +green_forest_animal_10 = "Green Forest - 10 Animals" +green_forest_animal_11 = "Green Forest - 11 Animals" +green_forest_animal_12 = "Green Forest - 12 Animals" +green_forest_animal_13 = "Green Forest - 13 Animals" +green_forest_animal_14 = "Green Forest - 14 Animals" +green_forest_animal_15 = "Green Forest - 15 Animals" +green_forest_animal_16 = "Green Forest - 16 Animals" +green_forest_animal_17 = "Green Forest - 17 Animals" +green_forest_animal_18 = "Green Forest - 18 Animals" +green_forest_upgrade = "Green Forest - Upgrade" +pyramid_cave_1 = "Pyramid Cave - 1" +pyramid_cave_2 = "Pyramid Cave - 2" +pyramid_cave_3 = "Pyramid Cave - 3" +pyramid_cave_4 = "Pyramid Cave - 4" +pyramid_cave_5 = "Pyramid Cave - 5" +pyramid_cave_chao_1 = "Pyramid Cave - Chao Key 1" +pyramid_cave_chao_2 = "Pyramid Cave - Chao Key 2" +pyramid_cave_chao_3 = "Pyramid Cave - Chao Key 3" +pyramid_cave_pipe_1 = "Pyramid Cave - Pipe 1" +pyramid_cave_pipe_2 = "Pyramid Cave - Pipe 2" +pyramid_cave_pipe_3 = "Pyramid Cave - Pipe 3" +pyramid_cave_pipe_4 = "Pyramid Cave - Pipe 4" +pyramid_cave_omo_1 = "Pyramid Cave - Omochao 1" +pyramid_cave_omo_2 = "Pyramid Cave - Omochao 2" +pyramid_cave_omo_3 = "Pyramid Cave - Omochao 3" +pyramid_cave_omo_4 = "Pyramid Cave - Omochao 4" +pyramid_cave_beetle = "Pyramid Cave - Gold Beetle" +pyramid_cave_animal_1 = "Pyramid Cave - 1 Animal" +pyramid_cave_animal_2 = "Pyramid Cave - 2 Animals" +pyramid_cave_animal_3 = "Pyramid Cave - 3 Animals" +pyramid_cave_animal_4 = "Pyramid Cave - 4 Animals" +pyramid_cave_animal_5 = "Pyramid Cave - 5 Animals" +pyramid_cave_animal_6 = "Pyramid Cave - 6 Animals" +pyramid_cave_animal_7 = "Pyramid Cave - 7 Animals" +pyramid_cave_animal_8 = "Pyramid Cave - 8 Animals" +pyramid_cave_animal_9 = "Pyramid Cave - 9 Animals" +pyramid_cave_animal_10 = "Pyramid Cave - 10 Animals" +pyramid_cave_animal_11 = "Pyramid Cave - 11 Animals" +pyramid_cave_animal_12 = "Pyramid Cave - 12 Animals" +pyramid_cave_animal_13 = "Pyramid Cave - 13 Animals" +pyramid_cave_animal_14 = "Pyramid Cave - 14 Animals" +pyramid_cave_animal_15 = "Pyramid Cave - 15 Animals" +pyramid_cave_animal_16 = "Pyramid Cave - 16 Animals" +pyramid_cave_animal_17 = "Pyramid Cave - 17 Animals" +pyramid_cave_animal_18 = "Pyramid Cave - 18 Animals" +pyramid_cave_animal_19 = "Pyramid Cave - 19 Animals" +pyramid_cave_upgrade = "Pyramid Cave - Upgrade" +crazy_gadget_1 = "Crazy Gadget - 1" +crazy_gadget_2 = "Crazy Gadget - 2" +crazy_gadget_3 = "Crazy Gadget - 3" +crazy_gadget_4 = "Crazy Gadget - 4" +crazy_gadget_5 = "Crazy Gadget - 5" +crazy_gadget_chao_1 = "Crazy Gadget - Chao Key 1" +crazy_gadget_chao_2 = "Crazy Gadget - Chao Key 2" +crazy_gadget_chao_3 = "Crazy Gadget - Chao Key 3" +crazy_gadget_pipe_1 = "Crazy Gadget - Pipe 1" +crazy_gadget_pipe_2 = "Crazy Gadget - Pipe 2" +crazy_gadget_pipe_3 = "Crazy Gadget - Pipe 3" +crazy_gadget_pipe_4 = "Crazy Gadget - Pipe 4" +crazy_gadget_hidden_1 = "Crazy Gadget - Hidden 1" +crazy_gadget_omo_1 = "Crazy Gadget - Omochao 1" +crazy_gadget_omo_2 = "Crazy Gadget - Omochao 2" +crazy_gadget_omo_3 = "Crazy Gadget - Omochao 3" +crazy_gadget_omo_4 = "Crazy Gadget - Omochao 4" +crazy_gadget_omo_5 = "Crazy Gadget - Omochao 5" +crazy_gadget_omo_6 = "Crazy Gadget - Omochao 6" +crazy_gadget_omo_7 = "Crazy Gadget - Omochao 7" +crazy_gadget_omo_8 = "Crazy Gadget - Omochao 8" +crazy_gadget_omo_9 = "Crazy Gadget - Omochao 9" +crazy_gadget_omo_10 = "Crazy Gadget - Omochao 10" +crazy_gadget_omo_11 = "Crazy Gadget - Omochao 11" +crazy_gadget_omo_12 = "Crazy Gadget - Omochao 12" +crazy_gadget_omo_13 = "Crazy Gadget - Omochao 13" +crazy_gadget_beetle = "Crazy Gadget - Gold Beetle" +crazy_gadget_animal_1 = "Crazy Gadget - 1 Animal" +crazy_gadget_animal_2 = "Crazy Gadget - 2 Animals" +crazy_gadget_animal_3 = "Crazy Gadget - 3 Animals" +crazy_gadget_animal_4 = "Crazy Gadget - 4 Animals" +crazy_gadget_animal_5 = "Crazy Gadget - 5 Animals" +crazy_gadget_animal_6 = "Crazy Gadget - 6 Animals" +crazy_gadget_animal_7 = "Crazy Gadget - 7 Animals" +crazy_gadget_animal_8 = "Crazy Gadget - 8 Animals" +crazy_gadget_animal_9 = "Crazy Gadget - 9 Animals" +crazy_gadget_animal_10 = "Crazy Gadget - 10 Animals" +crazy_gadget_animal_11 = "Crazy Gadget - 11 Animals" +crazy_gadget_animal_12 = "Crazy Gadget - 12 Animals" +crazy_gadget_animal_13 = "Crazy Gadget - 13 Animals" +crazy_gadget_animal_14 = "Crazy Gadget - 14 Animals" +crazy_gadget_animal_15 = "Crazy Gadget - 15 Animals" +crazy_gadget_animal_16 = "Crazy Gadget - 16 Animals" +crazy_gadget_upgrade = "Crazy Gadget - Upgrade" +final_rush_1 = "Final Rush - 1" +final_rush_2 = "Final Rush - 2" +final_rush_3 = "Final Rush - 3" +final_rush_4 = "Final Rush - 4" +final_rush_5 = "Final Rush - 5" +final_rush_chao_1 = "Final Rush - Chao Key 1" +final_rush_chao_2 = "Final Rush - Chao Key 2" +final_rush_chao_3 = "Final Rush - Chao Key 3" +final_rush_pipe_1 = "Final Rush - Pipe 1" +final_rush_pipe_2 = "Final Rush - Pipe 2" +final_rush_omo_1 = "Final Rush - Omochao 1" +final_rush_omo_2 = "Final Rush - Omochao 2" +final_rush_omo_3 = "Final Rush - Omochao 3" +final_rush_beetle = "Final Rush - Gold Beetle" +final_rush_animal_1 = "Final Rush - 1 Animal" +final_rush_animal_2 = "Final Rush - 2 Animals" +final_rush_animal_3 = "Final Rush - 3 Animals" +final_rush_animal_4 = "Final Rush - 4 Animals" +final_rush_animal_5 = "Final Rush - 5 Animals" +final_rush_animal_6 = "Final Rush - 6 Animals" +final_rush_animal_7 = "Final Rush - 7 Animals" +final_rush_animal_8 = "Final Rush - 8 Animals" +final_rush_animal_9 = "Final Rush - 9 Animals" +final_rush_animal_10 = "Final Rush - 10 Animals" +final_rush_animal_11 = "Final Rush - 11 Animals" +final_rush_animal_12 = "Final Rush - 12 Animals" +final_rush_animal_13 = "Final Rush - 13 Animals" +final_rush_animal_14 = "Final Rush - 14 Animals" +final_rush_animal_15 = "Final Rush - 15 Animals" +final_rush_animal_16 = "Final Rush - 16 Animals" +final_rush_upgrade = "Final Rush - Upgrade" # Tails Mission Definitions -prison_lane_1 = "Prison Lane - 1" -prison_lane_2 = "Prison Lane - 2" -prison_lane_3 = "Prison Lane - 3" -prison_lane_4 = "Prison Lane - 4" -prison_lane_5 = "Prison Lane - 5" -prison_lane_chao_1 = "Prison Lane - Chao Key 1" -prison_lane_chao_2 = "Prison Lane - Chao Key 2" -prison_lane_chao_3 = "Prison Lane - Chao Key 3" -prison_lane_pipe_1 = "Prison Lane - Pipe 1" -prison_lane_pipe_2 = "Prison Lane - Pipe 2" -prison_lane_pipe_3 = "Prison Lane - Pipe 3" -prison_lane_hidden_1 = "Prison Lane - Hidden 1" -prison_lane_hidden_2 = "Prison Lane - Hidden 2" -prison_lane_hidden_3 = "Prison Lane - Hidden 3" -prison_lane_omo_1 = "Prison Lane - Omochao 1" -prison_lane_omo_2 = "Prison Lane - Omochao 2" -prison_lane_omo_3 = "Prison Lane - Omochao 3" -prison_lane_omo_4 = "Prison Lane - Omochao 4" -prison_lane_omo_5 = "Prison Lane - Omochao 5" -prison_lane_omo_6 = "Prison Lane - Omochao 6" -prison_lane_omo_7 = "Prison Lane - Omochao 7" -prison_lane_omo_8 = "Prison Lane - Omochao 8" -prison_lane_omo_9 = "Prison Lane - Omochao 9" -prison_lane_omo_10 = "Prison Lane - Omochao 10" -prison_lane_beetle = "Prison Lane - Gold Beetle" -prison_lane_upgrade = "Prison Lane - Upgrade" -mission_street_1 = "Mission Street - 1" -mission_street_2 = "Mission Street - 2" -mission_street_3 = "Mission Street - 3" -mission_street_4 = "Mission Street - 4" -mission_street_5 = "Mission Street - 5" -mission_street_chao_1 = "Mission Street - Chao Key 1" -mission_street_chao_2 = "Mission Street - Chao Key 2" -mission_street_chao_3 = "Mission Street - Chao Key 3" -mission_street_pipe_1 = "Mission Street - Pipe 1" -mission_street_pipe_2 = "Mission Street - Pipe 2" -mission_street_pipe_3 = "Mission Street - Pipe 3" -mission_street_hidden_1 = "Mission Street - Hidden 1" -mission_street_hidden_2 = "Mission Street - Hidden 2" -mission_street_hidden_3 = "Mission Street - Hidden 3" -mission_street_hidden_4 = "Mission Street - Hidden 4" -mission_street_omo_1 = "Mission Street - Omochao 1" -mission_street_omo_2 = "Mission Street - Omochao 2" -mission_street_omo_3 = "Mission Street - Omochao 3" -mission_street_omo_4 = "Mission Street - Omochao 4" -mission_street_omo_5 = "Mission Street - Omochao 5" -mission_street_omo_6 = "Mission Street - Omochao 6" -mission_street_omo_7 = "Mission Street - Omochao 7" -mission_street_omo_8 = "Mission Street - Omochao 8" -mission_street_beetle = "Mission Street - Gold Beetle" -mission_street_upgrade = "Mission Street - Upgrade" -route_101_1 = "Route 101 - 1" -route_101_2 = "Route 101 - 2" -route_101_3 = "Route 101 - 3" -route_101_4 = "Route 101 - 4" -route_101_5 = "Route 101 - 5" -hidden_base_1 = "Hidden Base - 1" -hidden_base_2 = "Hidden Base - 2" -hidden_base_3 = "Hidden Base - 3" -hidden_base_4 = "Hidden Base - 4" -hidden_base_5 = "Hidden Base - 5" -hidden_base_chao_1 = "Hidden Base - Chao Key 1" -hidden_base_chao_2 = "Hidden Base - Chao Key 2" -hidden_base_pipe_1 = "Hidden Base - Pipe 1" -hidden_base_pipe_2 = "Hidden Base - Pipe 2" -hidden_base_pipe_3 = "Hidden Base - Pipe 3" -hidden_base_pipe_4 = "Hidden Base - Pipe 4" -hidden_base_pipe_5 = "Hidden Base - Pipe 5" -hidden_base_omo_1 = "Hidden Base - Omochao 1" -hidden_base_omo_2 = "Hidden Base - Omochao 2" -hidden_base_omo_3 = "Hidden Base - Omochao 3" -hidden_base_omo_4 = "Hidden Base - Omochao 4" -hidden_base_beetle = "Hidden Base - Gold Beetle" -hidden_base_upgrade = "Hidden Base - Upgrade" -eternal_engine_1 = "Eternal Engine - 1" -eternal_engine_2 = "Eternal Engine - 2" -eternal_engine_3 = "Eternal Engine - 3" -eternal_engine_4 = "Eternal Engine - 4" -eternal_engine_5 = "Eternal Engine - 5" -eternal_engine_chao_1 = "Eternal Engine - Chao Key 1" -eternal_engine_chao_2 = "Eternal Engine - Chao Key 2" -eternal_engine_chao_3 = "Eternal Engine - Chao Key 3" -eternal_engine_pipe_1 = "Eternal Engine - Pipe 1" -eternal_engine_pipe_2 = "Eternal Engine - Pipe 2" -eternal_engine_pipe_3 = "Eternal Engine - Pipe 3" -eternal_engine_pipe_4 = "Eternal Engine - Pipe 4" -eternal_engine_pipe_5 = "Eternal Engine - Pipe 5" -eternal_engine_omo_1 = "Eternal Engine - Omochao 1" -eternal_engine_omo_2 = "Eternal Engine - Omochao 2" -eternal_engine_omo_3 = "Eternal Engine - Omochao 3" -eternal_engine_omo_4 = "Eternal Engine - Omochao 4" -eternal_engine_omo_5 = "Eternal Engine - Omochao 5" -eternal_engine_omo_6 = "Eternal Engine - Omochao 6" -eternal_engine_omo_7 = "Eternal Engine - Omochao 7" -eternal_engine_omo_8 = "Eternal Engine - Omochao 8" -eternal_engine_omo_9 = "Eternal Engine - Omochao 9" -eternal_engine_omo_10 = "Eternal Engine - Omochao 10" -eternal_engine_omo_11 = "Eternal Engine - Omochao 11" -eternal_engine_omo_12 = "Eternal Engine - Omochao 12" -eternal_engine_beetle = "Eternal Engine - Gold Beetle" -eternal_engine_upgrade = "Eternal Engine - Upgrade" +prison_lane_1 = "Prison Lane - 1" +prison_lane_2 = "Prison Lane - 2" +prison_lane_3 = "Prison Lane - 3" +prison_lane_4 = "Prison Lane - 4" +prison_lane_5 = "Prison Lane - 5" +prison_lane_chao_1 = "Prison Lane - Chao Key 1" +prison_lane_chao_2 = "Prison Lane - Chao Key 2" +prison_lane_chao_3 = "Prison Lane - Chao Key 3" +prison_lane_pipe_1 = "Prison Lane - Pipe 1" +prison_lane_pipe_2 = "Prison Lane - Pipe 2" +prison_lane_pipe_3 = "Prison Lane - Pipe 3" +prison_lane_hidden_1 = "Prison Lane - Hidden 1" +prison_lane_hidden_2 = "Prison Lane - Hidden 2" +prison_lane_hidden_3 = "Prison Lane - Hidden 3" +prison_lane_omo_1 = "Prison Lane - Omochao 1" +prison_lane_omo_2 = "Prison Lane - Omochao 2" +prison_lane_omo_3 = "Prison Lane - Omochao 3" +prison_lane_omo_4 = "Prison Lane - Omochao 4" +prison_lane_omo_5 = "Prison Lane - Omochao 5" +prison_lane_omo_6 = "Prison Lane - Omochao 6" +prison_lane_omo_7 = "Prison Lane - Omochao 7" +prison_lane_omo_8 = "Prison Lane - Omochao 8" +prison_lane_omo_9 = "Prison Lane - Omochao 9" +prison_lane_omo_10 = "Prison Lane - Omochao 10" +prison_lane_beetle = "Prison Lane - Gold Beetle" +prison_lane_animal_1 = "Prison Lane - 1 Animal" +prison_lane_animal_2 = "Prison Lane - 2 Animals" +prison_lane_animal_3 = "Prison Lane - 3 Animals" +prison_lane_animal_4 = "Prison Lane - 4 Animals" +prison_lane_animal_5 = "Prison Lane - 5 Animals" +prison_lane_animal_6 = "Prison Lane - 6 Animals" +prison_lane_animal_7 = "Prison Lane - 7 Animals" +prison_lane_animal_8 = "Prison Lane - 8 Animals" +prison_lane_animal_9 = "Prison Lane - 9 Animals" +prison_lane_animal_10 = "Prison Lane - 10 Animals" +prison_lane_animal_11 = "Prison Lane - 11 Animals" +prison_lane_animal_12 = "Prison Lane - 12 Animals" +prison_lane_animal_13 = "Prison Lane - 13 Animals" +prison_lane_animal_14 = "Prison Lane - 14 Animals" +prison_lane_animal_15 = "Prison Lane - 15 Animals" +prison_lane_upgrade = "Prison Lane - Upgrade" +mission_street_1 = "Mission Street - 1" +mission_street_2 = "Mission Street - 2" +mission_street_3 = "Mission Street - 3" +mission_street_4 = "Mission Street - 4" +mission_street_5 = "Mission Street - 5" +mission_street_chao_1 = "Mission Street - Chao Key 1" +mission_street_chao_2 = "Mission Street - Chao Key 2" +mission_street_chao_3 = "Mission Street - Chao Key 3" +mission_street_pipe_1 = "Mission Street - Pipe 1" +mission_street_pipe_2 = "Mission Street - Pipe 2" +mission_street_pipe_3 = "Mission Street - Pipe 3" +mission_street_hidden_1 = "Mission Street - Hidden 1" +mission_street_hidden_2 = "Mission Street - Hidden 2" +mission_street_hidden_3 = "Mission Street - Hidden 3" +mission_street_hidden_4 = "Mission Street - Hidden 4" +mission_street_omo_1 = "Mission Street - Omochao 1" +mission_street_omo_2 = "Mission Street - Omochao 2" +mission_street_omo_3 = "Mission Street - Omochao 3" +mission_street_omo_4 = "Mission Street - Omochao 4" +mission_street_omo_5 = "Mission Street - Omochao 5" +mission_street_omo_6 = "Mission Street - Omochao 6" +mission_street_omo_7 = "Mission Street - Omochao 7" +mission_street_omo_8 = "Mission Street - Omochao 8" +mission_street_beetle = "Mission Street - Gold Beetle" +mission_street_animal_1 = "Mission Street - 1 Animal" +mission_street_animal_2 = "Mission Street - 2 Animals" +mission_street_animal_3 = "Mission Street - 3 Animals" +mission_street_animal_4 = "Mission Street - 4 Animals" +mission_street_animal_5 = "Mission Street - 5 Animals" +mission_street_animal_6 = "Mission Street - 6 Animals" +mission_street_animal_7 = "Mission Street - 7 Animals" +mission_street_animal_8 = "Mission Street - 8 Animals" +mission_street_animal_9 = "Mission Street - 9 Animals" +mission_street_animal_10 = "Mission Street - 10 Animals" +mission_street_animal_11 = "Mission Street - 11 Animals" +mission_street_animal_12 = "Mission Street - 12 Animals" +mission_street_animal_13 = "Mission Street - 13 Animals" +mission_street_animal_14 = "Mission Street - 14 Animals" +mission_street_animal_15 = "Mission Street - 15 Animals" +mission_street_animal_16 = "Mission Street - 16 Animals" +mission_street_upgrade = "Mission Street - Upgrade" +route_101_1 = "Route 101 - 1" +route_101_2 = "Route 101 - 2" +route_101_3 = "Route 101 - 3" +route_101_4 = "Route 101 - 4" +route_101_5 = "Route 101 - 5" +hidden_base_1 = "Hidden Base - 1" +hidden_base_2 = "Hidden Base - 2" +hidden_base_3 = "Hidden Base - 3" +hidden_base_4 = "Hidden Base - 4" +hidden_base_5 = "Hidden Base - 5" +hidden_base_chao_1 = "Hidden Base - Chao Key 1" +hidden_base_chao_2 = "Hidden Base - Chao Key 2" +hidden_base_pipe_1 = "Hidden Base - Pipe 1" +hidden_base_pipe_2 = "Hidden Base - Pipe 2" +hidden_base_pipe_3 = "Hidden Base - Pipe 3" +hidden_base_pipe_4 = "Hidden Base - Pipe 4" +hidden_base_pipe_5 = "Hidden Base - Pipe 5" +hidden_base_omo_1 = "Hidden Base - Omochao 1" +hidden_base_omo_2 = "Hidden Base - Omochao 2" +hidden_base_omo_3 = "Hidden Base - Omochao 3" +hidden_base_omo_4 = "Hidden Base - Omochao 4" +hidden_base_beetle = "Hidden Base - Gold Beetle" +hidden_base_animal_1 = "Hidden Base - 1 Animal" +hidden_base_animal_2 = "Hidden Base - 2 Animals" +hidden_base_animal_3 = "Hidden Base - 3 Animals" +hidden_base_animal_4 = "Hidden Base - 4 Animals" +hidden_base_animal_5 = "Hidden Base - 5 Animals" +hidden_base_animal_6 = "Hidden Base - 6 Animals" +hidden_base_animal_7 = "Hidden Base - 7 Animals" +hidden_base_animal_8 = "Hidden Base - 8 Animals" +hidden_base_animal_9 = "Hidden Base - 9 Animals" +hidden_base_animal_10 = "Hidden Base - 10 Animals" +hidden_base_animal_11 = "Hidden Base - 11 Animals" +hidden_base_animal_12 = "Hidden Base - 12 Animals" +hidden_base_animal_13 = "Hidden Base - 13 Animals" +hidden_base_animal_14 = "Hidden Base - 14 Animals" +hidden_base_animal_15 = "Hidden Base - 15 Animals" +hidden_base_upgrade = "Hidden Base - Upgrade" +eternal_engine_1 = "Eternal Engine - 1" +eternal_engine_2 = "Eternal Engine - 2" +eternal_engine_3 = "Eternal Engine - 3" +eternal_engine_4 = "Eternal Engine - 4" +eternal_engine_5 = "Eternal Engine - 5" +eternal_engine_chao_1 = "Eternal Engine - Chao Key 1" +eternal_engine_chao_2 = "Eternal Engine - Chao Key 2" +eternal_engine_chao_3 = "Eternal Engine - Chao Key 3" +eternal_engine_pipe_1 = "Eternal Engine - Pipe 1" +eternal_engine_pipe_2 = "Eternal Engine - Pipe 2" +eternal_engine_pipe_3 = "Eternal Engine - Pipe 3" +eternal_engine_pipe_4 = "Eternal Engine - Pipe 4" +eternal_engine_pipe_5 = "Eternal Engine - Pipe 5" +eternal_engine_omo_1 = "Eternal Engine - Omochao 1" +eternal_engine_omo_2 = "Eternal Engine - Omochao 2" +eternal_engine_omo_3 = "Eternal Engine - Omochao 3" +eternal_engine_omo_4 = "Eternal Engine - Omochao 4" +eternal_engine_omo_5 = "Eternal Engine - Omochao 5" +eternal_engine_omo_6 = "Eternal Engine - Omochao 6" +eternal_engine_omo_7 = "Eternal Engine - Omochao 7" +eternal_engine_omo_8 = "Eternal Engine - Omochao 8" +eternal_engine_omo_9 = "Eternal Engine - Omochao 9" +eternal_engine_omo_10 = "Eternal Engine - Omochao 10" +eternal_engine_omo_11 = "Eternal Engine - Omochao 11" +eternal_engine_omo_12 = "Eternal Engine - Omochao 12" +eternal_engine_beetle = "Eternal Engine - Gold Beetle" +eternal_engine_animal_1 = "Eternal Engine - 1 Animal" +eternal_engine_animal_2 = "Eternal Engine - 2 Animals" +eternal_engine_animal_3 = "Eternal Engine - 3 Animals" +eternal_engine_animal_4 = "Eternal Engine - 4 Animals" +eternal_engine_animal_5 = "Eternal Engine - 5 Animals" +eternal_engine_animal_6 = "Eternal Engine - 6 Animals" +eternal_engine_animal_7 = "Eternal Engine - 7 Animals" +eternal_engine_animal_8 = "Eternal Engine - 8 Animals" +eternal_engine_animal_9 = "Eternal Engine - 9 Animals" +eternal_engine_animal_10 = "Eternal Engine - 10 Animals" +eternal_engine_animal_11 = "Eternal Engine - 11 Animals" +eternal_engine_animal_12 = "Eternal Engine - 12 Animals" +eternal_engine_animal_13 = "Eternal Engine - 13 Animals" +eternal_engine_animal_14 = "Eternal Engine - 14 Animals" +eternal_engine_animal_15 = "Eternal Engine - 15 Animals" +eternal_engine_upgrade = "Eternal Engine - Upgrade" # Knuckles Mission Definitions -wild_canyon_1 = "Wild Canyon - 1" -wild_canyon_2 = "Wild Canyon - 2" -wild_canyon_3 = "Wild Canyon - 3" -wild_canyon_4 = "Wild Canyon - 4" -wild_canyon_5 = "Wild Canyon - 5" -wild_canyon_chao_1 = "Wild Canyon - Chao Key 1" -wild_canyon_chao_2 = "Wild Canyon - Chao Key 2" -wild_canyon_chao_3 = "Wild Canyon - Chao Key 3" -wild_canyon_pipe_1 = "Wild Canyon - Pipe 1" -wild_canyon_pipe_2 = "Wild Canyon - Pipe 2" -wild_canyon_pipe_3 = "Wild Canyon - Pipe 3" -wild_canyon_omo_1 = "Wild Canyon - Omochao 1" -wild_canyon_omo_2 = "Wild Canyon - Omochao 2" -wild_canyon_omo_3 = "Wild Canyon - Omochao 3" -wild_canyon_omo_4 = "Wild Canyon - Omochao 4" -wild_canyon_omo_5 = "Wild Canyon - Omochao 5" -wild_canyon_omo_6 = "Wild Canyon - Omochao 6" -wild_canyon_omo_7 = "Wild Canyon - Omochao 7" -wild_canyon_omo_8 = "Wild Canyon - Omochao 8" -wild_canyon_omo_9 = "Wild Canyon - Omochao 9" -wild_canyon_omo_10 = "Wild Canyon - Omochao 10" -wild_canyon_beetle = "Wild Canyon - Gold Beetle" -wild_canyon_upgrade = "Wild Canyon - Upgrade" -pumpkin_hill_1 = "Pumpkin Hill - 1" -pumpkin_hill_2 = "Pumpkin Hill - 2" -pumpkin_hill_3 = "Pumpkin Hill - 3" -pumpkin_hill_4 = "Pumpkin Hill - 4" -pumpkin_hill_5 = "Pumpkin Hill - 5" -pumpkin_hill_chao_1 = "Pumpkin Hill - Chao Key 1" -pumpkin_hill_chao_2 = "Pumpkin Hill - Chao Key 2" -pumpkin_hill_chao_3 = "Pumpkin Hill - Chao Key 3" -pumpkin_hill_pipe_1 = "Pumpkin Hill - Pipe 1" -pumpkin_hill_hidden_1 = "Pumpkin Hill - Hidden 1" -pumpkin_hill_omo_1 = "Pumpkin Hill - Omochao 1" -pumpkin_hill_omo_2 = "Pumpkin Hill - Omochao 2" -pumpkin_hill_omo_3 = "Pumpkin Hill - Omochao 3" -pumpkin_hill_omo_4 = "Pumpkin Hill - Omochao 4" -pumpkin_hill_omo_5 = "Pumpkin Hill - Omochao 5" -pumpkin_hill_omo_6 = "Pumpkin Hill - Omochao 6" -pumpkin_hill_omo_7 = "Pumpkin Hill - Omochao 7" -pumpkin_hill_omo_8 = "Pumpkin Hill - Omochao 8" -pumpkin_hill_omo_9 = "Pumpkin Hill - Omochao 9" -pumpkin_hill_omo_10 = "Pumpkin Hill - Omochao 10" -pumpkin_hill_omo_11 = "Pumpkin Hill - Omochao 11" -pumpkin_hill_upgrade = "Pumpkin Hill - Upgrade" -aquatic_mine_1 = "Aquatic Mine - 1" -aquatic_mine_2 = "Aquatic Mine - 2" -aquatic_mine_3 = "Aquatic Mine - 3" -aquatic_mine_4 = "Aquatic Mine - 4" -aquatic_mine_5 = "Aquatic Mine - 5" -aquatic_mine_chao_1 = "Aquatic Mine - Chao Key 1" -aquatic_mine_chao_2 = "Aquatic Mine - Chao Key 2" -aquatic_mine_chao_3 = "Aquatic Mine - Chao Key 3" -aquatic_mine_pipe_1 = "Aquatic Mine - Pipe 1" -aquatic_mine_pipe_2 = "Aquatic Mine - Pipe 2" -aquatic_mine_pipe_3 = "Aquatic Mine - Pipe 3" -aquatic_mine_omo_1 = "Aquatic Mine - Omochao 1" -aquatic_mine_omo_2 = "Aquatic Mine - Omochao 2" -aquatic_mine_omo_3 = "Aquatic Mine - Omochao 3" -aquatic_mine_omo_4 = "Aquatic Mine - Omochao 4" -aquatic_mine_omo_5 = "Aquatic Mine - Omochao 5" -aquatic_mine_omo_6 = "Aquatic Mine - Omochao 6" -aquatic_mine_omo_7 = "Aquatic Mine - Omochao 7" -aquatic_mine_beetle = "Aquatic Mine - Gold Beetle" -aquatic_mine_upgrade = "Aquatic Mine - Upgrade" -death_chamber_1 = "Death Chamber - 1" -death_chamber_2 = "Death Chamber - 2" -death_chamber_3 = "Death Chamber - 3" -death_chamber_4 = "Death Chamber - 4" -death_chamber_5 = "Death Chamber - 5" -death_chamber_chao_1 = "Death Chamber - Chao Key 1" -death_chamber_chao_2 = "Death Chamber - Chao Key 2" -death_chamber_chao_3 = "Death Chamber - Chao Key 3" -death_chamber_pipe_1 = "Death Chamber - Pipe 1" -death_chamber_pipe_2 = "Death Chamber - Pipe 2" -death_chamber_pipe_3 = "Death Chamber - Pipe 3" -death_chamber_hidden_1 = "Death Chamber - Hidden 1" -death_chamber_hidden_2 = "Death Chamber - Hidden 2" -death_chamber_omo_1 = "Death Chamber - Omochao 1" -death_chamber_omo_2 = "Death Chamber - Omochao 2" -death_chamber_omo_3 = "Death Chamber - Omochao 3" -death_chamber_omo_4 = "Death Chamber - Omochao 4" -death_chamber_omo_5 = "Death Chamber - Omochao 5" -death_chamber_omo_6 = "Death Chamber - Omochao 6" -death_chamber_omo_7 = "Death Chamber - Omochao 7" -death_chamber_omo_8 = "Death Chamber - Omochao 8" -death_chamber_omo_9 = "Death Chamber - Omochao 9" -death_chamber_beetle = "Death Chamber - Gold Beetle" -death_chamber_upgrade = "Death Chamber - Upgrade" -meteor_herd_1 = "Meteor Herd - 1" -meteor_herd_2 = "Meteor Herd - 2" -meteor_herd_3 = "Meteor Herd - 3" -meteor_herd_4 = "Meteor Herd - 4" -meteor_herd_5 = "Meteor Herd - 5" -meteor_herd_chao_1 = "Meteor Herd - Chao Key 1" -meteor_herd_chao_2 = "Meteor Herd - Chao Key 2" -meteor_herd_chao_3 = "Meteor Herd - Chao Key 3" -meteor_herd_pipe_1 = "Meteor Herd - Pipe 1" -meteor_herd_pipe_2 = "Meteor Herd - Pipe 2" -meteor_herd_pipe_3 = "Meteor Herd - Pipe 3" -meteor_herd_omo_1 = "Meteor Herd - Omochao 1" -meteor_herd_omo_2 = "Meteor Herd - Omochao 2" -meteor_herd_omo_3 = "Meteor Herd - Omochao 3" -meteor_herd_beetle = "Meteor Herd - Gold Beetle" -meteor_herd_upgrade = "Meteor Herd - Upgrade" +wild_canyon_1 = "Wild Canyon - 1" +wild_canyon_2 = "Wild Canyon - 2" +wild_canyon_3 = "Wild Canyon - 3" +wild_canyon_4 = "Wild Canyon - 4" +wild_canyon_5 = "Wild Canyon - 5" +wild_canyon_chao_1 = "Wild Canyon - Chao Key 1" +wild_canyon_chao_2 = "Wild Canyon - Chao Key 2" +wild_canyon_chao_3 = "Wild Canyon - Chao Key 3" +wild_canyon_pipe_1 = "Wild Canyon - Pipe 1" +wild_canyon_pipe_2 = "Wild Canyon - Pipe 2" +wild_canyon_pipe_3 = "Wild Canyon - Pipe 3" +wild_canyon_omo_1 = "Wild Canyon - Omochao 1" +wild_canyon_omo_2 = "Wild Canyon - Omochao 2" +wild_canyon_omo_3 = "Wild Canyon - Omochao 3" +wild_canyon_omo_4 = "Wild Canyon - Omochao 4" +wild_canyon_omo_5 = "Wild Canyon - Omochao 5" +wild_canyon_omo_6 = "Wild Canyon - Omochao 6" +wild_canyon_omo_7 = "Wild Canyon - Omochao 7" +wild_canyon_omo_8 = "Wild Canyon - Omochao 8" +wild_canyon_omo_9 = "Wild Canyon - Omochao 9" +wild_canyon_omo_10 = "Wild Canyon - Omochao 10" +wild_canyon_beetle = "Wild Canyon - Gold Beetle" +wild_canyon_animal_1 = "Wild Canyon - 1 Animal" +wild_canyon_animal_2 = "Wild Canyon - 2 Animals" +wild_canyon_animal_3 = "Wild Canyon - 3 Animals" +wild_canyon_animal_4 = "Wild Canyon - 4 Animals" +wild_canyon_animal_5 = "Wild Canyon - 5 Animals" +wild_canyon_animal_6 = "Wild Canyon - 6 Animals" +wild_canyon_animal_7 = "Wild Canyon - 7 Animals" +wild_canyon_animal_8 = "Wild Canyon - 8 Animals" +wild_canyon_animal_9 = "Wild Canyon - 9 Animals" +wild_canyon_animal_10 = "Wild Canyon - 10 Animals" +wild_canyon_upgrade = "Wild Canyon - Upgrade" +pumpkin_hill_1 = "Pumpkin Hill - 1" +pumpkin_hill_2 = "Pumpkin Hill - 2" +pumpkin_hill_3 = "Pumpkin Hill - 3" +pumpkin_hill_4 = "Pumpkin Hill - 4" +pumpkin_hill_5 = "Pumpkin Hill - 5" +pumpkin_hill_chao_1 = "Pumpkin Hill - Chao Key 1" +pumpkin_hill_chao_2 = "Pumpkin Hill - Chao Key 2" +pumpkin_hill_chao_3 = "Pumpkin Hill - Chao Key 3" +pumpkin_hill_pipe_1 = "Pumpkin Hill - Pipe 1" +pumpkin_hill_hidden_1 = "Pumpkin Hill - Hidden 1" +pumpkin_hill_omo_1 = "Pumpkin Hill - Omochao 1" +pumpkin_hill_omo_2 = "Pumpkin Hill - Omochao 2" +pumpkin_hill_omo_3 = "Pumpkin Hill - Omochao 3" +pumpkin_hill_omo_4 = "Pumpkin Hill - Omochao 4" +pumpkin_hill_omo_5 = "Pumpkin Hill - Omochao 5" +pumpkin_hill_omo_6 = "Pumpkin Hill - Omochao 6" +pumpkin_hill_omo_7 = "Pumpkin Hill - Omochao 7" +pumpkin_hill_omo_8 = "Pumpkin Hill - Omochao 8" +pumpkin_hill_omo_9 = "Pumpkin Hill - Omochao 9" +pumpkin_hill_omo_10 = "Pumpkin Hill - Omochao 10" +pumpkin_hill_omo_11 = "Pumpkin Hill - Omochao 11" +pumpkin_hill_animal_1 = "Pumpkin Hill - 1 Animal" +pumpkin_hill_animal_2 = "Pumpkin Hill - 2 Animals" +pumpkin_hill_animal_3 = "Pumpkin Hill - 3 Animals" +pumpkin_hill_animal_4 = "Pumpkin Hill - 4 Animals" +pumpkin_hill_animal_5 = "Pumpkin Hill - 5 Animals" +pumpkin_hill_animal_6 = "Pumpkin Hill - 6 Animals" +pumpkin_hill_animal_7 = "Pumpkin Hill - 7 Animals" +pumpkin_hill_animal_8 = "Pumpkin Hill - 8 Animals" +pumpkin_hill_animal_9 = "Pumpkin Hill - 9 Animals" +pumpkin_hill_animal_10 = "Pumpkin Hill - 10 Animals" +pumpkin_hill_animal_11 = "Pumpkin Hill - 11 Animals" +pumpkin_hill_upgrade = "Pumpkin Hill - Upgrade" +aquatic_mine_1 = "Aquatic Mine - 1" +aquatic_mine_2 = "Aquatic Mine - 2" +aquatic_mine_3 = "Aquatic Mine - 3" +aquatic_mine_4 = "Aquatic Mine - 4" +aquatic_mine_5 = "Aquatic Mine - 5" +aquatic_mine_chao_1 = "Aquatic Mine - Chao Key 1" +aquatic_mine_chao_2 = "Aquatic Mine - Chao Key 2" +aquatic_mine_chao_3 = "Aquatic Mine - Chao Key 3" +aquatic_mine_pipe_1 = "Aquatic Mine - Pipe 1" +aquatic_mine_pipe_2 = "Aquatic Mine - Pipe 2" +aquatic_mine_pipe_3 = "Aquatic Mine - Pipe 3" +aquatic_mine_omo_1 = "Aquatic Mine - Omochao 1" +aquatic_mine_omo_2 = "Aquatic Mine - Omochao 2" +aquatic_mine_omo_3 = "Aquatic Mine - Omochao 3" +aquatic_mine_omo_4 = "Aquatic Mine - Omochao 4" +aquatic_mine_omo_5 = "Aquatic Mine - Omochao 5" +aquatic_mine_omo_6 = "Aquatic Mine - Omochao 6" +aquatic_mine_omo_7 = "Aquatic Mine - Omochao 7" +aquatic_mine_beetle = "Aquatic Mine - Gold Beetle" +aquatic_mine_animal_1 = "Aquatic Mine - 1 Animal" +aquatic_mine_animal_2 = "Aquatic Mine - 2 Animals" +aquatic_mine_animal_3 = "Aquatic Mine - 3 Animals" +aquatic_mine_animal_4 = "Aquatic Mine - 4 Animals" +aquatic_mine_animal_5 = "Aquatic Mine - 5 Animals" +aquatic_mine_animal_6 = "Aquatic Mine - 6 Animals" +aquatic_mine_animal_7 = "Aquatic Mine - 7 Animals" +aquatic_mine_animal_8 = "Aquatic Mine - 8 Animals" +aquatic_mine_animal_9 = "Aquatic Mine - 9 Animals" +aquatic_mine_animal_10 = "Aquatic Mine - 10 Animals" +aquatic_mine_upgrade = "Aquatic Mine - Upgrade" +death_chamber_1 = "Death Chamber - 1" +death_chamber_2 = "Death Chamber - 2" +death_chamber_3 = "Death Chamber - 3" +death_chamber_4 = "Death Chamber - 4" +death_chamber_5 = "Death Chamber - 5" +death_chamber_chao_1 = "Death Chamber - Chao Key 1" +death_chamber_chao_2 = "Death Chamber - Chao Key 2" +death_chamber_chao_3 = "Death Chamber - Chao Key 3" +death_chamber_pipe_1 = "Death Chamber - Pipe 1" +death_chamber_pipe_2 = "Death Chamber - Pipe 2" +death_chamber_pipe_3 = "Death Chamber - Pipe 3" +death_chamber_hidden_1 = "Death Chamber - Hidden 1" +death_chamber_hidden_2 = "Death Chamber - Hidden 2" +death_chamber_omo_1 = "Death Chamber - Omochao 1" +death_chamber_omo_2 = "Death Chamber - Omochao 2" +death_chamber_omo_3 = "Death Chamber - Omochao 3" +death_chamber_omo_4 = "Death Chamber - Omochao 4" +death_chamber_omo_5 = "Death Chamber - Omochao 5" +death_chamber_omo_6 = "Death Chamber - Omochao 6" +death_chamber_omo_7 = "Death Chamber - Omochao 7" +death_chamber_omo_8 = "Death Chamber - Omochao 8" +death_chamber_omo_9 = "Death Chamber - Omochao 9" +death_chamber_beetle = "Death Chamber - Gold Beetle" +death_chamber_animal_1 = "Death Chamber - 1 Animal" +death_chamber_animal_2 = "Death Chamber - 2 Animals" +death_chamber_animal_3 = "Death Chamber - 3 Animals" +death_chamber_animal_4 = "Death Chamber - 4 Animals" +death_chamber_animal_5 = "Death Chamber - 5 Animals" +death_chamber_animal_6 = "Death Chamber - 6 Animals" +death_chamber_animal_7 = "Death Chamber - 7 Animals" +death_chamber_animal_8 = "Death Chamber - 8 Animals" +death_chamber_animal_9 = "Death Chamber - 9 Animals" +death_chamber_animal_10 = "Death Chamber - 10 Animals" +death_chamber_upgrade = "Death Chamber - Upgrade" +meteor_herd_1 = "Meteor Herd - 1" +meteor_herd_2 = "Meteor Herd - 2" +meteor_herd_3 = "Meteor Herd - 3" +meteor_herd_4 = "Meteor Herd - 4" +meteor_herd_5 = "Meteor Herd - 5" +meteor_herd_chao_1 = "Meteor Herd - Chao Key 1" +meteor_herd_chao_2 = "Meteor Herd - Chao Key 2" +meteor_herd_chao_3 = "Meteor Herd - Chao Key 3" +meteor_herd_pipe_1 = "Meteor Herd - Pipe 1" +meteor_herd_pipe_2 = "Meteor Herd - Pipe 2" +meteor_herd_pipe_3 = "Meteor Herd - Pipe 3" +meteor_herd_omo_1 = "Meteor Herd - Omochao 1" +meteor_herd_omo_2 = "Meteor Herd - Omochao 2" +meteor_herd_omo_3 = "Meteor Herd - Omochao 3" +meteor_herd_beetle = "Meteor Herd - Gold Beetle" +meteor_herd_animal_1 = "Meteor Herd - 1 Animal" +meteor_herd_animal_2 = "Meteor Herd - 2 Animals" +meteor_herd_animal_3 = "Meteor Herd - 3 Animals" +meteor_herd_animal_4 = "Meteor Herd - 4 Animals" +meteor_herd_animal_5 = "Meteor Herd - 5 Animals" +meteor_herd_animal_6 = "Meteor Herd - 6 Animals" +meteor_herd_animal_7 = "Meteor Herd - 7 Animals" +meteor_herd_animal_8 = "Meteor Herd - 8 Animals" +meteor_herd_animal_9 = "Meteor Herd - 9 Animals" +meteor_herd_animal_10 = "Meteor Herd - 10 Animals" +meteor_herd_animal_11 = "Meteor Herd - 11 Animals" +meteor_herd_upgrade = "Meteor Herd - Upgrade" # Shadow Mission Definitions -radical_highway_1 = "Radical Highway - 1" -radical_highway_2 = "Radical Highway - 2" -radical_highway_3 = "Radical Highway - 3" -radical_highway_4 = "Radical Highway - 4" -radical_highway_5 = "Radical Highway - 5" -radical_highway_chao_1 = "Radical Highway - Chao Key 1" -radical_highway_chao_2 = "Radical Highway - Chao Key 2" -radical_highway_chao_3 = "Radical Highway - Chao Key 3" -radical_highway_pipe_1 = "Radical Highway - Pipe 1" -radical_highway_pipe_2 = "Radical Highway - Pipe 2" -radical_highway_pipe_3 = "Radical Highway - Pipe 3" -radical_highway_hidden_1 = "Radical Highway - Hidden 1" -radical_highway_hidden_2 = "Radical Highway - Hidden 2" -radical_highway_hidden_3 = "Radical Highway - Hidden 3" -radical_highway_omo_1 = "Radical Highway - Omochao 1" -radical_highway_omo_2 = "Radical Highway - Omochao 2" -radical_highway_omo_3 = "Radical Highway - Omochao 3" -radical_highway_omo_4 = "Radical Highway - Omochao 4" -radical_highway_omo_5 = "Radical Highway - Omochao 5" -radical_highway_omo_6 = "Radical Highway - Omochao 6" -radical_highway_omo_7 = "Radical Highway - Omochao 7" -radical_highway_omo_8 = "Radical Highway - Omochao 8" -radical_highway_beetle = "Radical Highway - Gold Beetle" -radical_highway_upgrade = "Radical Highway - Upgrade" -white_jungle_1 = "White Jungle - 1" -white_jungle_2 = "White Jungle - 2" -white_jungle_3 = "White Jungle - 3" -white_jungle_4 = "White Jungle - 4" -white_jungle_5 = "White Jungle - 5" -white_jungle_chao_1 = "White Jungle - Chao Key 1" -white_jungle_chao_2 = "White Jungle - Chao Key 2" -white_jungle_chao_3 = "White Jungle - Chao Key 3" -white_jungle_pipe_1 = "White Jungle - Pipe 1" -white_jungle_pipe_2 = "White Jungle - Pipe 2" -white_jungle_pipe_3 = "White Jungle - Pipe 3" -white_jungle_pipe_4 = "White Jungle - Pipe 4" -white_jungle_hidden_1 = "White Jungle - Hidden 1" -white_jungle_hidden_2 = "White Jungle - Hidden 2" -white_jungle_hidden_3 = "White Jungle - Hidden 3" -white_jungle_omo_1 = "White Jungle - Omochao 1" -white_jungle_omo_2 = "White Jungle - Omochao 2" -white_jungle_omo_3 = "White Jungle - Omochao 3" -white_jungle_omo_4 = "White Jungle - Omochao 4" -white_jungle_omo_5 = "White Jungle - Omochao 5" -white_jungle_beetle = "White Jungle - Gold Beetle" -white_jungle_upgrade = "White Jungle - Upgrade" -sky_rail_1 = "Sky Rail - 1" -sky_rail_2 = "Sky Rail - 2" -sky_rail_3 = "Sky Rail - 3" -sky_rail_4 = "Sky Rail - 4" -sky_rail_5 = "Sky Rail - 5" -sky_rail_chao_1 = "Sky Rail - Chao Key 1" -sky_rail_chao_2 = "Sky Rail - Chao Key 2" -sky_rail_chao_3 = "Sky Rail - Chao Key 3" -sky_rail_pipe_1 = "Sky Rail - Pipe 1" -sky_rail_pipe_2 = "Sky Rail - Pipe 2" -sky_rail_pipe_3 = "Sky Rail - Pipe 3" -sky_rail_pipe_4 = "Sky Rail - Pipe 4" -sky_rail_pipe_5 = "Sky Rail - Pipe 5" -sky_rail_pipe_6 = "Sky Rail - Pipe 6" -sky_rail_beetle = "Sky Rail - Gold Beetle" -sky_rail_upgrade = "Sky Rail - Upgrade" -final_chase_1 = "Final Chase - 1" -final_chase_2 = "Final Chase - 2" -final_chase_3 = "Final Chase - 3" -final_chase_4 = "Final Chase - 4" -final_chase_5 = "Final Chase - 5" -final_chase_chao_1 = "Final Chase - Chao Key 1" -final_chase_chao_2 = "Final Chase - Chao Key 2" -final_chase_chao_3 = "Final Chase - Chao Key 3" -final_chase_pipe_1 = "Final Chase - Pipe 1" -final_chase_pipe_2 = "Final Chase - Pipe 2" -final_chase_pipe_3 = "Final Chase - Pipe 3" -final_chase_omo_1 = "Final Chase - Omochao 1" -final_chase_beetle = "Final Chase - Gold Beetle" -final_chase_upgrade = "Final Chase - Upgrade" +radical_highway_1 = "Radical Highway - 1" +radical_highway_2 = "Radical Highway - 2" +radical_highway_3 = "Radical Highway - 3" +radical_highway_4 = "Radical Highway - 4" +radical_highway_5 = "Radical Highway - 5" +radical_highway_chao_1 = "Radical Highway - Chao Key 1" +radical_highway_chao_2 = "Radical Highway - Chao Key 2" +radical_highway_chao_3 = "Radical Highway - Chao Key 3" +radical_highway_pipe_1 = "Radical Highway - Pipe 1" +radical_highway_pipe_2 = "Radical Highway - Pipe 2" +radical_highway_pipe_3 = "Radical Highway - Pipe 3" +radical_highway_hidden_1 = "Radical Highway - Hidden 1" +radical_highway_hidden_2 = "Radical Highway - Hidden 2" +radical_highway_hidden_3 = "Radical Highway - Hidden 3" +radical_highway_omo_1 = "Radical Highway - Omochao 1" +radical_highway_omo_2 = "Radical Highway - Omochao 2" +radical_highway_omo_3 = "Radical Highway - Omochao 3" +radical_highway_omo_4 = "Radical Highway - Omochao 4" +radical_highway_omo_5 = "Radical Highway - Omochao 5" +radical_highway_omo_6 = "Radical Highway - Omochao 6" +radical_highway_omo_7 = "Radical Highway - Omochao 7" +radical_highway_omo_8 = "Radical Highway - Omochao 8" +radical_highway_beetle = "Radical Highway - Gold Beetle" +radical_highway_animal_1 = "Radical Highway - 1 Animal" +radical_highway_animal_2 = "Radical Highway - 2 Animals" +radical_highway_animal_3 = "Radical Highway - 3 Animals" +radical_highway_animal_4 = "Radical Highway - 4 Animals" +radical_highway_animal_5 = "Radical Highway - 5 Animals" +radical_highway_animal_6 = "Radical Highway - 6 Animals" +radical_highway_animal_7 = "Radical Highway - 7 Animals" +radical_highway_animal_8 = "Radical Highway - 8 Animals" +radical_highway_animal_9 = "Radical Highway - 9 Animals" +radical_highway_animal_10 = "Radical Highway - 10 Animals" +radical_highway_animal_11 = "Radical Highway - 11 Animals" +radical_highway_animal_12 = "Radical Highway - 12 Animals" +radical_highway_animal_13 = "Radical Highway - 13 Animals" +radical_highway_animal_14 = "Radical Highway - 14 Animals" +radical_highway_animal_15 = "Radical Highway - 15 Animals" +radical_highway_animal_16 = "Radical Highway - 16 Animals" +radical_highway_animal_17 = "Radical Highway - 17 Animals" +radical_highway_animal_18 = "Radical Highway - 18 Animals" +radical_highway_animal_19 = "Radical Highway - 19 Animals" +radical_highway_animal_20 = "Radical Highway - 20 Animals" +radical_highway_upgrade = "Radical Highway - Upgrade" +white_jungle_1 = "White Jungle - 1" +white_jungle_2 = "White Jungle - 2" +white_jungle_3 = "White Jungle - 3" +white_jungle_4 = "White Jungle - 4" +white_jungle_5 = "White Jungle - 5" +white_jungle_chao_1 = "White Jungle - Chao Key 1" +white_jungle_chao_2 = "White Jungle - Chao Key 2" +white_jungle_chao_3 = "White Jungle - Chao Key 3" +white_jungle_pipe_1 = "White Jungle - Pipe 1" +white_jungle_pipe_2 = "White Jungle - Pipe 2" +white_jungle_pipe_3 = "White Jungle - Pipe 3" +white_jungle_pipe_4 = "White Jungle - Pipe 4" +white_jungle_hidden_1 = "White Jungle - Hidden 1" +white_jungle_hidden_2 = "White Jungle - Hidden 2" +white_jungle_hidden_3 = "White Jungle - Hidden 3" +white_jungle_omo_1 = "White Jungle - Omochao 1" +white_jungle_omo_2 = "White Jungle - Omochao 2" +white_jungle_omo_3 = "White Jungle - Omochao 3" +white_jungle_omo_4 = "White Jungle - Omochao 4" +white_jungle_omo_5 = "White Jungle - Omochao 5" +white_jungle_beetle = "White Jungle - Gold Beetle" +white_jungle_animal_1 = "White Jungle - 1 Animal" +white_jungle_animal_2 = "White Jungle - 2 Animals" +white_jungle_animal_3 = "White Jungle - 3 Animals" +white_jungle_animal_4 = "White Jungle - 4 Animals" +white_jungle_animal_5 = "White Jungle - 5 Animals" +white_jungle_animal_6 = "White Jungle - 6 Animals" +white_jungle_animal_7 = "White Jungle - 7 Animals" +white_jungle_animal_8 = "White Jungle - 8 Animals" +white_jungle_animal_9 = "White Jungle - 9 Animals" +white_jungle_animal_10 = "White Jungle - 10 Animals" +white_jungle_animal_11 = "White Jungle - 11 Animals" +white_jungle_animal_12 = "White Jungle - 12 Animals" +white_jungle_animal_13 = "White Jungle - 13 Animals" +white_jungle_animal_14 = "White Jungle - 14 Animals" +white_jungle_animal_15 = "White Jungle - 15 Animals" +white_jungle_animal_16 = "White Jungle - 16 Animals" +white_jungle_upgrade = "White Jungle - Upgrade" +sky_rail_1 = "Sky Rail - 1" +sky_rail_2 = "Sky Rail - 2" +sky_rail_3 = "Sky Rail - 3" +sky_rail_4 = "Sky Rail - 4" +sky_rail_5 = "Sky Rail - 5" +sky_rail_chao_1 = "Sky Rail - Chao Key 1" +sky_rail_chao_2 = "Sky Rail - Chao Key 2" +sky_rail_chao_3 = "Sky Rail - Chao Key 3" +sky_rail_pipe_1 = "Sky Rail - Pipe 1" +sky_rail_pipe_2 = "Sky Rail - Pipe 2" +sky_rail_pipe_3 = "Sky Rail - Pipe 3" +sky_rail_pipe_4 = "Sky Rail - Pipe 4" +sky_rail_pipe_5 = "Sky Rail - Pipe 5" +sky_rail_pipe_6 = "Sky Rail - Pipe 6" +sky_rail_beetle = "Sky Rail - Gold Beetle" +sky_rail_animal_1 = "Sky Rail - 1 Animal" +sky_rail_animal_2 = "Sky Rail - 2 Animals" +sky_rail_animal_3 = "Sky Rail - 3 Animals" +sky_rail_animal_4 = "Sky Rail - 4 Animals" +sky_rail_animal_5 = "Sky Rail - 5 Animals" +sky_rail_animal_6 = "Sky Rail - 6 Animals" +sky_rail_animal_7 = "Sky Rail - 7 Animals" +sky_rail_animal_8 = "Sky Rail - 8 Animals" +sky_rail_animal_9 = "Sky Rail - 9 Animals" +sky_rail_animal_10 = "Sky Rail - 10 Animals" +sky_rail_animal_11 = "Sky Rail - 11 Animals" +sky_rail_animal_12 = "Sky Rail - 12 Animals" +sky_rail_animal_13 = "Sky Rail - 13 Animals" +sky_rail_animal_14 = "Sky Rail - 14 Animals" +sky_rail_animal_15 = "Sky Rail - 15 Animals" +sky_rail_animal_16 = "Sky Rail - 16 Animals" +sky_rail_animal_17 = "Sky Rail - 17 Animals" +sky_rail_animal_18 = "Sky Rail - 18 Animals" +sky_rail_animal_19 = "Sky Rail - 19 Animals" +sky_rail_animal_20 = "Sky Rail - 20 Animals" +sky_rail_upgrade = "Sky Rail - Upgrade" +final_chase_1 = "Final Chase - 1" +final_chase_2 = "Final Chase - 2" +final_chase_3 = "Final Chase - 3" +final_chase_4 = "Final Chase - 4" +final_chase_5 = "Final Chase - 5" +final_chase_chao_1 = "Final Chase - Chao Key 1" +final_chase_chao_2 = "Final Chase - Chao Key 2" +final_chase_chao_3 = "Final Chase - Chao Key 3" +final_chase_pipe_1 = "Final Chase - Pipe 1" +final_chase_pipe_2 = "Final Chase - Pipe 2" +final_chase_pipe_3 = "Final Chase - Pipe 3" +final_chase_omo_1 = "Final Chase - Omochao 1" +final_chase_beetle = "Final Chase - Gold Beetle" +final_chase_animal_1 = "Final Chase - 1 Animal" +final_chase_animal_2 = "Final Chase - 2 Animals" +final_chase_animal_3 = "Final Chase - 3 Animals" +final_chase_animal_4 = "Final Chase - 4 Animals" +final_chase_animal_5 = "Final Chase - 5 Animals" +final_chase_animal_6 = "Final Chase - 6 Animals" +final_chase_animal_7 = "Final Chase - 7 Animals" +final_chase_animal_8 = "Final Chase - 8 Animals" +final_chase_animal_9 = "Final Chase - 9 Animals" +final_chase_animal_10 = "Final Chase - 10 Animals" +final_chase_animal_11 = "Final Chase - 11 Animals" +final_chase_animal_12 = "Final Chase - 12 Animals" +final_chase_animal_13 = "Final Chase - 13 Animals" +final_chase_animal_14 = "Final Chase - 14 Animals" +final_chase_animal_15 = "Final Chase - 15 Animals" +final_chase_animal_16 = "Final Chase - 16 Animals" +final_chase_animal_17 = "Final Chase - 17 Animals" +final_chase_animal_18 = "Final Chase - 18 Animals" +final_chase_animal_19 = "Final Chase - 19 Animals" +final_chase_animal_20 = "Final Chase - 20 Animals" +final_chase_upgrade = "Final Chase - Upgrade" # Eggman Mission Definitions -iron_gate_1 = "Iron Gate - 1" -iron_gate_2 = "Iron Gate - 2" -iron_gate_3 = "Iron Gate - 3" -iron_gate_4 = "Iron Gate - 4" -iron_gate_5 = "Iron Gate - 5" -iron_gate_chao_1 = "Iron Gate - Chao Key 1" -iron_gate_chao_2 = "Iron Gate - Chao Key 2" -iron_gate_chao_3 = "Iron Gate - Chao Key 3" -iron_gate_pipe_1 = "Iron Gate - Pipe 1" -iron_gate_pipe_2 = "Iron Gate - Pipe 2" -iron_gate_pipe_3 = "Iron Gate - Pipe 3" -iron_gate_pipe_4 = "Iron Gate - Pipe 4" -iron_gate_pipe_5 = "Iron Gate - Pipe 5" -iron_gate_omo_1 = "Iron Gate - Omochao 1" -iron_gate_omo_2 = "Iron Gate - Omochao 2" -iron_gate_omo_3 = "Iron Gate - Omochao 3" -iron_gate_omo_4 = "Iron Gate - Omochao 4" -iron_gate_omo_5 = "Iron Gate - Omochao 5" -iron_gate_omo_6 = "Iron Gate - Omochao 6" -iron_gate_beetle = "Iron Gate - Gold Beetle" -iron_gate_upgrade = "Iron Gate - Upgrade" -sand_ocean_1 = "Sand Ocean - 1" -sand_ocean_2 = "Sand Ocean - 2" -sand_ocean_3 = "Sand Ocean - 3" -sand_ocean_4 = "Sand Ocean - 4" -sand_ocean_5 = "Sand Ocean - 5" -sand_ocean_chao_1 = "Sand Ocean - Chao Key 1" -sand_ocean_chao_2 = "Sand Ocean - Chao Key 2" -sand_ocean_chao_3 = "Sand Ocean - Chao Key 3" -sand_ocean_pipe_1 = "Sand Ocean - Pipe 1" -sand_ocean_pipe_2 = "Sand Ocean - Pipe 2" -sand_ocean_pipe_3 = "Sand Ocean - Pipe 3" -sand_ocean_pipe_4 = "Sand Ocean - Pipe 4" -sand_ocean_pipe_5 = "Sand Ocean - Pipe 5" -sand_ocean_omo_1 = "Sand Ocean - Omochao 1" -sand_ocean_omo_2 = "Sand Ocean - Omochao 2" -sand_ocean_beetle = "Sand Ocean - Gold Beetle" -sand_ocean_upgrade = "Sand Ocean - Upgrade" -lost_colony_1 = "Lost Colony - 1" -lost_colony_2 = "Lost Colony - 2" -lost_colony_3 = "Lost Colony - 3" -lost_colony_4 = "Lost Colony - 4" -lost_colony_5 = "Lost Colony - 5" -lost_colony_chao_1 = "Lost Colony - Chao Key 1" -lost_colony_chao_2 = "Lost Colony - Chao Key 2" -lost_colony_chao_3 = "Lost Colony - Chao Key 3" -lost_colony_pipe_1 = "Lost Colony - Pipe 1" -lost_colony_pipe_2 = "Lost Colony - Pipe 2" -lost_colony_hidden_1 = "Lost Colony - Hidden 1" -lost_colony_omo_1 = "Lost Colony - Omochao 1" -lost_colony_omo_2 = "Lost Colony - Omochao 2" -lost_colony_omo_3 = "Lost Colony - Omochao 3" -lost_colony_omo_4 = "Lost Colony - Omochao 4" -lost_colony_omo_5 = "Lost Colony - Omochao 5" -lost_colony_omo_6 = "Lost Colony - Omochao 6" -lost_colony_omo_7 = "Lost Colony - Omochao 7" -lost_colony_omo_8 = "Lost Colony - Omochao 8" -lost_colony_beetle = "Lost Colony - Gold Beetle" -lost_colony_upgrade = "Lost Colony - Upgrade" -weapons_bed_1 = "Weapons Bed - 1" -weapons_bed_2 = "Weapons Bed - 2" -weapons_bed_3 = "Weapons Bed - 3" -weapons_bed_4 = "Weapons Bed - 4" -weapons_bed_5 = "Weapons Bed - 5" -weapons_bed_chao_1 = "Weapons Bed - Chao Key 1" -weapons_bed_chao_2 = "Weapons Bed - Chao Key 2" -weapons_bed_chao_3 = "Weapons Bed - Chao Key 3" -weapons_bed_pipe_1 = "Weapons Bed - Pipe 1" -weapons_bed_pipe_2 = "Weapons Bed - Pipe 2" -weapons_bed_pipe_3 = "Weapons Bed - Pipe 3" -weapons_bed_pipe_4 = "Weapons Bed - Pipe 4" -weapons_bed_pipe_5 = "Weapons Bed - Pipe 5" -weapons_bed_omo_1 = "Weapons Bed - Omochao 1" -weapons_bed_omo_2 = "Weapons Bed - Omochao 2" -weapons_bed_omo_3 = "Weapons Bed - Omochao 3" -weapons_bed_upgrade = "Weapons Bed - Upgrade" -cosmic_wall_1 = "Cosmic Wall - 1" -cosmic_wall_2 = "Cosmic Wall - 2" -cosmic_wall_3 = "Cosmic Wall - 3" -cosmic_wall_4 = "Cosmic Wall - 4" -cosmic_wall_5 = "Cosmic Wall - 5" -cosmic_wall_chao_1 = "Cosmic Wall - Chao Key 1" -cosmic_wall_chao_2 = "Cosmic Wall - Chao Key 2" -cosmic_wall_chao_3 = "Cosmic Wall - Chao Key 3" -cosmic_wall_pipe_1 = "Cosmic Wall - Pipe 1" -cosmic_wall_pipe_2 = "Cosmic Wall - Pipe 2" -cosmic_wall_pipe_3 = "Cosmic Wall - Pipe 3" -cosmic_wall_pipe_4 = "Cosmic Wall - Pipe 4" -cosmic_wall_pipe_5 = "Cosmic Wall - Pipe 5" -cosmic_wall_omo_1 = "Cosmic Wall - Omochao 1" -cosmic_wall_beetle = "Cosmic Wall - Gold Beetle" -cosmic_wall_upgrade = "Cosmic Wall - Upgrade" +iron_gate_1 = "Iron Gate - 1" +iron_gate_2 = "Iron Gate - 2" +iron_gate_3 = "Iron Gate - 3" +iron_gate_4 = "Iron Gate - 4" +iron_gate_5 = "Iron Gate - 5" +iron_gate_chao_1 = "Iron Gate - Chao Key 1" +iron_gate_chao_2 = "Iron Gate - Chao Key 2" +iron_gate_chao_3 = "Iron Gate - Chao Key 3" +iron_gate_pipe_1 = "Iron Gate - Pipe 1" +iron_gate_pipe_2 = "Iron Gate - Pipe 2" +iron_gate_pipe_3 = "Iron Gate - Pipe 3" +iron_gate_pipe_4 = "Iron Gate - Pipe 4" +iron_gate_pipe_5 = "Iron Gate - Pipe 5" +iron_gate_omo_1 = "Iron Gate - Omochao 1" +iron_gate_omo_2 = "Iron Gate - Omochao 2" +iron_gate_omo_3 = "Iron Gate - Omochao 3" +iron_gate_omo_4 = "Iron Gate - Omochao 4" +iron_gate_omo_5 = "Iron Gate - Omochao 5" +iron_gate_omo_6 = "Iron Gate - Omochao 6" +iron_gate_beetle = "Iron Gate - Gold Beetle" +iron_gate_animal_1 = "Iron Gate - 1 Animal" +iron_gate_animal_2 = "Iron Gate - 2 Animals" +iron_gate_animal_3 = "Iron Gate - 3 Animals" +iron_gate_animal_4 = "Iron Gate - 4 Animals" +iron_gate_animal_5 = "Iron Gate - 5 Animals" +iron_gate_animal_6 = "Iron Gate - 6 Animals" +iron_gate_animal_7 = "Iron Gate - 7 Animals" +iron_gate_animal_8 = "Iron Gate - 8 Animals" +iron_gate_animal_9 = "Iron Gate - 9 Animals" +iron_gate_animal_10 = "Iron Gate - 10 Animals" +iron_gate_animal_11 = "Iron Gate - 11 Animals" +iron_gate_animal_12 = "Iron Gate - 12 Animals" +iron_gate_animal_13 = "Iron Gate - 13 Animals" +iron_gate_animal_14 = "Iron Gate - 14 Animals" +iron_gate_animal_15 = "Iron Gate - 15 Animals" +iron_gate_upgrade = "Iron Gate - Upgrade" +sand_ocean_1 = "Sand Ocean - 1" +sand_ocean_2 = "Sand Ocean - 2" +sand_ocean_3 = "Sand Ocean - 3" +sand_ocean_4 = "Sand Ocean - 4" +sand_ocean_5 = "Sand Ocean - 5" +sand_ocean_chao_1 = "Sand Ocean - Chao Key 1" +sand_ocean_chao_2 = "Sand Ocean - Chao Key 2" +sand_ocean_chao_3 = "Sand Ocean - Chao Key 3" +sand_ocean_pipe_1 = "Sand Ocean - Pipe 1" +sand_ocean_pipe_2 = "Sand Ocean - Pipe 2" +sand_ocean_pipe_3 = "Sand Ocean - Pipe 3" +sand_ocean_pipe_4 = "Sand Ocean - Pipe 4" +sand_ocean_pipe_5 = "Sand Ocean - Pipe 5" +sand_ocean_omo_1 = "Sand Ocean - Omochao 1" +sand_ocean_omo_2 = "Sand Ocean - Omochao 2" +sand_ocean_beetle = "Sand Ocean - Gold Beetle" +sand_ocean_animal_1 = "Sand Ocean - 1 Animal" +sand_ocean_animal_2 = "Sand Ocean - 2 Animals" +sand_ocean_animal_3 = "Sand Ocean - 3 Animals" +sand_ocean_animal_4 = "Sand Ocean - 4 Animals" +sand_ocean_animal_5 = "Sand Ocean - 5 Animals" +sand_ocean_animal_6 = "Sand Ocean - 6 Animals" +sand_ocean_animal_7 = "Sand Ocean - 7 Animals" +sand_ocean_animal_8 = "Sand Ocean - 8 Animals" +sand_ocean_animal_9 = "Sand Ocean - 9 Animals" +sand_ocean_animal_10 = "Sand Ocean - 10 Animals" +sand_ocean_animal_11 = "Sand Ocean - 11 Animals" +sand_ocean_animal_12 = "Sand Ocean - 12 Animals" +sand_ocean_animal_13 = "Sand Ocean - 13 Animals" +sand_ocean_animal_14 = "Sand Ocean - 14 Animals" +sand_ocean_animal_15 = "Sand Ocean - 15 Animals" +sand_ocean_upgrade = "Sand Ocean - Upgrade" +lost_colony_1 = "Lost Colony - 1" +lost_colony_2 = "Lost Colony - 2" +lost_colony_3 = "Lost Colony - 3" +lost_colony_4 = "Lost Colony - 4" +lost_colony_5 = "Lost Colony - 5" +lost_colony_chao_1 = "Lost Colony - Chao Key 1" +lost_colony_chao_2 = "Lost Colony - Chao Key 2" +lost_colony_chao_3 = "Lost Colony - Chao Key 3" +lost_colony_pipe_1 = "Lost Colony - Pipe 1" +lost_colony_pipe_2 = "Lost Colony - Pipe 2" +lost_colony_hidden_1 = "Lost Colony - Hidden 1" +lost_colony_omo_1 = "Lost Colony - Omochao 1" +lost_colony_omo_2 = "Lost Colony - Omochao 2" +lost_colony_omo_3 = "Lost Colony - Omochao 3" +lost_colony_omo_4 = "Lost Colony - Omochao 4" +lost_colony_omo_5 = "Lost Colony - Omochao 5" +lost_colony_omo_6 = "Lost Colony - Omochao 6" +lost_colony_omo_7 = "Lost Colony - Omochao 7" +lost_colony_omo_8 = "Lost Colony - Omochao 8" +lost_colony_beetle = "Lost Colony - Gold Beetle" +lost_colony_animal_1 = "Lost Colony - 1 Animal" +lost_colony_animal_2 = "Lost Colony - 2 Animals" +lost_colony_animal_3 = "Lost Colony - 3 Animals" +lost_colony_animal_4 = "Lost Colony - 4 Animals" +lost_colony_animal_5 = "Lost Colony - 5 Animals" +lost_colony_animal_6 = "Lost Colony - 6 Animals" +lost_colony_animal_7 = "Lost Colony - 7 Animals" +lost_colony_animal_8 = "Lost Colony - 8 Animals" +lost_colony_animal_9 = "Lost Colony - 9 Animals" +lost_colony_animal_10 = "Lost Colony - 10 Animals" +lost_colony_animal_11 = "Lost Colony - 11 Animals" +lost_colony_animal_12 = "Lost Colony - 12 Animals" +lost_colony_animal_13 = "Lost Colony - 13 Animals" +lost_colony_animal_14 = "Lost Colony - 14 Animals" +lost_colony_upgrade = "Lost Colony - Upgrade" +weapons_bed_1 = "Weapons Bed - 1" +weapons_bed_2 = "Weapons Bed - 2" +weapons_bed_3 = "Weapons Bed - 3" +weapons_bed_4 = "Weapons Bed - 4" +weapons_bed_5 = "Weapons Bed - 5" +weapons_bed_chao_1 = "Weapons Bed - Chao Key 1" +weapons_bed_chao_2 = "Weapons Bed - Chao Key 2" +weapons_bed_chao_3 = "Weapons Bed - Chao Key 3" +weapons_bed_pipe_1 = "Weapons Bed - Pipe 1" +weapons_bed_pipe_2 = "Weapons Bed - Pipe 2" +weapons_bed_pipe_3 = "Weapons Bed - Pipe 3" +weapons_bed_pipe_4 = "Weapons Bed - Pipe 4" +weapons_bed_pipe_5 = "Weapons Bed - Pipe 5" +weapons_bed_omo_1 = "Weapons Bed - Omochao 1" +weapons_bed_omo_2 = "Weapons Bed - Omochao 2" +weapons_bed_omo_3 = "Weapons Bed - Omochao 3" +weapons_bed_animal_1 = "Weapons Bed - 1 Animal" +weapons_bed_animal_2 = "Weapons Bed - 2 Animals" +weapons_bed_animal_3 = "Weapons Bed - 3 Animals" +weapons_bed_animal_4 = "Weapons Bed - 4 Animals" +weapons_bed_animal_5 = "Weapons Bed - 5 Animals" +weapons_bed_animal_6 = "Weapons Bed - 6 Animals" +weapons_bed_animal_7 = "Weapons Bed - 7 Animals" +weapons_bed_animal_8 = "Weapons Bed - 8 Animals" +weapons_bed_animal_9 = "Weapons Bed - 9 Animals" +weapons_bed_animal_10 = "Weapons Bed - 10 Animals" +weapons_bed_animal_11 = "Weapons Bed - 11 Animals" +weapons_bed_animal_12 = "Weapons Bed - 12 Animals" +weapons_bed_animal_13 = "Weapons Bed - 13 Animals" +weapons_bed_animal_14 = "Weapons Bed - 14 Animals" +weapons_bed_animal_15 = "Weapons Bed - 15 Animals" +weapons_bed_upgrade = "Weapons Bed - Upgrade" +cosmic_wall_1 = "Cosmic Wall - 1" +cosmic_wall_2 = "Cosmic Wall - 2" +cosmic_wall_3 = "Cosmic Wall - 3" +cosmic_wall_4 = "Cosmic Wall - 4" +cosmic_wall_5 = "Cosmic Wall - 5" +cosmic_wall_chao_1 = "Cosmic Wall - Chao Key 1" +cosmic_wall_chao_2 = "Cosmic Wall - Chao Key 2" +cosmic_wall_chao_3 = "Cosmic Wall - Chao Key 3" +cosmic_wall_pipe_1 = "Cosmic Wall - Pipe 1" +cosmic_wall_pipe_2 = "Cosmic Wall - Pipe 2" +cosmic_wall_pipe_3 = "Cosmic Wall - Pipe 3" +cosmic_wall_pipe_4 = "Cosmic Wall - Pipe 4" +cosmic_wall_pipe_5 = "Cosmic Wall - Pipe 5" +cosmic_wall_omo_1 = "Cosmic Wall - Omochao 1" +cosmic_wall_beetle = "Cosmic Wall - Gold Beetle" +cosmic_wall_animal_1 = "Cosmic Wall - 1 Animal" +cosmic_wall_animal_2 = "Cosmic Wall - 2 Animals" +cosmic_wall_animal_3 = "Cosmic Wall - 3 Animals" +cosmic_wall_animal_4 = "Cosmic Wall - 4 Animals" +cosmic_wall_animal_5 = "Cosmic Wall - 5 Animals" +cosmic_wall_animal_6 = "Cosmic Wall - 6 Animals" +cosmic_wall_animal_7 = "Cosmic Wall - 7 Animals" +cosmic_wall_animal_8 = "Cosmic Wall - 8 Animals" +cosmic_wall_animal_9 = "Cosmic Wall - 9 Animals" +cosmic_wall_animal_10 = "Cosmic Wall - 10 Animals" +cosmic_wall_animal_11 = "Cosmic Wall - 11 Animals" +cosmic_wall_animal_12 = "Cosmic Wall - 12 Animals" +cosmic_wall_animal_13 = "Cosmic Wall - 13 Animals" +cosmic_wall_animal_14 = "Cosmic Wall - 14 Animals" +cosmic_wall_animal_15 = "Cosmic Wall - 15 Animals" +cosmic_wall_upgrade = "Cosmic Wall - Upgrade" # Rouge Mission Definitions dry_lagoon_1 = "Dry Lagoon - 1" @@ -533,6 +899,16 @@ dry_lagoon_omo_11 = "Dry Lagoon - Omochao 11" dry_lagoon_omo_12 = "Dry Lagoon - Omochao 12" dry_lagoon_beetle = "Dry Lagoon - Gold Beetle" +dry_lagoon_animal_1 = "Dry Lagoon - 1 Animal" +dry_lagoon_animal_2 = "Dry Lagoon - 2 Animals" +dry_lagoon_animal_3 = "Dry Lagoon - 3 Animals" +dry_lagoon_animal_4 = "Dry Lagoon - 4 Animals" +dry_lagoon_animal_5 = "Dry Lagoon - 5 Animals" +dry_lagoon_animal_6 = "Dry Lagoon - 6 Animals" +dry_lagoon_animal_7 = "Dry Lagoon - 7 Animals" +dry_lagoon_animal_8 = "Dry Lagoon - 8 Animals" +dry_lagoon_animal_9 = "Dry Lagoon - 9 Animals" +dry_lagoon_animal_10 = "Dry Lagoon - 10 Animals" dry_lagoon_upgrade = "Dry Lagoon - Upgrade" egg_quarters_1 = "Egg Quarters - 1" egg_quarters_2 = "Egg Quarters - 2" @@ -554,6 +930,16 @@ egg_quarters_omo_6 = "Egg Quarters - Omochao 6" egg_quarters_omo_7 = "Egg Quarters - Omochao 7" egg_quarters_beetle = "Egg Quarters - Gold Beetle" +egg_quarters_animal_1 = "Egg Quarters - 1 Animal" +egg_quarters_animal_2 = "Egg Quarters - 2 Animals" +egg_quarters_animal_3 = "Egg Quarters - 3 Animals" +egg_quarters_animal_4 = "Egg Quarters - 4 Animals" +egg_quarters_animal_5 = "Egg Quarters - 5 Animals" +egg_quarters_animal_6 = "Egg Quarters - 6 Animals" +egg_quarters_animal_7 = "Egg Quarters - 7 Animals" +egg_quarters_animal_8 = "Egg Quarters - 8 Animals" +egg_quarters_animal_9 = "Egg Quarters - 9 Animals" +egg_quarters_animal_10 = "Egg Quarters - 10 Animals" egg_quarters_upgrade = "Egg Quarters - Upgrade" security_hall_1 = "Security Hall - 1" security_hall_2 = "Security Hall - 2" @@ -578,6 +964,14 @@ security_hall_omo_11 = "Security Hall - Omochao 11" security_hall_omo_12 = "Security Hall - Omochao 12" security_hall_beetle = "Security Hall - Gold Beetle" +security_hall_animal_1 = "Security Hall - 1 Animal" +security_hall_animal_2 = "Security Hall - 2 Animals" +security_hall_animal_3 = "Security Hall - 3 Animals" +security_hall_animal_4 = "Security Hall - 4 Animals" +security_hall_animal_5 = "Security Hall - 5 Animals" +security_hall_animal_6 = "Security Hall - 6 Animals" +security_hall_animal_7 = "Security Hall - 7 Animals" +security_hall_animal_8 = "Security Hall - 8 Animals" security_hall_upgrade = "Security Hall - Upgrade" route_280_1 = "Route 280 - 1" route_280_2 = "Route 280 - 2" @@ -602,33 +996,67 @@ mad_space_omo_4 = "Mad Space - Omochao 4" mad_space_omo_5 = "Mad Space - Omochao 5" mad_space_beetle = "Mad Space - Gold Beetle" +mad_space_animal_1 = "Mad Space - 1 Animal" +mad_space_animal_2 = "Mad Space - 2 Animals" +mad_space_animal_3 = "Mad Space - 3 Animals" +mad_space_animal_4 = "Mad Space - 4 Animals" +mad_space_animal_5 = "Mad Space - 5 Animals" +mad_space_animal_6 = "Mad Space - 6 Animals" +mad_space_animal_7 = "Mad Space - 7 Animals" +mad_space_animal_8 = "Mad Space - 8 Animals" +mad_space_animal_9 = "Mad Space - 9 Animals" +mad_space_animal_10 = "Mad Space - 10 Animals" mad_space_upgrade = "Mad Space - Upgrade" # Final Mission Definitions -cannon_core_1 = "Cannon Core - 1" -cannon_core_2 = "Cannon Core - 2" -cannon_core_3 = "Cannon Core - 3" -cannon_core_4 = "Cannon Core - 4" -cannon_core_5 = "Cannon Core - 5" -cannon_core_chao_1 = "Cannon Core - Chao Key 1" -cannon_core_chao_2 = "Cannon Core - Chao Key 2" -cannon_core_chao_3 = "Cannon Core - Chao Key 3" -cannon_core_pipe_1 = "Cannon Core - Pipe 1" -cannon_core_pipe_2 = "Cannon Core - Pipe 2" -cannon_core_pipe_3 = "Cannon Core - Pipe 3" -cannon_core_pipe_4 = "Cannon Core - Pipe 4" -cannon_core_pipe_5 = "Cannon Core - Pipe 5" -cannon_core_omo_1 = "Cannon Core - Omochao 1" -cannon_core_omo_2 = "Cannon Core - Omochao 2" -cannon_core_omo_3 = "Cannon Core - Omochao 3" -cannon_core_omo_4 = "Cannon Core - Omochao 4" -cannon_core_omo_5 = "Cannon Core - Omochao 5" -cannon_core_omo_6 = "Cannon Core - Omochao 6" -cannon_core_omo_7 = "Cannon Core - Omochao 7" -cannon_core_omo_8 = "Cannon Core - Omochao 8" -cannon_core_omo_9 = "Cannon Core - Omochao 9" -cannon_core_hidden_1 = "Cannon Core - Hidden 1" -cannon_core_beetle = "Cannon Core - Gold Beetle" +cannon_core_1 = "Cannon's Core - 1" +cannon_core_2 = "Cannon's Core - 2" +cannon_core_3 = "Cannon's Core - 3" +cannon_core_4 = "Cannon's Core - 4" +cannon_core_5 = "Cannon's Core - 5" +cannon_core_chao_1 = "Cannon's Core - Chao Key 1" +cannon_core_chao_2 = "Cannon's Core - Chao Key 2" +cannon_core_chao_3 = "Cannon's Core - Chao Key 3" +cannon_core_pipe_1 = "Cannon's Core - Pipe 1" +cannon_core_pipe_2 = "Cannon's Core - Pipe 2" +cannon_core_pipe_3 = "Cannon's Core - Pipe 3" +cannon_core_pipe_4 = "Cannon's Core - Pipe 4" +cannon_core_pipe_5 = "Cannon's Core - Pipe 5" +cannon_core_omo_1 = "Cannon's Core - Omochao 1" +cannon_core_omo_2 = "Cannon's Core - Omochao 2" +cannon_core_omo_3 = "Cannon's Core - Omochao 3" +cannon_core_omo_4 = "Cannon's Core - Omochao 4" +cannon_core_omo_5 = "Cannon's Core - Omochao 5" +cannon_core_omo_6 = "Cannon's Core - Omochao 6" +cannon_core_omo_7 = "Cannon's Core - Omochao 7" +cannon_core_omo_8 = "Cannon's Core - Omochao 8" +cannon_core_omo_9 = "Cannon's Core - Omochao 9" +cannon_core_hidden_1 = "Cannon's Core - Hidden 1" +cannon_core_beetle = "Cannon's Core - Gold Beetle" +cannon_core_animal_1 = "Cannon's Core - 1 Animal" +cannon_core_animal_2 = "Cannon's Core - 2 Animals" +cannon_core_animal_3 = "Cannon's Core - 3 Animals" +cannon_core_animal_4 = "Cannon's Core - 4 Animals" +cannon_core_animal_5 = "Cannon's Core - 5 Animals" +cannon_core_animal_6 = "Cannon's Core - 6 Animals" +cannon_core_animal_7 = "Cannon's Core - 7 Animals" +cannon_core_animal_8 = "Cannon's Core - 8 Animals" +cannon_core_animal_9 = "Cannon's Core - 9 Animals" +cannon_core_animal_10 = "Cannon's Core - 10 Animals" +cannon_core_animal_11 = "Cannon's Core - 11 Animals" +cannon_core_animal_12 = "Cannon's Core - 12 Animals" +cannon_core_animal_13 = "Cannon's Core - 13 Animals" +cannon_core_animal_14 = "Cannon's Core - 14 Animals" +cannon_core_animal_15 = "Cannon's Core - 15 Animals" +cannon_core_animal_16 = "Cannon's Core - 16 Animals" +cannon_core_animal_17 = "Cannon's Core - 17 Animals" +cannon_core_animal_18 = "Cannon's Core - 18 Animals" +cannon_core_animal_19 = "Cannon's Core - 19 Animals" + +# Green Hill Definitions +green_hill = "Green Hill" +green_hill_chao_1 = "Green Hill - Chao Key 1" +green_hill_animal_1 = "Green Hill - 1 Animal" # Boss Definitions gate_1_boss = "Gate 1 Boss" @@ -637,6 +1065,23 @@ gate_4_boss = "Gate 4 Boss" gate_5_boss = "Gate 5 Boss" +boss_rush_1 = "Boss Rush - 1" +boss_rush_2 = "Boss Rush - 2" +boss_rush_3 = "Boss Rush - 3" +boss_rush_4 = "Boss Rush - 4" +boss_rush_5 = "Boss Rush - 5" +boss_rush_6 = "Boss Rush - 6" +boss_rush_7 = "Boss Rush - 7" +boss_rush_8 = "Boss Rush - 8" +boss_rush_9 = "Boss Rush - 9" +boss_rush_10 = "Boss Rush - 10" +boss_rush_11 = "Boss Rush - 11" +boss_rush_12 = "Boss Rush - 12" +boss_rush_13 = "Boss Rush - 13" +boss_rush_14 = "Boss Rush - 14" +boss_rush_15 = "Boss Rush - 15" +boss_rush_16 = "Boss Rush - 16" + # Chao Garden Definitions chao_race_crab_pool_1 = "Chao Race - Beginner - Crab Pool 1" chao_race_crab_pool_2 = "Chao Race - Beginner - Crab Pool 2" @@ -735,10 +1180,8 @@ kart_race_expert = "Kart Race - Expert" # Other Definitions -green_hill = "Green Hill" -green_hill_chao_1 = "Green Hill - Chao Key 1" -biolizard = "Biolizard" -finalhazard = "Finalhazard" +biolizard = "Biolizard" +finalhazard = "Finalhazard" # Region Definitions @@ -756,6 +1199,23 @@ gate_4_boss_region = "Gate 4 Boss" gate_5_boss_region = "Gate 5 Boss" +boss_rush_1_region = "Boss Rush 1" +boss_rush_2_region = "Boss Rush 2" +boss_rush_3_region = "Boss Rush 3" +boss_rush_4_region = "Boss Rush 4" +boss_rush_5_region = "Boss Rush 5" +boss_rush_6_region = "Boss Rush 6" +boss_rush_7_region = "Boss Rush 7" +boss_rush_8_region = "Boss Rush 8" +boss_rush_9_region = "Boss Rush 9" +boss_rush_10_region = "Boss Rush 10" +boss_rush_11_region = "Boss Rush 11" +boss_rush_12_region = "Boss Rush 12" +boss_rush_13_region = "Boss Rush 13" +boss_rush_14_region = "Boss Rush 14" +boss_rush_15_region = "Boss Rush 15" +boss_rush_16_region = "Boss Rush 16" + city_escape_region = "City Escape" metal_harbor_region = "Metal Harbor" green_forest_region = "Green Forest" @@ -792,7 +1252,7 @@ route_280_region = "Route 280" mad_space_region = "Mad Space" -cannon_core_region = "Cannon Core" +cannon_core_region = "Cannon's Core" biolizard_region = "Biolizard" diff --git a/worlds/sa2b/Options.py b/worlds/sa2b/Options.py index f4dfd833c405..6bef9def3dd8 100644 --- a/worlds/sa2b/Options.py +++ b/worlds/sa2b/Options.py @@ -10,14 +10,29 @@ class Goal(Choice): Chaos Emerald Hunt: Find the Seven Chaos Emeralds and reach Green Hill Zone Finalhazard Chaos Emerald Hunt: Find the Seven Chaos Emeralds and reach Green Hill Zone, then defeat Finalhazard Grand Prix: Win every race in Kart Race Mode (all standard levels are disabled) + Boss Rush: Beat all of the bosses in the Boss Rush, ending with Finalhazard + Cannon's Core Boss Rush: Beat Cannon's Core, then beat all of the bosses in the Boss Rush, ending with Finalhazard + Boss Rush Chaos Emerald Hunt: Find the Seven Chaos Emeralds, then beat all of the bosses in the Boss Rush, ending with Finalhazard """ display_name = "Goal" option_biolizard = 0 option_chaos_emerald_hunt = 1 option_finalhazard_chaos_emerald_hunt = 2 option_grand_prix = 3 + option_boss_rush = 4 + option_cannons_core_boss_rush = 5 + option_boss_rush_chaos_emerald_hunt = 6 default = 0 + @classmethod + def get_option_name(cls, value) -> str: + if cls.auto_display_name and value == 5: + return "Cannon's Core Boss Rush" + elif cls.auto_display_name: + return cls.name_lookup[value].replace("_", " ").title() + else: + return cls.name_lookup[value] + class MissionShuffle(Toggle): """ @@ -26,6 +41,22 @@ class MissionShuffle(Toggle): display_name = "Mission Shuffle" +class BossRushShuffle(Choice): + """ + Determines how bosses in Boss Rush Mode are shuffled + Vanilla: Bosses appear in the Vanilla ordering + Shuffled: The same bosses appear, but in a random order + Chaos: Each boss is randomly chosen separately (one will always be King Boom Boo) + Singularity: One boss is chosen and placed in every slot (one will always be replaced with King Boom Boo) + """ + display_name = "Boss Rush Shuffle" + option_vanilla = 0 + option_shuffled = 1 + option_chaos = 2 + option_singularity = 3 + default = 0 + + class BaseTrapWeight(Choice): """ Base Class for Trap Weights @@ -86,6 +117,27 @@ class DarknessTrapWeight(BaseTrapWeight): display_name = "Darkness Trap Weight" +class IceTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which makes the world slippery + """ + display_name = "Ice Trap Weight" + + +class SlowTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which makes you gotta go slow + """ + display_name = "Slow Trap Weight" + + +class CutsceneTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which makes you watch an unskippable cutscene + """ + display_name = "Cutscene Trap Weight" + + class PongTrapWeight(BaseTrapWeight): """ Likelihood of receiving a trap which forces you to play a Pong minigame @@ -124,25 +176,10 @@ class TrapFillPercentage(Range): default = 0 -class IncludeMissions(Range): - """ - Allows logic to place items in a range of Missions for each level - Each mission setting includes lower settings - 1: Base Story Missions - 2: 100 Ring Missions - 3: Lost Chao Missions - 4: Timer Missions - 5: Hard Mode Missions - """ - display_name = "Include Missions" - range_start = 1 - range_end = 5 - default = 2 - - class Keysanity(Toggle): """ Determines whether picking up Chao Keys grants checks + (86 Locations) """ display_name = "Keysanity" @@ -151,9 +188,9 @@ class Whistlesanity(Choice): """ Determines whether whistling at various spots grants checks None: No Whistle Spots grant checks - Pipes: Whistling at Pipes grants checks - Hidden: Whistling at Hidden Whistle Spots grants checks - Both: Whistling at both Pipes and Hidden Whistle Spots grants checks + Pipes: Whistling at Pipes grants checks (97 Locations) + Hidden: Whistling at Hidden Whistle Spots grants checks (32 Locations) + Both: Whistling at both Pipes and Hidden Whistle Spots grants checks (129 Locations) """ display_name = "Whistlesanity" option_none = 0 @@ -166,6 +203,7 @@ class Whistlesanity(Choice): class Beetlesanity(Toggle): """ Determines whether destroying Gold Beetles grants checks + (27 Locations) """ display_name = "Beetlesanity" @@ -173,10 +211,19 @@ class Beetlesanity(Toggle): class Omosanity(Toggle): """ Determines whether activating Omochao grants checks + (192 Locations) """ display_name = "Omosanity" +class Animalsanity(Toggle): + """ + Determines whether picking up counted small animals grants checks + (420 Locations) + """ + display_name = "Animalsanity" + + class KartRaceChecks(Choice): """ Determines whether Kart Race Mode grants checks @@ -236,6 +283,18 @@ class LevelGateCosts(Choice): default = 2 +class MaximumEmblemCap(Range): + """ + Determines the maximum number of emblems that can be in the item pool. + If fewer available locations exist in the pool than this number, the number of available locations will be used instead. + Gate and Cannon's Core costs will be calculated based off of that number. + """ + display_name = "Max Emblem Cap" + range_start = 50 + range_end = 500 + default = 180 + + class RequiredRank(Choice): """ Determines what minimum Rank is required to send a check for a mission @@ -254,8 +313,8 @@ class ChaoGardenDifficulty(Choice): Determines the number of chao garden difficulty levels included. Easier difficulty settings means fewer chao garden checks None: No Chao Garden Activities have checks Beginner: Beginner Races - Intermediate: Beginner and Jewel Races - Expert: Beginner, Jewel, Challenge, Hero, and Dark Races + Intermediate: Beginner, Challenge, Hero, and Dark Races + Expert: Beginner, Challenge, Hero, Dark and Jewel Races """ display_name = "Chao Garden Difficulty" option_none = 0 @@ -287,7 +346,7 @@ class ChaoRaceChecks(Choice): class RequiredCannonsCoreMissions(Choice): """ - Determines how many Cannon's Core missions must be completed to unlock the Biolizard (for the "Biolizard" goal) + Determines how many Cannon's Core missions must be completed (for Biolizard or Cannon's Core goals) First: Only the first mission must be completed All Active: All active Cannon's Core missions must be completed """ @@ -502,6 +561,13 @@ def get_option_name(cls, value) -> str: return cls.name_lookup[value] +class RingLink(Toggle): + """ + Whether your in-level ring gain/loss is linked to other players + """ + display_name = "Ring Link" + + class SADXMusic(Choice): """ Whether the randomizer will include Sonic Adventure DX Music in the music pool @@ -527,7 +593,7 @@ def get_option_name(cls, value) -> str: class MusicShuffle(Choice): """ What type of Music Shuffle is used - Off: No music is shuffled. + None: No music is shuffled. Levels: Level music is shuffled. Full: Level, Menu, and Additional music is shuffled. Singularity: Level, Menu, and Additional music is all replaced with a single random song. @@ -540,6 +606,24 @@ class MusicShuffle(Choice): default = 0 +class VoiceShuffle(Choice): + """ + What type of Voice Shuffle is used + None: No voices are shuffled. + Shuffled: Voices are shuffled. + Rude: Voices are shuffled, but some are replaced with rude words. + Chao: All voices are replaced with chao sounds. + Singularity: All voices are replaced with a single random voice. + """ + display_name = "Voice Shuffle Type" + option_none = 0 + option_shuffled = 1 + option_rude = 2 + option_chao = 3 + option_singularity = 4 + default = 0 + + class Narrator(Choice): """ Which menu narrator is used @@ -574,10 +658,12 @@ class LogicDifficulty(Choice): sa2b_options: typing.Dict[str, type(Option)] = { "goal": Goal, "mission_shuffle": MissionShuffle, + "boss_rush_shuffle": BossRushShuffle, "keysanity": Keysanity, "whistlesanity": Whistlesanity, "beetlesanity": Beetlesanity, "omosanity": Omosanity, + "animalsanity": Animalsanity, "kart_race_checks": KartRaceChecks, "required_rank": RequiredRank, "emblem_percentage_for_cannons_core": EmblemPercentageForCannonsCore, @@ -585,6 +671,7 @@ class LogicDifficulty(Choice): "number_of_level_gates": NumberOfLevelGates, "level_gate_distribution": LevelGateDistribution, "level_gate_costs": LevelGateCosts, + "max_emblem_cap": MaximumEmblemCap, "chao_garden_difficulty": ChaoGardenDifficulty, "include_chao_karate": IncludeChaoKarate, "chao_race_checks": ChaoRaceChecks, @@ -597,11 +684,16 @@ class LogicDifficulty(Choice): "gravity_trap_weight": GravityTrapWeight, "exposition_trap_weight": ExpositionTrapWeight, #"darkness_trap_weight": DarknessTrapWeight, + "ice_trap_weight": IceTrapWeight, + "slow_trap_weight": SlowTrapWeight, + "cutscene_trap_weight": CutsceneTrapWeight, "pong_trap_weight": PongTrapWeight, "minigame_trap_difficulty": MinigameTrapDifficulty, "ring_loss": RingLoss, + "ring_link": RingLink, "sadx_music": SADXMusic, "music_shuffle": MusicShuffle, + "voice_shuffle": VoiceShuffle, "narrator": Narrator, "logic_difficulty": LogicDifficulty, "speed_mission_count": SpeedMissionCount, diff --git a/worlds/sa2b/Regions.py b/worlds/sa2b/Regions.py index b18fa9ec78ea..da519283300a 100644 --- a/worlds/sa2b/Regions.py +++ b/worlds/sa2b/Regions.py @@ -149,6 +149,26 @@ def create_regions(world, player: int, active_locations): LocationName.city_escape_omo_13, LocationName.city_escape_omo_14, LocationName.city_escape_beetle, + LocationName.city_escape_animal_1, + LocationName.city_escape_animal_2, + LocationName.city_escape_animal_3, + LocationName.city_escape_animal_4, + LocationName.city_escape_animal_5, + LocationName.city_escape_animal_6, + LocationName.city_escape_animal_7, + LocationName.city_escape_animal_8, + LocationName.city_escape_animal_9, + LocationName.city_escape_animal_10, + LocationName.city_escape_animal_11, + LocationName.city_escape_animal_12, + LocationName.city_escape_animal_13, + LocationName.city_escape_animal_14, + LocationName.city_escape_animal_15, + LocationName.city_escape_animal_16, + LocationName.city_escape_animal_17, + LocationName.city_escape_animal_18, + LocationName.city_escape_animal_19, + LocationName.city_escape_animal_20, LocationName.city_escape_upgrade, ] city_escape_region = create_region(world, player, active_locations, LocationName.city_escape_region, @@ -170,6 +190,20 @@ def create_regions(world, player: int, active_locations): LocationName.metal_harbor_omo_4, LocationName.metal_harbor_omo_5, LocationName.metal_harbor_beetle, + LocationName.metal_harbor_animal_1, + LocationName.metal_harbor_animal_2, + LocationName.metal_harbor_animal_3, + LocationName.metal_harbor_animal_4, + LocationName.metal_harbor_animal_5, + LocationName.metal_harbor_animal_6, + LocationName.metal_harbor_animal_7, + LocationName.metal_harbor_animal_8, + LocationName.metal_harbor_animal_9, + LocationName.metal_harbor_animal_10, + LocationName.metal_harbor_animal_11, + LocationName.metal_harbor_animal_12, + LocationName.metal_harbor_animal_13, + LocationName.metal_harbor_animal_14, LocationName.metal_harbor_upgrade, ] metal_harbor_region = create_region(world, player, active_locations, LocationName.metal_harbor_region, @@ -191,6 +225,24 @@ def create_regions(world, player: int, active_locations): LocationName.green_forest_hidden_3, LocationName.green_forest_hidden_4, LocationName.green_forest_beetle, + LocationName.green_forest_animal_1, + LocationName.green_forest_animal_2, + LocationName.green_forest_animal_3, + LocationName.green_forest_animal_4, + LocationName.green_forest_animal_5, + LocationName.green_forest_animal_6, + LocationName.green_forest_animal_7, + LocationName.green_forest_animal_8, + LocationName.green_forest_animal_9, + LocationName.green_forest_animal_10, + LocationName.green_forest_animal_11, + LocationName.green_forest_animal_12, + LocationName.green_forest_animal_13, + LocationName.green_forest_animal_14, + LocationName.green_forest_animal_15, + LocationName.green_forest_animal_16, + LocationName.green_forest_animal_17, + LocationName.green_forest_animal_18, LocationName.green_forest_upgrade, ] green_forest_region = create_region(world, player, active_locations, LocationName.green_forest_region, @@ -214,6 +266,25 @@ def create_regions(world, player: int, active_locations): LocationName.pyramid_cave_omo_3, LocationName.pyramid_cave_omo_4, LocationName.pyramid_cave_beetle, + LocationName.pyramid_cave_animal_1, + LocationName.pyramid_cave_animal_2, + LocationName.pyramid_cave_animal_3, + LocationName.pyramid_cave_animal_4, + LocationName.pyramid_cave_animal_5, + LocationName.pyramid_cave_animal_6, + LocationName.pyramid_cave_animal_7, + LocationName.pyramid_cave_animal_8, + LocationName.pyramid_cave_animal_9, + LocationName.pyramid_cave_animal_10, + LocationName.pyramid_cave_animal_11, + LocationName.pyramid_cave_animal_12, + LocationName.pyramid_cave_animal_13, + LocationName.pyramid_cave_animal_14, + LocationName.pyramid_cave_animal_15, + LocationName.pyramid_cave_animal_16, + LocationName.pyramid_cave_animal_17, + LocationName.pyramid_cave_animal_18, + LocationName.pyramid_cave_animal_19, LocationName.pyramid_cave_upgrade, ] pyramid_cave_region = create_region(world, player, active_locations, LocationName.pyramid_cave_region, @@ -247,6 +318,22 @@ def create_regions(world, player: int, active_locations): LocationName.crazy_gadget_omo_12, LocationName.crazy_gadget_omo_13, LocationName.crazy_gadget_beetle, + LocationName.crazy_gadget_animal_1, + LocationName.crazy_gadget_animal_2, + LocationName.crazy_gadget_animal_3, + LocationName.crazy_gadget_animal_4, + LocationName.crazy_gadget_animal_5, + LocationName.crazy_gadget_animal_6, + LocationName.crazy_gadget_animal_7, + LocationName.crazy_gadget_animal_8, + LocationName.crazy_gadget_animal_9, + LocationName.crazy_gadget_animal_10, + LocationName.crazy_gadget_animal_11, + LocationName.crazy_gadget_animal_12, + LocationName.crazy_gadget_animal_13, + LocationName.crazy_gadget_animal_14, + LocationName.crazy_gadget_animal_15, + LocationName.crazy_gadget_animal_16, LocationName.crazy_gadget_upgrade, ] crazy_gadget_region = create_region(world, player, active_locations, LocationName.crazy_gadget_region, @@ -267,6 +354,22 @@ def create_regions(world, player: int, active_locations): LocationName.final_rush_omo_2, LocationName.final_rush_omo_3, LocationName.final_rush_beetle, + LocationName.final_rush_animal_1, + LocationName.final_rush_animal_2, + LocationName.final_rush_animal_3, + LocationName.final_rush_animal_4, + LocationName.final_rush_animal_5, + LocationName.final_rush_animal_6, + LocationName.final_rush_animal_7, + LocationName.final_rush_animal_8, + LocationName.final_rush_animal_9, + LocationName.final_rush_animal_10, + LocationName.final_rush_animal_11, + LocationName.final_rush_animal_12, + LocationName.final_rush_animal_13, + LocationName.final_rush_animal_14, + LocationName.final_rush_animal_15, + LocationName.final_rush_animal_16, LocationName.final_rush_upgrade, ] final_rush_region = create_region(world, player, active_locations, LocationName.final_rush_region, @@ -298,6 +401,21 @@ def create_regions(world, player: int, active_locations): LocationName.prison_lane_omo_9, LocationName.prison_lane_omo_10, LocationName.prison_lane_beetle, + LocationName.prison_lane_animal_1, + LocationName.prison_lane_animal_2, + LocationName.prison_lane_animal_3, + LocationName.prison_lane_animal_4, + LocationName.prison_lane_animal_5, + LocationName.prison_lane_animal_6, + LocationName.prison_lane_animal_7, + LocationName.prison_lane_animal_8, + LocationName.prison_lane_animal_9, + LocationName.prison_lane_animal_10, + LocationName.prison_lane_animal_11, + LocationName.prison_lane_animal_12, + LocationName.prison_lane_animal_13, + LocationName.prison_lane_animal_14, + LocationName.prison_lane_animal_15, LocationName.prison_lane_upgrade, ] prison_lane_region = create_region(world, player, active_locations, LocationName.prison_lane_region, @@ -328,6 +446,22 @@ def create_regions(world, player: int, active_locations): LocationName.mission_street_omo_7, LocationName.mission_street_omo_8, LocationName.mission_street_beetle, + LocationName.mission_street_animal_1, + LocationName.mission_street_animal_2, + LocationName.mission_street_animal_3, + LocationName.mission_street_animal_4, + LocationName.mission_street_animal_5, + LocationName.mission_street_animal_6, + LocationName.mission_street_animal_7, + LocationName.mission_street_animal_8, + LocationName.mission_street_animal_9, + LocationName.mission_street_animal_10, + LocationName.mission_street_animal_11, + LocationName.mission_street_animal_12, + LocationName.mission_street_animal_13, + LocationName.mission_street_animal_14, + LocationName.mission_street_animal_15, + LocationName.mission_street_animal_16, LocationName.mission_street_upgrade, ] mission_street_region = create_region(world, player, active_locations, LocationName.mission_street_region, @@ -361,6 +495,21 @@ def create_regions(world, player: int, active_locations): LocationName.hidden_base_omo_3, LocationName.hidden_base_omo_4, LocationName.hidden_base_beetle, + LocationName.hidden_base_animal_1, + LocationName.hidden_base_animal_2, + LocationName.hidden_base_animal_3, + LocationName.hidden_base_animal_4, + LocationName.hidden_base_animal_5, + LocationName.hidden_base_animal_6, + LocationName.hidden_base_animal_7, + LocationName.hidden_base_animal_8, + LocationName.hidden_base_animal_9, + LocationName.hidden_base_animal_10, + LocationName.hidden_base_animal_11, + LocationName.hidden_base_animal_12, + LocationName.hidden_base_animal_13, + LocationName.hidden_base_animal_14, + LocationName.hidden_base_animal_15, LocationName.hidden_base_upgrade, ] hidden_base_region = create_region(world, player, active_locations, LocationName.hidden_base_region, @@ -393,6 +542,21 @@ def create_regions(world, player: int, active_locations): LocationName.eternal_engine_omo_11, LocationName.eternal_engine_omo_12, LocationName.eternal_engine_beetle, + LocationName.eternal_engine_animal_1, + LocationName.eternal_engine_animal_2, + LocationName.eternal_engine_animal_3, + LocationName.eternal_engine_animal_4, + LocationName.eternal_engine_animal_5, + LocationName.eternal_engine_animal_6, + LocationName.eternal_engine_animal_7, + LocationName.eternal_engine_animal_8, + LocationName.eternal_engine_animal_9, + LocationName.eternal_engine_animal_10, + LocationName.eternal_engine_animal_11, + LocationName.eternal_engine_animal_12, + LocationName.eternal_engine_animal_13, + LocationName.eternal_engine_animal_14, + LocationName.eternal_engine_animal_15, LocationName.eternal_engine_upgrade, ] eternal_engine_region = create_region(world, player, active_locations, LocationName.eternal_engine_region, @@ -421,6 +585,16 @@ def create_regions(world, player: int, active_locations): LocationName.wild_canyon_omo_9, LocationName.wild_canyon_omo_10, LocationName.wild_canyon_beetle, + LocationName.wild_canyon_animal_1, + LocationName.wild_canyon_animal_2, + LocationName.wild_canyon_animal_3, + LocationName.wild_canyon_animal_4, + LocationName.wild_canyon_animal_5, + LocationName.wild_canyon_animal_6, + LocationName.wild_canyon_animal_7, + LocationName.wild_canyon_animal_8, + LocationName.wild_canyon_animal_9, + LocationName.wild_canyon_animal_10, LocationName.wild_canyon_upgrade, ] wild_canyon_region = create_region(world, player, active_locations, LocationName.wild_canyon_region, @@ -448,6 +622,17 @@ def create_regions(world, player: int, active_locations): LocationName.pumpkin_hill_omo_9, LocationName.pumpkin_hill_omo_10, LocationName.pumpkin_hill_omo_11, + LocationName.pumpkin_hill_animal_1, + LocationName.pumpkin_hill_animal_2, + LocationName.pumpkin_hill_animal_3, + LocationName.pumpkin_hill_animal_4, + LocationName.pumpkin_hill_animal_5, + LocationName.pumpkin_hill_animal_6, + LocationName.pumpkin_hill_animal_7, + LocationName.pumpkin_hill_animal_8, + LocationName.pumpkin_hill_animal_9, + LocationName.pumpkin_hill_animal_10, + LocationName.pumpkin_hill_animal_11, LocationName.pumpkin_hill_upgrade, ] pumpkin_hill_region = create_region(world, player, active_locations, LocationName.pumpkin_hill_region, @@ -473,6 +658,16 @@ def create_regions(world, player: int, active_locations): LocationName.aquatic_mine_omo_6, LocationName.aquatic_mine_omo_7, LocationName.aquatic_mine_beetle, + LocationName.aquatic_mine_animal_1, + LocationName.aquatic_mine_animal_2, + LocationName.aquatic_mine_animal_3, + LocationName.aquatic_mine_animal_4, + LocationName.aquatic_mine_animal_5, + LocationName.aquatic_mine_animal_6, + LocationName.aquatic_mine_animal_7, + LocationName.aquatic_mine_animal_8, + LocationName.aquatic_mine_animal_9, + LocationName.aquatic_mine_animal_10, LocationName.aquatic_mine_upgrade, ] aquatic_mine_region = create_region(world, player, active_locations, LocationName.aquatic_mine_region, @@ -502,6 +697,16 @@ def create_regions(world, player: int, active_locations): LocationName.death_chamber_omo_8, LocationName.death_chamber_omo_9, LocationName.death_chamber_beetle, + LocationName.death_chamber_animal_1, + LocationName.death_chamber_animal_2, + LocationName.death_chamber_animal_3, + LocationName.death_chamber_animal_4, + LocationName.death_chamber_animal_5, + LocationName.death_chamber_animal_6, + LocationName.death_chamber_animal_7, + LocationName.death_chamber_animal_8, + LocationName.death_chamber_animal_9, + LocationName.death_chamber_animal_10, LocationName.death_chamber_upgrade, ] death_chamber_region = create_region(world, player, active_locations, LocationName.death_chamber_region, @@ -523,6 +728,17 @@ def create_regions(world, player: int, active_locations): LocationName.meteor_herd_omo_2, LocationName.meteor_herd_omo_3, LocationName.meteor_herd_beetle, + LocationName.meteor_herd_animal_1, + LocationName.meteor_herd_animal_2, + LocationName.meteor_herd_animal_3, + LocationName.meteor_herd_animal_4, + LocationName.meteor_herd_animal_5, + LocationName.meteor_herd_animal_6, + LocationName.meteor_herd_animal_7, + LocationName.meteor_herd_animal_8, + LocationName.meteor_herd_animal_9, + LocationName.meteor_herd_animal_10, + LocationName.meteor_herd_animal_11, LocationName.meteor_herd_upgrade, ] meteor_herd_region = create_region(world, player, active_locations, LocationName.meteor_herd_region, @@ -552,6 +768,26 @@ def create_regions(world, player: int, active_locations): LocationName.radical_highway_omo_7, LocationName.radical_highway_omo_8, LocationName.radical_highway_beetle, + LocationName.radical_highway_animal_1, + LocationName.radical_highway_animal_2, + LocationName.radical_highway_animal_3, + LocationName.radical_highway_animal_4, + LocationName.radical_highway_animal_5, + LocationName.radical_highway_animal_6, + LocationName.radical_highway_animal_7, + LocationName.radical_highway_animal_8, + LocationName.radical_highway_animal_9, + LocationName.radical_highway_animal_10, + LocationName.radical_highway_animal_11, + LocationName.radical_highway_animal_12, + LocationName.radical_highway_animal_13, + LocationName.radical_highway_animal_14, + LocationName.radical_highway_animal_15, + LocationName.radical_highway_animal_16, + LocationName.radical_highway_animal_17, + LocationName.radical_highway_animal_18, + LocationName.radical_highway_animal_19, + LocationName.radical_highway_animal_20, LocationName.radical_highway_upgrade, ] radical_highway_region = create_region(world, player, active_locations, LocationName.radical_highway_region, @@ -579,6 +815,22 @@ def create_regions(world, player: int, active_locations): LocationName.white_jungle_omo_4, LocationName.white_jungle_omo_5, LocationName.white_jungle_beetle, + LocationName.white_jungle_animal_1, + LocationName.white_jungle_animal_2, + LocationName.white_jungle_animal_3, + LocationName.white_jungle_animal_4, + LocationName.white_jungle_animal_5, + LocationName.white_jungle_animal_6, + LocationName.white_jungle_animal_7, + LocationName.white_jungle_animal_8, + LocationName.white_jungle_animal_9, + LocationName.white_jungle_animal_10, + LocationName.white_jungle_animal_11, + LocationName.white_jungle_animal_12, + LocationName.white_jungle_animal_13, + LocationName.white_jungle_animal_14, + LocationName.white_jungle_animal_15, + LocationName.white_jungle_animal_16, LocationName.white_jungle_upgrade, ] white_jungle_region = create_region(world, player, active_locations, LocationName.white_jungle_region, @@ -600,6 +852,26 @@ def create_regions(world, player: int, active_locations): LocationName.sky_rail_pipe_5, LocationName.sky_rail_pipe_6, LocationName.sky_rail_beetle, + LocationName.sky_rail_animal_1, + LocationName.sky_rail_animal_2, + LocationName.sky_rail_animal_3, + LocationName.sky_rail_animal_4, + LocationName.sky_rail_animal_5, + LocationName.sky_rail_animal_6, + LocationName.sky_rail_animal_7, + LocationName.sky_rail_animal_8, + LocationName.sky_rail_animal_9, + LocationName.sky_rail_animal_10, + LocationName.sky_rail_animal_11, + LocationName.sky_rail_animal_12, + LocationName.sky_rail_animal_13, + LocationName.sky_rail_animal_14, + LocationName.sky_rail_animal_15, + LocationName.sky_rail_animal_16, + LocationName.sky_rail_animal_17, + LocationName.sky_rail_animal_18, + LocationName.sky_rail_animal_19, + LocationName.sky_rail_animal_20, LocationName.sky_rail_upgrade, ] sky_rail_region = create_region(world, player, active_locations, LocationName.sky_rail_region, @@ -619,6 +891,23 @@ def create_regions(world, player: int, active_locations): LocationName.final_chase_pipe_3, LocationName.final_chase_omo_1, LocationName.final_chase_beetle, + LocationName.final_chase_animal_1, + LocationName.final_chase_animal_2, + LocationName.final_chase_animal_3, + LocationName.final_chase_animal_4, + LocationName.final_chase_animal_5, + LocationName.final_chase_animal_6, + LocationName.final_chase_animal_7, + LocationName.final_chase_animal_8, + LocationName.final_chase_animal_9, + LocationName.final_chase_animal_10, + LocationName.final_chase_animal_11, + LocationName.final_chase_animal_12, + LocationName.final_chase_animal_13, + LocationName.final_chase_animal_14, + LocationName.final_chase_animal_15, + LocationName.final_chase_animal_16, + LocationName.final_chase_animal_17, LocationName.final_chase_upgrade, ] final_chase_region = create_region(world, player, active_locations, LocationName.final_chase_region, @@ -645,6 +934,21 @@ def create_regions(world, player: int, active_locations): LocationName.iron_gate_omo_5, LocationName.iron_gate_omo_6, LocationName.iron_gate_beetle, + LocationName.iron_gate_animal_1, + LocationName.iron_gate_animal_2, + LocationName.iron_gate_animal_3, + LocationName.iron_gate_animal_4, + LocationName.iron_gate_animal_5, + LocationName.iron_gate_animal_6, + LocationName.iron_gate_animal_7, + LocationName.iron_gate_animal_8, + LocationName.iron_gate_animal_9, + LocationName.iron_gate_animal_10, + LocationName.iron_gate_animal_11, + LocationName.iron_gate_animal_12, + LocationName.iron_gate_animal_13, + LocationName.iron_gate_animal_14, + LocationName.iron_gate_animal_15, LocationName.iron_gate_upgrade, ] iron_gate_region = create_region(world, player, active_locations, LocationName.iron_gate_region, @@ -667,6 +971,21 @@ def create_regions(world, player: int, active_locations): LocationName.sand_ocean_omo_1, LocationName.sand_ocean_omo_2, LocationName.sand_ocean_beetle, + LocationName.sand_ocean_animal_1, + LocationName.sand_ocean_animal_2, + LocationName.sand_ocean_animal_3, + LocationName.sand_ocean_animal_4, + LocationName.sand_ocean_animal_5, + LocationName.sand_ocean_animal_6, + LocationName.sand_ocean_animal_7, + LocationName.sand_ocean_animal_8, + LocationName.sand_ocean_animal_9, + LocationName.sand_ocean_animal_10, + LocationName.sand_ocean_animal_11, + LocationName.sand_ocean_animal_12, + LocationName.sand_ocean_animal_13, + LocationName.sand_ocean_animal_14, + LocationName.sand_ocean_animal_15, LocationName.sand_ocean_upgrade, ] sand_ocean_region = create_region(world, player, active_locations, LocationName.sand_ocean_region, @@ -693,6 +1012,20 @@ def create_regions(world, player: int, active_locations): LocationName.lost_colony_omo_7, LocationName.lost_colony_omo_8, LocationName.lost_colony_beetle, + LocationName.lost_colony_animal_1, + LocationName.lost_colony_animal_2, + LocationName.lost_colony_animal_3, + LocationName.lost_colony_animal_4, + LocationName.lost_colony_animal_5, + LocationName.lost_colony_animal_6, + LocationName.lost_colony_animal_7, + LocationName.lost_colony_animal_8, + LocationName.lost_colony_animal_9, + LocationName.lost_colony_animal_10, + LocationName.lost_colony_animal_11, + LocationName.lost_colony_animal_12, + LocationName.lost_colony_animal_13, + LocationName.lost_colony_animal_14, LocationName.lost_colony_upgrade, ] lost_colony_region = create_region(world, player, active_locations, LocationName.lost_colony_region, @@ -715,6 +1048,21 @@ def create_regions(world, player: int, active_locations): LocationName.weapons_bed_omo_1, LocationName.weapons_bed_omo_2, LocationName.weapons_bed_omo_3, + LocationName.weapons_bed_animal_1, + LocationName.weapons_bed_animal_2, + LocationName.weapons_bed_animal_3, + LocationName.weapons_bed_animal_4, + LocationName.weapons_bed_animal_5, + LocationName.weapons_bed_animal_6, + LocationName.weapons_bed_animal_7, + LocationName.weapons_bed_animal_8, + LocationName.weapons_bed_animal_9, + LocationName.weapons_bed_animal_10, + LocationName.weapons_bed_animal_11, + LocationName.weapons_bed_animal_12, + LocationName.weapons_bed_animal_13, + LocationName.weapons_bed_animal_14, + LocationName.weapons_bed_animal_15, LocationName.weapons_bed_upgrade, ] weapons_bed_region = create_region(world, player, active_locations, LocationName.weapons_bed_region, @@ -736,6 +1084,21 @@ def create_regions(world, player: int, active_locations): LocationName.cosmic_wall_pipe_5, LocationName.cosmic_wall_omo_1, LocationName.cosmic_wall_beetle, + LocationName.cosmic_wall_animal_1, + LocationName.cosmic_wall_animal_2, + LocationName.cosmic_wall_animal_3, + LocationName.cosmic_wall_animal_4, + LocationName.cosmic_wall_animal_5, + LocationName.cosmic_wall_animal_6, + LocationName.cosmic_wall_animal_7, + LocationName.cosmic_wall_animal_8, + LocationName.cosmic_wall_animal_9, + LocationName.cosmic_wall_animal_10, + LocationName.cosmic_wall_animal_11, + LocationName.cosmic_wall_animal_12, + LocationName.cosmic_wall_animal_13, + LocationName.cosmic_wall_animal_14, + LocationName.cosmic_wall_animal_15, LocationName.cosmic_wall_upgrade, ] cosmic_wall_region = create_region(world, player, active_locations, LocationName.cosmic_wall_region, @@ -765,6 +1128,16 @@ def create_regions(world, player: int, active_locations): LocationName.dry_lagoon_omo_11, LocationName.dry_lagoon_omo_12, LocationName.dry_lagoon_beetle, + LocationName.dry_lagoon_animal_1, + LocationName.dry_lagoon_animal_2, + LocationName.dry_lagoon_animal_3, + LocationName.dry_lagoon_animal_4, + LocationName.dry_lagoon_animal_5, + LocationName.dry_lagoon_animal_6, + LocationName.dry_lagoon_animal_7, + LocationName.dry_lagoon_animal_8, + LocationName.dry_lagoon_animal_9, + LocationName.dry_lagoon_animal_10, LocationName.dry_lagoon_upgrade, ] dry_lagoon_region = create_region(world, player, active_locations, LocationName.dry_lagoon_region, @@ -791,6 +1164,16 @@ def create_regions(world, player: int, active_locations): LocationName.egg_quarters_omo_6, LocationName.egg_quarters_omo_7, LocationName.egg_quarters_beetle, + LocationName.egg_quarters_animal_1, + LocationName.egg_quarters_animal_2, + LocationName.egg_quarters_animal_3, + LocationName.egg_quarters_animal_4, + LocationName.egg_quarters_animal_5, + LocationName.egg_quarters_animal_6, + LocationName.egg_quarters_animal_7, + LocationName.egg_quarters_animal_8, + LocationName.egg_quarters_animal_9, + LocationName.egg_quarters_animal_10, LocationName.egg_quarters_upgrade, ] egg_quarters_region = create_region(world, player, active_locations, LocationName.egg_quarters_region, @@ -820,6 +1203,14 @@ def create_regions(world, player: int, active_locations): LocationName.security_hall_omo_11, LocationName.security_hall_omo_12, LocationName.security_hall_beetle, + LocationName.security_hall_animal_1, + LocationName.security_hall_animal_2, + LocationName.security_hall_animal_3, + LocationName.security_hall_animal_4, + LocationName.security_hall_animal_5, + LocationName.security_hall_animal_6, + LocationName.security_hall_animal_7, + LocationName.security_hall_animal_8, LocationName.security_hall_upgrade, ] security_hall_region = create_region(world, player, active_locations, LocationName.security_hall_region, @@ -854,6 +1245,16 @@ def create_regions(world, player: int, active_locations): LocationName.mad_space_omo_4, LocationName.mad_space_omo_5, LocationName.mad_space_beetle, + LocationName.mad_space_animal_1, + LocationName.mad_space_animal_2, + LocationName.mad_space_animal_3, + LocationName.mad_space_animal_4, + LocationName.mad_space_animal_5, + LocationName.mad_space_animal_6, + LocationName.mad_space_animal_7, + LocationName.mad_space_animal_8, + LocationName.mad_space_animal_9, + LocationName.mad_space_animal_10, LocationName.mad_space_upgrade, ] mad_space_region = create_region(world, player, active_locations, LocationName.mad_space_region, @@ -883,6 +1284,25 @@ def create_regions(world, player: int, active_locations): LocationName.cannon_core_omo_7, LocationName.cannon_core_omo_8, LocationName.cannon_core_omo_9, + LocationName.cannon_core_animal_1, + LocationName.cannon_core_animal_2, + LocationName.cannon_core_animal_3, + LocationName.cannon_core_animal_4, + LocationName.cannon_core_animal_5, + LocationName.cannon_core_animal_6, + LocationName.cannon_core_animal_7, + LocationName.cannon_core_animal_8, + LocationName.cannon_core_animal_9, + LocationName.cannon_core_animal_10, + LocationName.cannon_core_animal_11, + LocationName.cannon_core_animal_12, + LocationName.cannon_core_animal_13, + LocationName.cannon_core_animal_14, + LocationName.cannon_core_animal_15, + LocationName.cannon_core_animal_16, + LocationName.cannon_core_animal_17, + LocationName.cannon_core_animal_18, + LocationName.cannon_core_animal_19, LocationName.cannon_core_beetle, ] cannon_core_region = create_region(world, player, active_locations, LocationName.cannon_core_region, @@ -1027,7 +1447,7 @@ def create_regions(world, player: int, active_locations): grand_prix_region_locations) world.regions += [grand_prix_region] - if world.goal[player] == 0 or world.goal[player] == 2: + if world.goal[player] in [0, 2, 4, 5, 6]: biolizard_region_locations = [ LocationName.finalhazard, ] @@ -1035,15 +1455,25 @@ def create_regions(world, player: int, active_locations): biolizard_region_locations) world.regions += [biolizard_region] - if world.goal[player] == 1 or world.goal[player] == 2: + if world.goal[player] in [1, 2]: green_hill_region_locations = [ LocationName.green_hill, LocationName.green_hill_chao_1, + #LocationName.green_hill_animal_1, ] green_hill_region = create_region(world, player, active_locations, LocationName.green_hill_region, green_hill_region_locations) world.regions += [green_hill_region] + if world.goal[player] in [4, 5, 6]: + for i in range(16): + boss_region_locations = [ + "Boss Rush - " + str(i + 1), + ] + boss_region = create_region(world, player, active_locations, "Boss Rush " + str(i + 1), + boss_region_locations) + world.regions += [boss_region] + # Set up the regions correctly. world.regions += [ @@ -1089,7 +1519,7 @@ def create_regions(world, player: int, active_locations): ] -def connect_regions(world, player, gates: typing.List[LevelGate], cannon_core_emblems, gate_bosses, first_cannons_core_mission: str, final_cannons_core_mission: str): +def connect_regions(world, player, gates: typing.List[LevelGate], cannon_core_emblems, gate_bosses, boss_rush_bosses, first_cannons_core_mission: str, final_cannons_core_mission: str): names: typing.Dict[str, int] = {} connect(world, player, names, 'Menu', LocationName.gate_0_region) @@ -1104,7 +1534,7 @@ def connect_regions(world, player, gates: typing.List[LevelGate], cannon_core_em connect(world, player, names, LocationName.cannon_core_region, LocationName.biolizard_region, lambda state: (state.can_reach(required_mission_name, "Location", player))) - elif world.goal[player] == 1 or world.goal[player] == 2: + elif world.goal[player] in [1, 2]: connect(world, player, names, 'Menu', LocationName.green_hill_region, lambda state: (state.has(ItemName.white_emerald, player) and state.has(ItemName.red_emerald, player) and @@ -1117,6 +1547,35 @@ def connect_regions(world, player, gates: typing.List[LevelGate], cannon_core_em connect(world, player, names, LocationName.green_hill_region, LocationName.biolizard_region) elif world.goal[player] == 3: connect(world, player, names, LocationName.kart_race_expert_region, LocationName.grand_prix_region) + elif world.goal[player] in [4, 5, 6]: + if world.goal[player] == 4: + connect(world, player, names, LocationName.gate_0_region, LocationName.boss_rush_1_region) + elif world.goal[player] == 5: + required_mission_name = first_cannons_core_mission + + if world.required_cannons_core_missions[player].value == 1: + required_mission_name = final_cannons_core_mission + + connect(world, player, names, LocationName.cannon_core_region, LocationName.boss_rush_1_region, + lambda state: (state.can_reach(required_mission_name, "Location", player))) + elif world.goal[player] == 6: + connect(world, player, names, LocationName.gate_0_region, LocationName.boss_rush_1_region, + lambda state: (state.has(ItemName.white_emerald, player) and + state.has(ItemName.red_emerald, player) and + state.has(ItemName.cyan_emerald, player) and + state.has(ItemName.purple_emerald, player) and + state.has(ItemName.green_emerald, player) and + state.has(ItemName.yellow_emerald, player) and + state.has(ItemName.blue_emerald, player))) + + for i in range(15): + if boss_rush_bosses[i] == all_gate_bosses_table[king_boom_boo]: + connect(world, player, names, "Boss Rush " + str(i + 1), "Boss Rush " + str(i + 2), + lambda state: (state.has(ItemName.knuckles_shovel_claws, player))) + else: + connect(world, player, names, "Boss Rush " + str(i + 1), "Boss Rush " + str(i + 2)) + + connect(world, player, names, LocationName.boss_rush_16_region, LocationName.biolizard_region) for i in range(len(gates[0].gate_levels)): connect(world, player, names, LocationName.gate_0_region, shuffleable_regions[gates[0].gate_levels[i]]) diff --git a/worlds/sa2b/Rules.py b/worlds/sa2b/Rules.py index ba3c8862c610..146938db7656 100644 --- a/worlds/sa2b/Rules.py +++ b/worlds/sa2b/Rules.py @@ -329,7 +329,8 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule_safe(world, LocationName.egg_quarters_5, player, lambda state: state.has(ItemName.rouge_pick_nails, player) and - state.has(ItemName.rouge_treasure_scope, player)) + state.has(ItemName.rouge_treasure_scope, player) and + state.has(ItemName.rouge_iron_boots, player)) add_rule_safe(world, LocationName.lost_colony_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) @@ -495,8 +496,6 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): lambda state: state.has(ItemName.tails_booster, player)) add_rule(world.get_location(LocationName.hidden_base_pipe_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.eternal_engine_pipe_1, player), - lambda state: state.has(ItemName.tails_booster, player)) add_rule(world.get_location(LocationName.sand_ocean_pipe_1, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) @@ -827,6 +826,507 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.knuckles_air_necklace, player)) + # Animal Upgrade Requirements + if world.animalsanity[player]: + add_rule(world.get_location(LocationName.hidden_base_animal_2, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.cosmic_wall_animal_2, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.hidden_base_animal_3, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_3, player), + lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_3, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_3, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.cosmic_wall_animal_3, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_3, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.hidden_base_animal_4, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_4, player), + lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_4, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_4, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.weapons_bed_animal_4, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.mad_space_animal_4, player), + lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_4, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_4, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.mission_street_animal_5, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_5, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_5, player), + lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_5, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_5, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.weapons_bed_animal_5, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.mad_space_animal_5, player), + lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_5, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_5, player), + lambda state: state.has(ItemName.tails_booster, player) and + (state.has(ItemName.eggman_jet_engine, player) or + state.has(ItemName.eggman_large_cannon, player))) + + add_rule(world.get_location(LocationName.metal_harbor_animal_6, player), + lambda state: state.has(ItemName.sonic_light_shoes, player)) + add_rule(world.get_location(LocationName.mission_street_animal_6, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_6, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_6, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_6, player), + lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_6, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_6, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.weapons_bed_animal_6, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.mad_space_animal_6, player), + lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_6, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_6, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.metal_harbor_animal_7, player), + lambda state: state.has(ItemName.sonic_light_shoes, player)) + add_rule(world.get_location(LocationName.mission_street_animal_7, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_7, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_7, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_7, player), + lambda state: state.has(ItemName.knuckles_shovel_claws, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_7, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_7, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.lost_colony_animal_7, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) or + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_7, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.security_hall_animal_7, player), + lambda state: state.has(ItemName.rouge_pick_nails, player) or + state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.mad_space_animal_7, player), + lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_7, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_7, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.metal_harbor_animal_8, player), + lambda state: state.has(ItemName.sonic_light_shoes, player)) + add_rule(world.get_location(LocationName.mission_street_animal_8, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_8, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_8, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_8, player), + lambda state: state.has(ItemName.knuckles_shovel_claws, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_8, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_8, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.lost_colony_animal_8, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_8, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.security_hall_animal_8, player), + lambda state: state.has(ItemName.rouge_pick_nails, player) and + state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.mad_space_animal_8, player), + lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_8, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_8, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.metal_harbor_animal_9, player), + lambda state: state.has(ItemName.sonic_light_shoes, player)) + add_rule(world.get_location(LocationName.mission_street_animal_9, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_9, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_9, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_9, player), + lambda state: state.has(ItemName.knuckles_shovel_claws, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_9, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_9, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.final_rush_animal_9, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.lost_colony_animal_9, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_9, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.mad_space_animal_9, player), + lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_9, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_9, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.wild_canyon_animal_10, player), + lambda state: state.has(ItemName.knuckles_shovel_claws, player)) + add_rule(world.get_location(LocationName.metal_harbor_animal_10, player), + lambda state: state.has(ItemName.sonic_light_shoes, player)) + add_rule(world.get_location(LocationName.mission_street_animal_10, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.aquatic_mine_animal_10, player), + lambda state: state.has(ItemName.knuckles_mystic_melody, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_10, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_10, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_10, player), + lambda state: state.has(ItemName.knuckles_shovel_claws, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_10, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_10, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.final_rush_animal_10, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.egg_quarters_animal_10, player), + lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.lost_colony_animal_10, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_10, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.mad_space_animal_10, player), + lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_10, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_10, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.metal_harbor_animal_11, player), + lambda state: state.has(ItemName.sonic_light_shoes, player)) + add_rule(world.get_location(LocationName.mission_street_animal_11, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_11, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_11, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_11, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_11, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and + (state.has(ItemName.sonic_flame_ring, player) or + state.has(ItemName.sonic_mystic_melody, player))) + add_rule(world.get_location(LocationName.final_rush_animal_11, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.lost_colony_animal_11, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_11, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.white_jungle_animal_11, player), + lambda state: state.has(ItemName.shadow_air_shoes, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_11, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_11, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.metal_harbor_animal_12, player), + lambda state: state.has(ItemName.sonic_light_shoes, player)) + add_rule(world.get_location(LocationName.mission_street_animal_12, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_12, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_12, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_12, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_12, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_flame_ring, player) and + (state.has(ItemName.sonic_light_shoes, player) or + state.has(ItemName.sonic_mystic_melody, player))) + add_rule(world.get_location(LocationName.final_rush_animal_12, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.sand_ocean_animal_12, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.lost_colony_animal_12, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_12, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.white_jungle_animal_12, player), + lambda state: state.has(ItemName.shadow_air_shoes, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_12, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_12, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.prison_lane_animal_13, player), + lambda state: state.has(ItemName.tails_booster, player) or + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.metal_harbor_animal_13, player), + lambda state: state.has(ItemName.sonic_light_shoes, player)) + add_rule(world.get_location(LocationName.mission_street_animal_13, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_13, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_13, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_13, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_13, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_flame_ring, player)) + add_rule(world.get_location(LocationName.final_rush_animal_13, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.sand_ocean_animal_13, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.lost_colony_animal_13, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_13, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.white_jungle_animal_13, player), + lambda state: state.has(ItemName.shadow_air_shoes, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_13, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_13, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player) and + (state.has(ItemName.knuckles_air_necklace, player) or + state.has(ItemName.knuckles_hammer_gloves, player))) + + add_rule(world.get_location(LocationName.prison_lane_animal_14, player), + lambda state: state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.metal_harbor_animal_14, player), + lambda state: state.has(ItemName.sonic_light_shoes, player)) + add_rule(world.get_location(LocationName.mission_street_animal_14, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_14, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_14, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_14, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_14, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_flame_ring, player)) + add_rule(world.get_location(LocationName.final_rush_animal_14, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.sand_ocean_animal_14, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.lost_colony_animal_14, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_14, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.white_jungle_animal_14, player), + lambda state: state.has(ItemName.shadow_air_shoes, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_14, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_14, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_air_necklace, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + + add_rule(world.get_location(LocationName.prison_lane_animal_15, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.mission_street_animal_15, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_15, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_15, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_15, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_15, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_flame_ring, player)) + add_rule(world.get_location(LocationName.final_rush_animal_15, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.iron_gate_animal_15, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.sand_ocean_animal_15, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_15, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.white_jungle_animal_15, player), + lambda state: state.has(ItemName.shadow_air_shoes, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_15, player), + lambda state: state.has(ItemName.eggman_mystic_melody, player) and + state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_15, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_air_necklace, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + + add_rule(world.get_location(LocationName.mission_street_animal_16, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.pyramid_cave_animal_16, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and + (state.has(ItemName.sonic_flame_ring, player) or + (state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_mystic_melody, player)))) + add_rule(world.get_location(LocationName.crazy_gadget_animal_16, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_flame_ring, player) and + state.has(ItemName.sonic_mystic_melody, player)) + add_rule(world.get_location(LocationName.final_rush_animal_16, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.white_jungle_animal_16, player), + lambda state: state.has(ItemName.shadow_flame_ring, player) and + state.has(ItemName.shadow_air_shoes, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_16, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_air_necklace, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + + add_rule(world.get_location(LocationName.pyramid_cave_animal_17, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_mystic_melody, player)) + + add_rule(world.get_location(LocationName.final_chase_animal_17, player), + lambda state: state.has(ItemName.shadow_flame_ring, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_17, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_air_necklace, player) and + state.has(ItemName.knuckles_hammer_gloves, player) and + (state.has(ItemName.sonic_bounce_bracelet, player) or + state.has(ItemName.sonic_flame_ring, player))) + + add_rule(world.get_location(LocationName.pyramid_cave_animal_18, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_mystic_melody, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_18, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_air_necklace, player) and + state.has(ItemName.knuckles_hammer_gloves, player) and + state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.pyramid_cave_animal_19, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_mystic_melody, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_19, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_air_necklace, player) and + state.has(ItemName.knuckles_hammer_gloves, player) and + state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_flame_ring, player)) + + add_rule(world.get_location(LocationName.radical_highway_animal_20, player), + lambda state: state.has(ItemName.shadow_flame_ring, player)) + def set_mission_upgrade_rules_hard(world: MultiWorld, player: int): # Mission 1 Upgrade Requirements add_rule_safe(world, LocationName.pumpkin_hill_1, player, @@ -1123,8 +1623,6 @@ def set_mission_upgrade_rules_hard(world: MultiWorld, player: int): if world.whistlesanity[player].value == 1 or world.whistlesanity[player].value == 3: add_rule(world.get_location(LocationName.hidden_base_pipe_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.eternal_engine_pipe_1, player), - lambda state: state.has(ItemName.tails_booster, player)) add_rule(world.get_location(LocationName.cosmic_wall_pipe_1, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) @@ -1359,6 +1857,338 @@ def set_mission_upgrade_rules_hard(world: MultiWorld, player: int): lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_hammer_gloves, player)) + # Animal Upgrade Requirements + if world.animalsanity[player]: + add_rule(world.get_location(LocationName.hidden_base_animal_2, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.cosmic_wall_animal_2, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.hidden_base_animal_3, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_3, player), + lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_3, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.cosmic_wall_animal_3, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_3, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.hidden_base_animal_4, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_4, player), + lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_4, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.weapons_bed_animal_4, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_4, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_4, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.hidden_base_animal_5, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_5, player), + lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_5, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.weapons_bed_animal_5, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_5, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_5, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.hidden_base_animal_6, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_6, player), + lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_6, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.weapons_bed_animal_6, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_6, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_6, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.hidden_base_animal_7, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_7, player), + lambda state: state.has(ItemName.knuckles_shovel_claws, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_7, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.weapons_bed_animal_7, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.security_hall_animal_7, player), + lambda state: state.has(ItemName.rouge_pick_nails, player) or + state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_7, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_7, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.hidden_base_animal_8, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_8, player), + lambda state: state.has(ItemName.knuckles_shovel_claws, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_8, player), + lambda state: state.has(ItemName.tails_booster, player)) + + add_rule(world.get_location(LocationName.weapons_bed_animal_8, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.security_hall_animal_8, player), + lambda state: state.has(ItemName.rouge_pick_nails, player) and + state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_8, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_8, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.mission_street_animal_9, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_9, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_9, player), + lambda state: state.has(ItemName.knuckles_shovel_claws, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_9, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.final_rush_animal_9, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.weapons_bed_animal_9, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_9, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_9, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.wild_canyon_animal_10, player), + lambda state: state.has(ItemName.knuckles_shovel_claws, player)) + add_rule(world.get_location(LocationName.mission_street_animal_10, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.aquatic_mine_animal_10, player), + lambda state: state.has(ItemName.knuckles_mystic_melody, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_10, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.death_chamber_animal_10, player), + lambda state: state.has(ItemName.knuckles_shovel_claws, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_10, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.final_rush_animal_10, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.egg_quarters_animal_10, player), + lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.lost_colony_animal_10, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_10, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.mad_space_animal_10, player), + lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_10, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_10, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.mission_street_animal_11, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_11, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_11, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.final_rush_animal_11, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.lost_colony_animal_11, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_11, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_11, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_11, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.mission_street_animal_12, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_12, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_12, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_12, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_flame_ring, player)) + add_rule(world.get_location(LocationName.final_rush_animal_12, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.lost_colony_animal_12, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_12, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_12, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_12, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.prison_lane_animal_13, player), + lambda state: state.has(ItemName.tails_booster, player) or + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.mission_street_animal_13, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_13, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_13, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_13, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_flame_ring, player)) + add_rule(world.get_location(LocationName.final_rush_animal_13, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.lost_colony_animal_13, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_13, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_13, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_13, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player)) + + add_rule(world.get_location(LocationName.prison_lane_animal_14, player), + lambda state: state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.mission_street_animal_14, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_14, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_14, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_14, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_flame_ring, player)) + add_rule(world.get_location(LocationName.final_rush_animal_14, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.lost_colony_animal_14, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_14, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_14, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_14, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + + add_rule(world.get_location(LocationName.prison_lane_animal_15, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.mission_street_animal_15, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.hidden_base_animal_15, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.eternal_engine_animal_15, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_15, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_flame_ring, player)) + add_rule(world.get_location(LocationName.final_rush_animal_15, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.iron_gate_animal_15, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + add_rule(world.get_location(LocationName.sand_ocean_animal_15, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.weapons_bed_animal_15, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player)) + add_rule(world.get_location(LocationName.cosmic_wall_animal_15, player), + lambda state: state.has(ItemName.eggman_jet_engine, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_15, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + + add_rule(world.get_location(LocationName.mission_street_animal_16, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player)) + add_rule(world.get_location(LocationName.crazy_gadget_animal_16, player), + lambda state: state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_flame_ring, player)) + add_rule(world.get_location(LocationName.final_rush_animal_16, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_16, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + + add_rule(world.get_location(LocationName.final_chase_animal_17, player), + lambda state: state.has(ItemName.shadow_flame_ring, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_17, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_18, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_hammer_gloves, player)) + + add_rule(world.get_location(LocationName.pyramid_cave_animal_19, player), + lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_mystic_melody, player)) + + add_rule(world.get_location(LocationName.cannon_core_animal_19, player), + lambda state: state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_large_cannon, player) and + state.has(ItemName.knuckles_hammer_gloves, player) and + state.has(ItemName.sonic_flame_ring, player)) + + add_rule(world.get_location(LocationName.radical_highway_animal_20, player), + lambda state: state.has(ItemName.shadow_flame_ring, player)) + def set_boss_gate_rules(world: MultiWorld, player: int, gate_bosses: typing.Dict[int, int]): for x in range(len(gate_bosses)): @@ -1367,7 +2197,7 @@ def set_boss_gate_rules(world: MultiWorld, player: int, gate_bosses: typing.Dict lambda state: state.has(ItemName.knuckles_shovel_claws, player)) -def set_rules(world: MultiWorld, player: int, gate_bosses: typing.Dict[int, int], mission_map: typing.Dict[int, int], mission_count_map: typing.Dict[int, int]): +def set_rules(world: MultiWorld, player: int, gate_bosses: typing.Dict[int, int], boss_rush_map: typing.Dict[int, int], mission_map: typing.Dict[int, int], mission_count_map: typing.Dict[int, int]): # Mission Progression Rules (Mission 1 begets Mission 2, etc.) set_mission_progress_rules(world, player, mission_map, mission_count_map) @@ -1378,6 +2208,12 @@ def set_rules(world: MultiWorld, player: int, gate_bosses: typing.Dict[int, int] elif world.logic_difficulty[player].value == 1: set_mission_upgrade_rules_hard(world, player) + if world.goal[player] in [4, 5, 6]: + for i in range(16): + if boss_rush_map[i] == 10: + add_rule(world.get_location("Boss Rush - " + str(i + 1), player), + lambda state: (state.has(ItemName.knuckles_shovel_claws, player))) + # Upgrade Requirements for each boss gate set_boss_gate_rules(world, player, gate_bosses) diff --git a/worlds/sa2b/__init__.py b/worlds/sa2b/__init__.py index d81ec58328fa..69ad8b8180ff 100644 --- a/worlds/sa2b/__init__.py +++ b/worlds/sa2b/__init__.py @@ -10,7 +10,7 @@ from .Rules import set_rules from .Names import ItemName, LocationName from worlds.AutoWorld import WebWorld, World -from .GateBosses import get_gate_bosses, get_boss_name +from .GateBosses import get_gate_bosses, get_boss_rush_bosses, get_boss_name from .Missions import get_mission_table, get_mission_count_table, get_first_and_last_cannons_core_missions import Patch @@ -52,7 +52,7 @@ class SA2BWorld(World): game: str = "Sonic Adventure 2 Battle" option_definitions = sa2b_options topology_present = False - data_version = 5 + data_version = 6 item_name_groups = item_groups item_name_to_id = {name: data.code for name, data in item_table.items()} @@ -61,30 +61,35 @@ class SA2BWorld(World): location_table: typing.Dict[str, int] music_map: typing.Dict[int, int] + voice_map: typing.Dict[int, int] mission_map: typing.Dict[int, int] mission_count_map: typing.Dict[int, int] emblems_for_cannons_core: int region_emblem_map: typing.Dict[int, int] gate_costs: typing.Dict[int, int] gate_bosses: typing.Dict[int, int] + boss_rush_map: typing.Dict[int, int] web = SA2BWeb() def _get_slot_data(self): return { - "ModVersion": 201, + "ModVersion": 202, "Goal": self.multiworld.goal[self.player].value, "MusicMap": self.music_map, + "VoiceMap": self.voice_map, "MissionMap": self.mission_map, "MissionCountMap": self.mission_count_map, "MusicShuffle": self.multiworld.music_shuffle[self.player].value, "Narrator": self.multiworld.narrator[self.player].value, "MinigameTrapDifficulty": self.multiworld.minigame_trap_difficulty[self.player].value, "RingLoss": self.multiworld.ring_loss[self.player].value, + "RingLink": self.multiworld.ring_link[self.player].value, "RequiredRank": self.multiworld.required_rank[self.player].value, "ChaoKeys": self.multiworld.keysanity[self.player].value, "Whistlesanity": self.multiworld.whistlesanity[self.player].value, "GoldBeetles": self.multiworld.beetlesanity[self.player].value, "OmochaoChecks": self.multiworld.omosanity[self.player].value, + "AnimalChecks": self.multiworld.animalsanity[self.player].value, "KartRaceChecks": self.multiworld.kart_race_checks[self.player].value, "ChaoRaceChecks": self.multiworld.chao_race_checks[self.player].value, "ChaoGardenDifficulty": self.multiworld.chao_garden_difficulty[self.player].value, @@ -97,6 +102,7 @@ def _get_slot_data(self): "RegionEmblemMap": self.region_emblem_map, "GateCosts": self.gate_costs, "GateBosses": self.gate_bosses, + "BossRushMap": self.boss_rush_map, } def _create_items(self, name: str): @@ -160,19 +166,26 @@ def generate_early(self): self.multiworld.confusion_trap_weight[self.player].value = 0 self.multiworld.tiny_trap_weight[self.player].value = 0 self.multiworld.gravity_trap_weight[self.player].value = 0 + self.multiworld.ice_trap_weight[self.player].value = 0 + self.multiworld.slow_trap_weight[self.player].value = 0 - valid_trap_weights = self.multiworld.exposition_trap_weight[self.player].value + self.multiworld.pong_trap_weight[self.player].value + valid_trap_weights = self.multiworld.exposition_trap_weight[self.player].value + \ + self.multiworld.cutscene_trap_weight[self.player].value + \ + self.multiworld.pong_trap_weight[self.player].value if valid_trap_weights == 0: self.multiworld.exposition_trap_weight[self.player].value = 4 + self.multiworld.cutscene_trap_weight[self.player].value = 4 self.multiworld.pong_trap_weight[self.player].value = 4 if self.multiworld.kart_race_checks[self.player].value == 0: self.multiworld.kart_race_checks[self.player].value = 2 self.gate_bosses = {} + self.boss_rush_map = {} else: - self.gate_bosses = get_gate_bosses(self.multiworld, self.player) + self.gate_bosses = get_gate_bosses(self.multiworld, self.player) + self.boss_rush_map = get_boss_rush_bosses(self.multiworld, self.player) def create_regions(self): self.mission_map = get_mission_table(self.multiworld, self.player) @@ -182,7 +195,7 @@ def create_regions(self): create_regions(self.multiworld, self.player, self.location_table) # Not Generate Basic - if self.multiworld.goal[self.player].value == 0 or self.multiworld.goal[self.player].value == 2: + if self.multiworld.goal[self.player].value in [0, 2, 4, 5, 6]: self.multiworld.get_location(LocationName.finalhazard, self.player).place_locked_item(self.create_item(ItemName.maria)) elif self.multiworld.goal[self.player].value == 1: self.multiworld.get_location(LocationName.green_hill, self.player).place_locked_item(self.create_item(ItemName.maria)) @@ -198,16 +211,16 @@ def create_regions(self): if self.multiworld.goal[self.player].value != 3: # Fill item pool with all required items for item in {**upgrades_table}: - itempool += self._create_items(item) + itempool += [self.create_item(item, False, self.multiworld.goal[self.player].value)] - if self.multiworld.goal[self.player].value == 1 or self.multiworld.goal[self.player].value == 2: + if self.multiworld.goal[self.player].value in [1, 2, 6]: # Some flavor of Chaos Emerald Hunt for item in {**emeralds_table}: itempool += self._create_items(item) - # Cap at 250 Emblems + # Cap at player-specified Emblem count raw_emblem_count = total_required_locations - len(itempool) - total_emblem_count = min(raw_emblem_count, 250) + total_emblem_count = min(raw_emblem_count, self.multiworld.max_emblem_cap[self.player].value) extra_junk_count = raw_emblem_count - total_emblem_count self.emblems_for_cannons_core = math.floor( @@ -253,7 +266,7 @@ def create_regions(self): first_cannons_core_mission, final_cannons_core_mission = get_first_and_last_cannons_core_missions(self.mission_map, self.mission_count_map) - connect_regions(self.multiworld, self.player, gates, self.emblems_for_cannons_core, self.gate_bosses, first_cannons_core_mission, final_cannons_core_mission) + connect_regions(self.multiworld, self.player, gates, self.emblems_for_cannons_core, self.gate_bosses, self.boss_rush_map, first_cannons_core_mission, final_cannons_core_mission) max_required_emblems = max(max(emblem_requirement_list), self.emblems_for_cannons_core) itempool += [self.create_item(ItemName.emblem) for _ in range(max_required_emblems)] @@ -271,6 +284,9 @@ def create_regions(self): trap_weights += ([ItemName.gravity_trap] * self.multiworld.gravity_trap_weight[self.player].value) trap_weights += ([ItemName.exposition_trap] * self.multiworld.exposition_trap_weight[self.player].value) #trap_weights += ([ItemName.darkness_trap] * self.multiworld.darkness_trap_weight[self.player].value) + trap_weights += ([ItemName.ice_trap] * self.multiworld.ice_trap_weight[self.player].value) + trap_weights += ([ItemName.slow_trap] * self.multiworld.slow_trap_weight[self.player].value) + trap_weights += ([ItemName.cutscene_trap] * self.multiworld.cutscene_trap_weight[self.player].value) trap_weights += ([ItemName.pong_trap] * self.multiworld.pong_trap_weight[self.player].value) junk_count += extra_junk_count @@ -347,12 +363,52 @@ def create_regions(self): self.music_map = dict(zip(musiclist_o, musiclist_s)) - def create_item(self, name: str, force_non_progression=False) -> Item: + # Voice Shuffle + if self.multiworld.voice_shuffle[self.player] == "shuffled": + voicelist_o = list(range(0, 2623)) + voicelist_s = voicelist_o.copy() + self.multiworld.random.shuffle(voicelist_s) + + self.voice_map = dict(zip(voicelist_o, voicelist_s)) + elif self.multiworld.voice_shuffle[self.player] == "rude": + voicelist_o = list(range(0, 2623)) + voicelist_s = voicelist_o.copy() + self.multiworld.random.shuffle(voicelist_s) + + for i in range(len(voicelist_s)): + if self.multiworld.random.randint(1,100) > 80: + voicelist_s[i] = 17 + + self.voice_map = dict(zip(voicelist_o, voicelist_s)) + elif self.multiworld.voice_shuffle[self.player] == "chao": + voicelist_o = list(range(0, 2623)) + voicelist_s = voicelist_o.copy() + self.multiworld.random.shuffle(voicelist_s) + + for i in range(len(voicelist_s)): + voicelist_s[i] = self.multiworld.random.choice(range(2586, 2608)) + + self.voice_map = dict(zip(voicelist_o, voicelist_s)) + elif self.multiworld.voice_shuffle[self.player] == "singularity": + voicelist_o = list(range(0, 2623)) + voicelist_s = [self.multiworld.random.choice(voicelist_o)] * len(voicelist_o) + + self.voice_map = dict(zip(voicelist_o, voicelist_s)) + else: + voicelist_o = list(range(0, 2623)) + voicelist_s = voicelist_o.copy() + + self.voice_map = dict(zip(voicelist_o, voicelist_s)) + + + def create_item(self, name: str, force_non_progression=False, goal=0) -> Item: data = item_table[name] if force_non_progression: classification = ItemClassification.filler - elif name == ItemName.emblem: + elif name == ItemName.emblem or \ + name in emeralds_table.keys() or \ + (name == ItemName.knuckles_shovel_claws and goal in [4, 5]): classification = ItemClassification.progression_skip_balancing elif data.progression: classification = ItemClassification.progression @@ -369,18 +425,28 @@ def get_filler_item_name(self) -> str: self.multiworld.random.choice(junk_table.keys()) def set_rules(self): - set_rules(self.multiworld, self.player, self.gate_bosses, self.mission_map, self.mission_count_map) + set_rules(self.multiworld, self.player, self.gate_bosses, self.boss_rush_map, self.mission_map, self.mission_count_map) def write_spoiler(self, spoiler_handle: typing.TextIO): - if self.multiworld.number_of_level_gates[self.player].value > 0: + if self.multiworld.number_of_level_gates[self.player].value > 0 or self.multiworld.goal[self.player].value in [4, 5, 6]: spoiler_handle.write("\n") header_text = "Sonic Adventure 2 Bosses for {}:\n" header_text = header_text.format(self.multiworld.player_name[self.player]) spoiler_handle.write(header_text) - for x in range(len(self.gate_bosses.values())): - text = "Gate {0} Boss: {1}\n" - text = text.format((x + 1), get_boss_name(self.gate_bosses[x + 1])) - spoiler_handle.writelines(text) + + if self.multiworld.number_of_level_gates[self.player].value > 0: + for x in range(len(self.gate_bosses.values())): + text = "Gate {0} Boss: {1}\n" + text = text.format((x + 1), get_boss_name(self.gate_bosses[x + 1])) + spoiler_handle.writelines(text) + spoiler_handle.write("\n") + + if self.multiworld.goal[self.player].value in [4, 5, 6]: + for x in range(len(self.boss_rush_map.values())): + text = "Boss Rush Boss {0}: {1}\n" + text = text.format((x + 1), get_boss_name(self.boss_rush_map[x])) + spoiler_handle.writelines(text) + spoiler_handle.write("\n") def extend_hint_information(self, hint_data: typing.Dict[int, typing.Dict[int, str]]): gate_names = [