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 <tyler.summers@gmail.com>
This commit is contained in:
PoryGone 2023-06-27 17:38:58 -04:00 committed by GitHub
parent d51e0ec0ab
commit 1ced726d31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 3067 additions and 585 deletions

View File

@ -29,6 +29,14 @@ gate_bosses_with_requirements_table = {
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()

View File

@ -79,6 +79,9 @@ trap_table = {
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),
}

View File

@ -733,6 +733,487 @@ omochao_location_table = {
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 @@ boss_gate_location_table = {
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 @@ green_hill_chao_location_table = {
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 @@ all_locations = {
**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 @@ all_locations = {
**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:

View File

@ -190,7 +190,7 @@ stage_name_prefixes: typing.List[str] = [
"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)

View File

@ -51,6 +51,10 @@ tiny_trap = "Tiny Trap"
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"

View File

@ -31,6 +31,26 @@ 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"
@ -47,6 +67,20 @@ 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"
@ -63,6 +97,24 @@ 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"
@ -81,6 +133,25 @@ 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"
@ -109,6 +180,22 @@ 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"
@ -124,6 +211,22 @@ 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
@ -152,6 +255,21 @@ 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"
@ -177,6 +295,22 @@ 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"
@ -200,6 +334,21 @@ 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"
@ -227,6 +376,21 @@ 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
@ -252,6 +416,16 @@ 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"
@ -274,6 +448,17 @@ 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"
@ -294,6 +479,16 @@ 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"
@ -318,6 +513,16 @@ 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"
@ -334,6 +539,17 @@ 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"
@ -361,6 +577,26 @@ 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"
@ -383,6 +619,22 @@ 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"
@ -399,6 +651,26 @@ 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"
@ -413,6 +685,26 @@ 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
@ -436,6 +728,21 @@ 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"
@ -453,6 +760,21 @@ 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"
@ -474,6 +796,20 @@ 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"
@ -491,6 +827,21 @@ 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"
@ -507,6 +858,21 @@ 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
@ -533,6 +899,16 @@ dry_lagoon_omo_10 = "Dry Lagoon - Omochao 10"
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_5 = "Egg Quarters - Omochao 5"
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_10 = "Security Hall - Omochao 10"
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_3 = "Mad Space - Omochao 3"
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_3_boss = "Gate 3 Boss"
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,8 +1180,6 @@ kart_race_standard = "Kart Race - Standard"
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"
@ -756,6 +1199,23 @@ gate_3_boss_region = "Gate 3 Boss"
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 @@ security_hall_region = "Security Hall"
route_280_region = "Route 280"
mad_space_region = "Mad Space"
cannon_core_region = "Cannon Core"
cannon_core_region = "Cannon's Core"
biolizard_region = "Biolizard"

View File

@ -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 @@ class RingLoss(Choice):
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 @@ class SADXMusic(Choice):
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 @@ sa2b_options: typing.Dict[str, type(Option)] = {
"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 @@ sa2b_options: typing.Dict[str, type(Option)] = {
"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,

View File

@ -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]])

View File

@ -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)

View File

@ -10,7 +10,7 @@ from .Regions import create_regions, shuffleable_regions, connect_regions, Level
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 @@ class SA2BWorld(World):
"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 @@ class SA2BWorld(World):
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.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 @@ class SA2BWorld(World):
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 @@ class SA2BWorld(World):
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 @@ class SA2BWorld(World):
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 @@ class SA2BWorld(World):
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 @@ class SA2BWorld(World):
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 @@ class SA2BWorld(World):
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)
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 = [