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, 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 = { all_gate_bosses_table = {
**gate_bosses_no_requirements_table, **gate_bosses_no_requirements_table,
**gate_bosses_with_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(): for key, value in gate_bosses_with_requirements_table.items():
if value == boss: if value == boss:
return key return key
for key, value in extra_boss_rush_bosses_table.items():
if value == boss:
return key
def boss_has_requirement(boss: int): 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)) bosses: typing.Dict[int, int] = dict(zip(boss_gates, selected_bosses))
return 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.gravity_trap: ItemData(0xFF0034, False, True),
ItemName.exposition_trap: ItemData(0xFF0035, False, True), ItemName.exposition_trap: ItemData(0xFF0035, False, True),
#ItemName.darkness_trap: ItemData(0xFF0036, 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), ItemName.pong_trap: ItemData(0xFF0050, False, True),
} }

View File

@ -733,6 +733,487 @@ omochao_location_table = {
LocationName.city_escape_omo_14: 0xFF09A0, 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 = { boss_gate_location_table = {
LocationName.gate_1_boss: 0xFF0100, LocationName.gate_1_boss: 0xFF0100,
LocationName.gate_2_boss: 0xFF0101, LocationName.gate_2_boss: 0xFF0101,
@ -741,6 +1222,25 @@ boss_gate_location_table = {
LocationName.gate_5_boss: 0xFF0104, 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 = { chao_garden_beginner_location_table = {
LocationName.chao_race_crab_pool_1: 0xFF0200, LocationName.chao_race_crab_pool_1: 0xFF0200,
LocationName.chao_race_crab_pool_2: 0xFF0201, LocationName.chao_race_crab_pool_2: 0xFF0201,
@ -862,6 +1362,10 @@ green_hill_chao_location_table = {
LocationName.green_hill_chao_1: 0xFF041F, 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 = { final_boss_location_table = {
# LocationName.biolizard: 0xFF003F, # LocationName.biolizard: 0xFF003F,
LocationName.finalhazard: 0xFF005F, LocationName.finalhazard: 0xFF005F,
@ -875,11 +1379,13 @@ all_locations = {
**mission_location_table, **mission_location_table,
**upgrade_location_table, **upgrade_location_table,
**boss_gate_location_table, **boss_gate_location_table,
**boss_rush_location_table,
**chao_key_location_table, **chao_key_location_table,
**pipe_location_table, **pipe_location_table,
**hidden_whistle_location_table, **hidden_whistle_location_table,
**beetle_location_table, **beetle_location_table,
**omochao_location_table, **omochao_location_table,
**animal_location_table,
**chao_garden_beginner_location_table, **chao_garden_beginner_location_table,
**chao_garden_intermediate_location_table, **chao_garden_intermediate_location_table,
**chao_garden_expert_location_table, **chao_garden_expert_location_table,
@ -889,6 +1395,7 @@ all_locations = {
**kart_race_mini_location_table, **kart_race_mini_location_table,
**green_hill_location_table, **green_hill_location_table,
**green_hill_chao_location_table, **green_hill_chao_location_table,
**green_hill_animal_location_table,
**final_boss_location_table, **final_boss_location_table,
**grand_prix_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]: if world.omosanity[player]:
location_table.update({**omochao_location_table}) location_table.update({**omochao_location_table})
if world.animalsanity[player]:
location_table.update({**animal_location_table})
if world.kart_race_checks[player] == 2: if world.kart_race_checks[player] == 2:
location_table.update({**kart_race_beginner_location_table}) location_table.update({**kart_race_beginner_location_table})
location_table.update({**kart_race_standard_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: elif world.kart_race_checks[player] == 1:
location_table.update({**kart_race_mini_location_table}) 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}) 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}) location_table.update({**green_hill_location_table})
if world.keysanity[player]: if world.keysanity[player]:
location_table.update({**green_hill_chao_location_table}) 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: if world.chao_garden_difficulty[player].value >= 1:
chao_location_table.update({**chao_garden_beginner_location_table}) chao_location_table.update({**chao_garden_beginner_location_table})
if world.chao_garden_difficulty[player].value >= 2: if world.chao_garden_difficulty[player].value >= 2:

View File

@ -190,7 +190,7 @@ stage_name_prefixes: typing.List[str] = [
"Mad Space - ", "Mad Space - ",
"Cosmic Wall - ", "Cosmic Wall - ",
"Final Chase - ", "Final Chase - ",
"Cannon Core - ", "Cannon's Core - ",
] ]
def get_mission_count_table(multiworld: MultiWorld, player: int): 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 # The first mission must be M1, M2, M3, or M4
first_mission = 1 first_mission = 1
first_mission_options = [1, 2, 3]
if not multiworld.animalsanity[player]:
first_mission_options.append(4)
if multiworld.mission_shuffle[player]: 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) level_active_missions.remove(first_mission)

View File

@ -51,6 +51,10 @@ tiny_trap = "Tiny Trap"
gravity_trap = "Gravity Trap" gravity_trap = "Gravity Trap"
exposition_trap = "Exposition Trap" exposition_trap = "Exposition Trap"
darkness_trap = "Darkness Trap" darkness_trap = "Darkness Trap"
ice_trap = "Ice Trap"
slow_trap = "Slow Trap"
cutscene_trap = "Cutscene Trap"
pong_trap = "Pong Trap" pong_trap = "Pong Trap"
white_emerald = "White Chaos Emerald" 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_13 = "City Escape - Omochao 13"
city_escape_omo_14 = "City Escape - Omochao 14" city_escape_omo_14 = "City Escape - Omochao 14"
city_escape_beetle = "City Escape - Gold Beetle" 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" city_escape_upgrade = "City Escape - Upgrade"
metal_harbor_1 = "Metal Harbor - 1" metal_harbor_1 = "Metal Harbor - 1"
metal_harbor_2 = "Metal Harbor - 2" 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_4 = "Metal Harbor - Omochao 4"
metal_harbor_omo_5 = "Metal Harbor - Omochao 5" metal_harbor_omo_5 = "Metal Harbor - Omochao 5"
metal_harbor_beetle = "Metal Harbor - Gold Beetle" 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" metal_harbor_upgrade = "Metal Harbor - Upgrade"
green_forest_1 = "Green Forest - 1" green_forest_1 = "Green Forest - 1"
green_forest_2 = "Green Forest - 2" 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_3 = "Green Forest - Hidden 3"
green_forest_hidden_4 = "Green Forest - Hidden 4" green_forest_hidden_4 = "Green Forest - Hidden 4"
green_forest_beetle = "Green Forest - Gold Beetle" 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" green_forest_upgrade = "Green Forest - Upgrade"
pyramid_cave_1 = "Pyramid Cave - 1" pyramid_cave_1 = "Pyramid Cave - 1"
pyramid_cave_2 = "Pyramid Cave - 2" 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_3 = "Pyramid Cave - Omochao 3"
pyramid_cave_omo_4 = "Pyramid Cave - Omochao 4" pyramid_cave_omo_4 = "Pyramid Cave - Omochao 4"
pyramid_cave_beetle = "Pyramid Cave - Gold Beetle" 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" pyramid_cave_upgrade = "Pyramid Cave - Upgrade"
crazy_gadget_1 = "Crazy Gadget - 1" crazy_gadget_1 = "Crazy Gadget - 1"
crazy_gadget_2 = "Crazy Gadget - 2" 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_12 = "Crazy Gadget - Omochao 12"
crazy_gadget_omo_13 = "Crazy Gadget - Omochao 13" crazy_gadget_omo_13 = "Crazy Gadget - Omochao 13"
crazy_gadget_beetle = "Crazy Gadget - Gold Beetle" 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" crazy_gadget_upgrade = "Crazy Gadget - Upgrade"
final_rush_1 = "Final Rush - 1" final_rush_1 = "Final Rush - 1"
final_rush_2 = "Final Rush - 2" 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_2 = "Final Rush - Omochao 2"
final_rush_omo_3 = "Final Rush - Omochao 3" final_rush_omo_3 = "Final Rush - Omochao 3"
final_rush_beetle = "Final Rush - Gold Beetle" 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" final_rush_upgrade = "Final Rush - Upgrade"
# Tails Mission Definitions # 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_9 = "Prison Lane - Omochao 9"
prison_lane_omo_10 = "Prison Lane - Omochao 10" prison_lane_omo_10 = "Prison Lane - Omochao 10"
prison_lane_beetle = "Prison Lane - Gold Beetle" 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" prison_lane_upgrade = "Prison Lane - Upgrade"
mission_street_1 = "Mission Street - 1" mission_street_1 = "Mission Street - 1"
mission_street_2 = "Mission Street - 2" 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_7 = "Mission Street - Omochao 7"
mission_street_omo_8 = "Mission Street - Omochao 8" mission_street_omo_8 = "Mission Street - Omochao 8"
mission_street_beetle = "Mission Street - Gold Beetle" 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" mission_street_upgrade = "Mission Street - Upgrade"
route_101_1 = "Route 101 - 1" route_101_1 = "Route 101 - 1"
route_101_2 = "Route 101 - 2" 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_3 = "Hidden Base - Omochao 3"
hidden_base_omo_4 = "Hidden Base - Omochao 4" hidden_base_omo_4 = "Hidden Base - Omochao 4"
hidden_base_beetle = "Hidden Base - Gold Beetle" 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" hidden_base_upgrade = "Hidden Base - Upgrade"
eternal_engine_1 = "Eternal Engine - 1" eternal_engine_1 = "Eternal Engine - 1"
eternal_engine_2 = "Eternal Engine - 2" 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_11 = "Eternal Engine - Omochao 11"
eternal_engine_omo_12 = "Eternal Engine - Omochao 12" eternal_engine_omo_12 = "Eternal Engine - Omochao 12"
eternal_engine_beetle = "Eternal Engine - Gold Beetle" 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" eternal_engine_upgrade = "Eternal Engine - Upgrade"
# Knuckles Mission Definitions # 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_9 = "Wild Canyon - Omochao 9"
wild_canyon_omo_10 = "Wild Canyon - Omochao 10" wild_canyon_omo_10 = "Wild Canyon - Omochao 10"
wild_canyon_beetle = "Wild Canyon - Gold Beetle" 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" wild_canyon_upgrade = "Wild Canyon - Upgrade"
pumpkin_hill_1 = "Pumpkin Hill - 1" pumpkin_hill_1 = "Pumpkin Hill - 1"
pumpkin_hill_2 = "Pumpkin Hill - 2" 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_9 = "Pumpkin Hill - Omochao 9"
pumpkin_hill_omo_10 = "Pumpkin Hill - Omochao 10" pumpkin_hill_omo_10 = "Pumpkin Hill - Omochao 10"
pumpkin_hill_omo_11 = "Pumpkin Hill - Omochao 11" 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" pumpkin_hill_upgrade = "Pumpkin Hill - Upgrade"
aquatic_mine_1 = "Aquatic Mine - 1" aquatic_mine_1 = "Aquatic Mine - 1"
aquatic_mine_2 = "Aquatic Mine - 2" 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_6 = "Aquatic Mine - Omochao 6"
aquatic_mine_omo_7 = "Aquatic Mine - Omochao 7" aquatic_mine_omo_7 = "Aquatic Mine - Omochao 7"
aquatic_mine_beetle = "Aquatic Mine - Gold Beetle" 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" aquatic_mine_upgrade = "Aquatic Mine - Upgrade"
death_chamber_1 = "Death Chamber - 1" death_chamber_1 = "Death Chamber - 1"
death_chamber_2 = "Death Chamber - 2" 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_8 = "Death Chamber - Omochao 8"
death_chamber_omo_9 = "Death Chamber - Omochao 9" death_chamber_omo_9 = "Death Chamber - Omochao 9"
death_chamber_beetle = "Death Chamber - Gold Beetle" 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" death_chamber_upgrade = "Death Chamber - Upgrade"
meteor_herd_1 = "Meteor Herd - 1" meteor_herd_1 = "Meteor Herd - 1"
meteor_herd_2 = "Meteor Herd - 2" 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_2 = "Meteor Herd - Omochao 2"
meteor_herd_omo_3 = "Meteor Herd - Omochao 3" meteor_herd_omo_3 = "Meteor Herd - Omochao 3"
meteor_herd_beetle = "Meteor Herd - Gold Beetle" 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" 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_7 = "Radical Highway - Omochao 7"
radical_highway_omo_8 = "Radical Highway - Omochao 8" radical_highway_omo_8 = "Radical Highway - Omochao 8"
radical_highway_beetle = "Radical Highway - Gold Beetle" 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" radical_highway_upgrade = "Radical Highway - Upgrade"
white_jungle_1 = "White Jungle - 1" white_jungle_1 = "White Jungle - 1"
white_jungle_2 = "White Jungle - 2" 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_4 = "White Jungle - Omochao 4"
white_jungle_omo_5 = "White Jungle - Omochao 5" white_jungle_omo_5 = "White Jungle - Omochao 5"
white_jungle_beetle = "White Jungle - Gold Beetle" 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" white_jungle_upgrade = "White Jungle - Upgrade"
sky_rail_1 = "Sky Rail - 1" sky_rail_1 = "Sky Rail - 1"
sky_rail_2 = "Sky Rail - 2" 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_5 = "Sky Rail - Pipe 5"
sky_rail_pipe_6 = "Sky Rail - Pipe 6" sky_rail_pipe_6 = "Sky Rail - Pipe 6"
sky_rail_beetle = "Sky Rail - Gold Beetle" 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" sky_rail_upgrade = "Sky Rail - Upgrade"
final_chase_1 = "Final Chase - 1" final_chase_1 = "Final Chase - 1"
final_chase_2 = "Final Chase - 2" 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_pipe_3 = "Final Chase - Pipe 3"
final_chase_omo_1 = "Final Chase - Omochao 1" final_chase_omo_1 = "Final Chase - Omochao 1"
final_chase_beetle = "Final Chase - Gold Beetle" 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" final_chase_upgrade = "Final Chase - Upgrade"
# Eggman Mission Definitions # 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_5 = "Iron Gate - Omochao 5"
iron_gate_omo_6 = "Iron Gate - Omochao 6" iron_gate_omo_6 = "Iron Gate - Omochao 6"
iron_gate_beetle = "Iron Gate - Gold Beetle" 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" iron_gate_upgrade = "Iron Gate - Upgrade"
sand_ocean_1 = "Sand Ocean - 1" sand_ocean_1 = "Sand Ocean - 1"
sand_ocean_2 = "Sand Ocean - 2" 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_1 = "Sand Ocean - Omochao 1"
sand_ocean_omo_2 = "Sand Ocean - Omochao 2" sand_ocean_omo_2 = "Sand Ocean - Omochao 2"
sand_ocean_beetle = "Sand Ocean - Gold Beetle" 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" sand_ocean_upgrade = "Sand Ocean - Upgrade"
lost_colony_1 = "Lost Colony - 1" lost_colony_1 = "Lost Colony - 1"
lost_colony_2 = "Lost Colony - 2" 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_7 = "Lost Colony - Omochao 7"
lost_colony_omo_8 = "Lost Colony - Omochao 8" lost_colony_omo_8 = "Lost Colony - Omochao 8"
lost_colony_beetle = "Lost Colony - Gold Beetle" 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" lost_colony_upgrade = "Lost Colony - Upgrade"
weapons_bed_1 = "Weapons Bed - 1" weapons_bed_1 = "Weapons Bed - 1"
weapons_bed_2 = "Weapons Bed - 2" 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_1 = "Weapons Bed - Omochao 1"
weapons_bed_omo_2 = "Weapons Bed - Omochao 2" weapons_bed_omo_2 = "Weapons Bed - Omochao 2"
weapons_bed_omo_3 = "Weapons Bed - Omochao 3" 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" weapons_bed_upgrade = "Weapons Bed - Upgrade"
cosmic_wall_1 = "Cosmic Wall - 1" cosmic_wall_1 = "Cosmic Wall - 1"
cosmic_wall_2 = "Cosmic Wall - 2" 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_pipe_5 = "Cosmic Wall - Pipe 5"
cosmic_wall_omo_1 = "Cosmic Wall - Omochao 1" cosmic_wall_omo_1 = "Cosmic Wall - Omochao 1"
cosmic_wall_beetle = "Cosmic Wall - Gold Beetle" 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" cosmic_wall_upgrade = "Cosmic Wall - Upgrade"
# Rouge Mission Definitions # 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_11 = "Dry Lagoon - Omochao 11"
dry_lagoon_omo_12 = "Dry Lagoon - Omochao 12" dry_lagoon_omo_12 = "Dry Lagoon - Omochao 12"
dry_lagoon_beetle = "Dry Lagoon - Gold Beetle" 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" dry_lagoon_upgrade = "Dry Lagoon - Upgrade"
egg_quarters_1 = "Egg Quarters - 1" egg_quarters_1 = "Egg Quarters - 1"
egg_quarters_2 = "Egg Quarters - 2" 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_6 = "Egg Quarters - Omochao 6"
egg_quarters_omo_7 = "Egg Quarters - Omochao 7" egg_quarters_omo_7 = "Egg Quarters - Omochao 7"
egg_quarters_beetle = "Egg Quarters - Gold Beetle" 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" egg_quarters_upgrade = "Egg Quarters - Upgrade"
security_hall_1 = "Security Hall - 1" security_hall_1 = "Security Hall - 1"
security_hall_2 = "Security Hall - 2" 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_11 = "Security Hall - Omochao 11"
security_hall_omo_12 = "Security Hall - Omochao 12" security_hall_omo_12 = "Security Hall - Omochao 12"
security_hall_beetle = "Security Hall - Gold Beetle" 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" security_hall_upgrade = "Security Hall - Upgrade"
route_280_1 = "Route 280 - 1" route_280_1 = "Route 280 - 1"
route_280_2 = "Route 280 - 2" 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_4 = "Mad Space - Omochao 4"
mad_space_omo_5 = "Mad Space - Omochao 5" mad_space_omo_5 = "Mad Space - Omochao 5"
mad_space_beetle = "Mad Space - Gold Beetle" 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" mad_space_upgrade = "Mad Space - Upgrade"
# Final Mission Definitions # Final Mission Definitions
cannon_core_1 = "Cannon Core - 1" cannon_core_1 = "Cannon's Core - 1"
cannon_core_2 = "Cannon Core - 2" cannon_core_2 = "Cannon's Core - 2"
cannon_core_3 = "Cannon Core - 3" cannon_core_3 = "Cannon's Core - 3"
cannon_core_4 = "Cannon Core - 4" cannon_core_4 = "Cannon's Core - 4"
cannon_core_5 = "Cannon Core - 5" cannon_core_5 = "Cannon's Core - 5"
cannon_core_chao_1 = "Cannon Core - Chao Key 1" cannon_core_chao_1 = "Cannon's Core - Chao Key 1"
cannon_core_chao_2 = "Cannon Core - Chao Key 2" cannon_core_chao_2 = "Cannon's Core - Chao Key 2"
cannon_core_chao_3 = "Cannon Core - Chao Key 3" cannon_core_chao_3 = "Cannon's Core - Chao Key 3"
cannon_core_pipe_1 = "Cannon Core - Pipe 1" cannon_core_pipe_1 = "Cannon's Core - Pipe 1"
cannon_core_pipe_2 = "Cannon Core - Pipe 2" cannon_core_pipe_2 = "Cannon's Core - Pipe 2"
cannon_core_pipe_3 = "Cannon Core - Pipe 3" cannon_core_pipe_3 = "Cannon's Core - Pipe 3"
cannon_core_pipe_4 = "Cannon Core - Pipe 4" cannon_core_pipe_4 = "Cannon's Core - Pipe 4"
cannon_core_pipe_5 = "Cannon Core - Pipe 5" cannon_core_pipe_5 = "Cannon's Core - Pipe 5"
cannon_core_omo_1 = "Cannon Core - Omochao 1" cannon_core_omo_1 = "Cannon's Core - Omochao 1"
cannon_core_omo_2 = "Cannon Core - Omochao 2" cannon_core_omo_2 = "Cannon's Core - Omochao 2"
cannon_core_omo_3 = "Cannon Core - Omochao 3" cannon_core_omo_3 = "Cannon's Core - Omochao 3"
cannon_core_omo_4 = "Cannon Core - Omochao 4" cannon_core_omo_4 = "Cannon's Core - Omochao 4"
cannon_core_omo_5 = "Cannon Core - Omochao 5" cannon_core_omo_5 = "Cannon's Core - Omochao 5"
cannon_core_omo_6 = "Cannon Core - Omochao 6" cannon_core_omo_6 = "Cannon's Core - Omochao 6"
cannon_core_omo_7 = "Cannon Core - Omochao 7" cannon_core_omo_7 = "Cannon's Core - Omochao 7"
cannon_core_omo_8 = "Cannon Core - Omochao 8" cannon_core_omo_8 = "Cannon's Core - Omochao 8"
cannon_core_omo_9 = "Cannon Core - Omochao 9" cannon_core_omo_9 = "Cannon's Core - Omochao 9"
cannon_core_hidden_1 = "Cannon Core - Hidden 1" cannon_core_hidden_1 = "Cannon's Core - Hidden 1"
cannon_core_beetle = "Cannon Core - Gold Beetle" 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 # Boss Definitions
gate_1_boss = "Gate 1 Boss" gate_1_boss = "Gate 1 Boss"
@ -637,6 +1065,23 @@ gate_3_boss = "Gate 3 Boss"
gate_4_boss = "Gate 4 Boss" gate_4_boss = "Gate 4 Boss"
gate_5_boss = "Gate 5 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 Garden Definitions
chao_race_crab_pool_1 = "Chao Race - Beginner - Crab Pool 1" chao_race_crab_pool_1 = "Chao Race - Beginner - Crab Pool 1"
chao_race_crab_pool_2 = "Chao Race - Beginner - Crab Pool 2" 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" kart_race_expert = "Kart Race - Expert"
# Other Definitions # Other Definitions
green_hill = "Green Hill"
green_hill_chao_1 = "Green Hill - Chao Key 1"
biolizard = "Biolizard" biolizard = "Biolizard"
finalhazard = "Finalhazard" finalhazard = "Finalhazard"
@ -756,6 +1199,23 @@ gate_3_boss_region = "Gate 3 Boss"
gate_4_boss_region = "Gate 4 Boss" gate_4_boss_region = "Gate 4 Boss"
gate_5_boss_region = "Gate 5 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" city_escape_region = "City Escape"
metal_harbor_region = "Metal Harbor" metal_harbor_region = "Metal Harbor"
green_forest_region = "Green Forest" green_forest_region = "Green Forest"
@ -792,7 +1252,7 @@ security_hall_region = "Security Hall"
route_280_region = "Route 280" route_280_region = "Route 280"
mad_space_region = "Mad Space" mad_space_region = "Mad Space"
cannon_core_region = "Cannon Core" cannon_core_region = "Cannon's Core"
biolizard_region = "Biolizard" 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 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 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) 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" display_name = "Goal"
option_biolizard = 0 option_biolizard = 0
option_chaos_emerald_hunt = 1 option_chaos_emerald_hunt = 1
option_finalhazard_chaos_emerald_hunt = 2 option_finalhazard_chaos_emerald_hunt = 2
option_grand_prix = 3 option_grand_prix = 3
option_boss_rush = 4
option_cannons_core_boss_rush = 5
option_boss_rush_chaos_emerald_hunt = 6
default = 0 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): class MissionShuffle(Toggle):
""" """
@ -26,6 +41,22 @@ class MissionShuffle(Toggle):
display_name = "Mission Shuffle" 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): class BaseTrapWeight(Choice):
""" """
Base Class for Trap Weights Base Class for Trap Weights
@ -86,6 +117,27 @@ class DarknessTrapWeight(BaseTrapWeight):
display_name = "Darkness Trap Weight" 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): class PongTrapWeight(BaseTrapWeight):
""" """
Likelihood of receiving a trap which forces you to play a Pong minigame Likelihood of receiving a trap which forces you to play a Pong minigame
@ -124,25 +176,10 @@ class TrapFillPercentage(Range):
default = 0 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): class Keysanity(Toggle):
""" """
Determines whether picking up Chao Keys grants checks Determines whether picking up Chao Keys grants checks
(86 Locations)
""" """
display_name = "Keysanity" display_name = "Keysanity"
@ -151,9 +188,9 @@ class Whistlesanity(Choice):
""" """
Determines whether whistling at various spots grants checks Determines whether whistling at various spots grants checks
None: No Whistle Spots grant checks None: No Whistle Spots grant checks
Pipes: Whistling at Pipes grants checks Pipes: Whistling at Pipes grants checks (97 Locations)
Hidden: Whistling at Hidden Whistle Spots grants checks Hidden: Whistling at Hidden Whistle Spots grants checks (32 Locations)
Both: Whistling at both Pipes and Hidden Whistle Spots grants checks Both: Whistling at both Pipes and Hidden Whistle Spots grants checks (129 Locations)
""" """
display_name = "Whistlesanity" display_name = "Whistlesanity"
option_none = 0 option_none = 0
@ -166,6 +203,7 @@ class Whistlesanity(Choice):
class Beetlesanity(Toggle): class Beetlesanity(Toggle):
""" """
Determines whether destroying Gold Beetles grants checks Determines whether destroying Gold Beetles grants checks
(27 Locations)
""" """
display_name = "Beetlesanity" display_name = "Beetlesanity"
@ -173,10 +211,19 @@ class Beetlesanity(Toggle):
class Omosanity(Toggle): class Omosanity(Toggle):
""" """
Determines whether activating Omochao grants checks Determines whether activating Omochao grants checks
(192 Locations)
""" """
display_name = "Omosanity" display_name = "Omosanity"
class Animalsanity(Toggle):
"""
Determines whether picking up counted small animals grants checks
(420 Locations)
"""
display_name = "Animalsanity"
class KartRaceChecks(Choice): class KartRaceChecks(Choice):
""" """
Determines whether Kart Race Mode grants checks Determines whether Kart Race Mode grants checks
@ -236,6 +283,18 @@ class LevelGateCosts(Choice):
default = 2 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): class RequiredRank(Choice):
""" """
Determines what minimum Rank is required to send a check for a mission 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 Determines the number of chao garden difficulty levels included. Easier difficulty settings means fewer chao garden checks
None: No Chao Garden Activities have checks None: No Chao Garden Activities have checks
Beginner: Beginner Races Beginner: Beginner Races
Intermediate: Beginner and Jewel Races Intermediate: Beginner, Challenge, Hero, and Dark Races
Expert: Beginner, Jewel, Challenge, Hero, and Dark Races Expert: Beginner, Challenge, Hero, Dark and Jewel Races
""" """
display_name = "Chao Garden Difficulty" display_name = "Chao Garden Difficulty"
option_none = 0 option_none = 0
@ -287,7 +346,7 @@ class ChaoRaceChecks(Choice):
class RequiredCannonsCoreMissions(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 First: Only the first mission must be completed
All Active: All active Cannon's Core missions 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] 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): class SADXMusic(Choice):
""" """
Whether the randomizer will include Sonic Adventure DX Music in the music pool Whether the randomizer will include Sonic Adventure DX Music in the music pool
@ -527,7 +593,7 @@ class SADXMusic(Choice):
class MusicShuffle(Choice): class MusicShuffle(Choice):
""" """
What type of Music Shuffle is used What type of Music Shuffle is used
Off: No music is shuffled. None: No music is shuffled.
Levels: Level music is shuffled. Levels: Level music is shuffled.
Full: Level, Menu, and Additional 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. Singularity: Level, Menu, and Additional music is all replaced with a single random song.
@ -540,6 +606,24 @@ class MusicShuffle(Choice):
default = 0 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): class Narrator(Choice):
""" """
Which menu narrator is used Which menu narrator is used
@ -574,10 +658,12 @@ class LogicDifficulty(Choice):
sa2b_options: typing.Dict[str, type(Option)] = { sa2b_options: typing.Dict[str, type(Option)] = {
"goal": Goal, "goal": Goal,
"mission_shuffle": MissionShuffle, "mission_shuffle": MissionShuffle,
"boss_rush_shuffle": BossRushShuffle,
"keysanity": Keysanity, "keysanity": Keysanity,
"whistlesanity": Whistlesanity, "whistlesanity": Whistlesanity,
"beetlesanity": Beetlesanity, "beetlesanity": Beetlesanity,
"omosanity": Omosanity, "omosanity": Omosanity,
"animalsanity": Animalsanity,
"kart_race_checks": KartRaceChecks, "kart_race_checks": KartRaceChecks,
"required_rank": RequiredRank, "required_rank": RequiredRank,
"emblem_percentage_for_cannons_core": EmblemPercentageForCannonsCore, "emblem_percentage_for_cannons_core": EmblemPercentageForCannonsCore,
@ -585,6 +671,7 @@ sa2b_options: typing.Dict[str, type(Option)] = {
"number_of_level_gates": NumberOfLevelGates, "number_of_level_gates": NumberOfLevelGates,
"level_gate_distribution": LevelGateDistribution, "level_gate_distribution": LevelGateDistribution,
"level_gate_costs": LevelGateCosts, "level_gate_costs": LevelGateCosts,
"max_emblem_cap": MaximumEmblemCap,
"chao_garden_difficulty": ChaoGardenDifficulty, "chao_garden_difficulty": ChaoGardenDifficulty,
"include_chao_karate": IncludeChaoKarate, "include_chao_karate": IncludeChaoKarate,
"chao_race_checks": ChaoRaceChecks, "chao_race_checks": ChaoRaceChecks,
@ -597,11 +684,16 @@ sa2b_options: typing.Dict[str, type(Option)] = {
"gravity_trap_weight": GravityTrapWeight, "gravity_trap_weight": GravityTrapWeight,
"exposition_trap_weight": ExpositionTrapWeight, "exposition_trap_weight": ExpositionTrapWeight,
#"darkness_trap_weight": DarknessTrapWeight, #"darkness_trap_weight": DarknessTrapWeight,
"ice_trap_weight": IceTrapWeight,
"slow_trap_weight": SlowTrapWeight,
"cutscene_trap_weight": CutsceneTrapWeight,
"pong_trap_weight": PongTrapWeight, "pong_trap_weight": PongTrapWeight,
"minigame_trap_difficulty": MinigameTrapDifficulty, "minigame_trap_difficulty": MinigameTrapDifficulty,
"ring_loss": RingLoss, "ring_loss": RingLoss,
"ring_link": RingLink,
"sadx_music": SADXMusic, "sadx_music": SADXMusic,
"music_shuffle": MusicShuffle, "music_shuffle": MusicShuffle,
"voice_shuffle": VoiceShuffle,
"narrator": Narrator, "narrator": Narrator,
"logic_difficulty": LogicDifficulty, "logic_difficulty": LogicDifficulty,
"speed_mission_count": SpeedMissionCount, "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_13,
LocationName.city_escape_omo_14, LocationName.city_escape_omo_14,
LocationName.city_escape_beetle, 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, LocationName.city_escape_upgrade,
] ]
city_escape_region = create_region(world, player, active_locations, LocationName.city_escape_region, 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_4,
LocationName.metal_harbor_omo_5, LocationName.metal_harbor_omo_5,
LocationName.metal_harbor_beetle, 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, LocationName.metal_harbor_upgrade,
] ]
metal_harbor_region = create_region(world, player, active_locations, LocationName.metal_harbor_region, 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_3,
LocationName.green_forest_hidden_4, LocationName.green_forest_hidden_4,
LocationName.green_forest_beetle, 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, LocationName.green_forest_upgrade,
] ]
green_forest_region = create_region(world, player, active_locations, LocationName.green_forest_region, 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_3,
LocationName.pyramid_cave_omo_4, LocationName.pyramid_cave_omo_4,
LocationName.pyramid_cave_beetle, 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, LocationName.pyramid_cave_upgrade,
] ]
pyramid_cave_region = create_region(world, player, active_locations, LocationName.pyramid_cave_region, 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_12,
LocationName.crazy_gadget_omo_13, LocationName.crazy_gadget_omo_13,
LocationName.crazy_gadget_beetle, 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, LocationName.crazy_gadget_upgrade,
] ]
crazy_gadget_region = create_region(world, player, active_locations, LocationName.crazy_gadget_region, 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_2,
LocationName.final_rush_omo_3, LocationName.final_rush_omo_3,
LocationName.final_rush_beetle, 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, LocationName.final_rush_upgrade,
] ]
final_rush_region = create_region(world, player, active_locations, LocationName.final_rush_region, 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_9,
LocationName.prison_lane_omo_10, LocationName.prison_lane_omo_10,
LocationName.prison_lane_beetle, 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, LocationName.prison_lane_upgrade,
] ]
prison_lane_region = create_region(world, player, active_locations, LocationName.prison_lane_region, 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_7,
LocationName.mission_street_omo_8, LocationName.mission_street_omo_8,
LocationName.mission_street_beetle, 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, LocationName.mission_street_upgrade,
] ]
mission_street_region = create_region(world, player, active_locations, LocationName.mission_street_region, 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_3,
LocationName.hidden_base_omo_4, LocationName.hidden_base_omo_4,
LocationName.hidden_base_beetle, 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, LocationName.hidden_base_upgrade,
] ]
hidden_base_region = create_region(world, player, active_locations, LocationName.hidden_base_region, 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_11,
LocationName.eternal_engine_omo_12, LocationName.eternal_engine_omo_12,
LocationName.eternal_engine_beetle, 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, LocationName.eternal_engine_upgrade,
] ]
eternal_engine_region = create_region(world, player, active_locations, LocationName.eternal_engine_region, 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_9,
LocationName.wild_canyon_omo_10, LocationName.wild_canyon_omo_10,
LocationName.wild_canyon_beetle, 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, LocationName.wild_canyon_upgrade,
] ]
wild_canyon_region = create_region(world, player, active_locations, LocationName.wild_canyon_region, 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_9,
LocationName.pumpkin_hill_omo_10, LocationName.pumpkin_hill_omo_10,
LocationName.pumpkin_hill_omo_11, 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, LocationName.pumpkin_hill_upgrade,
] ]
pumpkin_hill_region = create_region(world, player, active_locations, LocationName.pumpkin_hill_region, 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_6,
LocationName.aquatic_mine_omo_7, LocationName.aquatic_mine_omo_7,
LocationName.aquatic_mine_beetle, 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, LocationName.aquatic_mine_upgrade,
] ]
aquatic_mine_region = create_region(world, player, active_locations, LocationName.aquatic_mine_region, 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_8,
LocationName.death_chamber_omo_9, LocationName.death_chamber_omo_9,
LocationName.death_chamber_beetle, 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, LocationName.death_chamber_upgrade,
] ]
death_chamber_region = create_region(world, player, active_locations, LocationName.death_chamber_region, 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_2,
LocationName.meteor_herd_omo_3, LocationName.meteor_herd_omo_3,
LocationName.meteor_herd_beetle, 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, LocationName.meteor_herd_upgrade,
] ]
meteor_herd_region = create_region(world, player, active_locations, LocationName.meteor_herd_region, 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_7,
LocationName.radical_highway_omo_8, LocationName.radical_highway_omo_8,
LocationName.radical_highway_beetle, 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, LocationName.radical_highway_upgrade,
] ]
radical_highway_region = create_region(world, player, active_locations, LocationName.radical_highway_region, 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_4,
LocationName.white_jungle_omo_5, LocationName.white_jungle_omo_5,
LocationName.white_jungle_beetle, 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, LocationName.white_jungle_upgrade,
] ]
white_jungle_region = create_region(world, player, active_locations, LocationName.white_jungle_region, 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_5,
LocationName.sky_rail_pipe_6, LocationName.sky_rail_pipe_6,
LocationName.sky_rail_beetle, 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, LocationName.sky_rail_upgrade,
] ]
sky_rail_region = create_region(world, player, active_locations, LocationName.sky_rail_region, 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_pipe_3,
LocationName.final_chase_omo_1, LocationName.final_chase_omo_1,
LocationName.final_chase_beetle, 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, LocationName.final_chase_upgrade,
] ]
final_chase_region = create_region(world, player, active_locations, LocationName.final_chase_region, 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_5,
LocationName.iron_gate_omo_6, LocationName.iron_gate_omo_6,
LocationName.iron_gate_beetle, 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, LocationName.iron_gate_upgrade,
] ]
iron_gate_region = create_region(world, player, active_locations, LocationName.iron_gate_region, 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_1,
LocationName.sand_ocean_omo_2, LocationName.sand_ocean_omo_2,
LocationName.sand_ocean_beetle, 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, LocationName.sand_ocean_upgrade,
] ]
sand_ocean_region = create_region(world, player, active_locations, LocationName.sand_ocean_region, 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_7,
LocationName.lost_colony_omo_8, LocationName.lost_colony_omo_8,
LocationName.lost_colony_beetle, 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, LocationName.lost_colony_upgrade,
] ]
lost_colony_region = create_region(world, player, active_locations, LocationName.lost_colony_region, 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_1,
LocationName.weapons_bed_omo_2, LocationName.weapons_bed_omo_2,
LocationName.weapons_bed_omo_3, 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, LocationName.weapons_bed_upgrade,
] ]
weapons_bed_region = create_region(world, player, active_locations, LocationName.weapons_bed_region, 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_pipe_5,
LocationName.cosmic_wall_omo_1, LocationName.cosmic_wall_omo_1,
LocationName.cosmic_wall_beetle, 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, LocationName.cosmic_wall_upgrade,
] ]
cosmic_wall_region = create_region(world, player, active_locations, LocationName.cosmic_wall_region, 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_11,
LocationName.dry_lagoon_omo_12, LocationName.dry_lagoon_omo_12,
LocationName.dry_lagoon_beetle, 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, LocationName.dry_lagoon_upgrade,
] ]
dry_lagoon_region = create_region(world, player, active_locations, LocationName.dry_lagoon_region, 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_6,
LocationName.egg_quarters_omo_7, LocationName.egg_quarters_omo_7,
LocationName.egg_quarters_beetle, 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, LocationName.egg_quarters_upgrade,
] ]
egg_quarters_region = create_region(world, player, active_locations, LocationName.egg_quarters_region, 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_11,
LocationName.security_hall_omo_12, LocationName.security_hall_omo_12,
LocationName.security_hall_beetle, 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, LocationName.security_hall_upgrade,
] ]
security_hall_region = create_region(world, player, active_locations, LocationName.security_hall_region, 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_4,
LocationName.mad_space_omo_5, LocationName.mad_space_omo_5,
LocationName.mad_space_beetle, 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, LocationName.mad_space_upgrade,
] ]
mad_space_region = create_region(world, player, active_locations, LocationName.mad_space_region, 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_7,
LocationName.cannon_core_omo_8, LocationName.cannon_core_omo_8,
LocationName.cannon_core_omo_9, 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, LocationName.cannon_core_beetle,
] ]
cannon_core_region = create_region(world, player, active_locations, LocationName.cannon_core_region, 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) grand_prix_region_locations)
world.regions += [grand_prix_region] 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 = [ biolizard_region_locations = [
LocationName.finalhazard, LocationName.finalhazard,
] ]
@ -1035,15 +1455,25 @@ def create_regions(world, player: int, active_locations):
biolizard_region_locations) biolizard_region_locations)
world.regions += [biolizard_region] 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 = [ green_hill_region_locations = [
LocationName.green_hill, LocationName.green_hill,
LocationName.green_hill_chao_1, 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 = create_region(world, player, active_locations, LocationName.green_hill_region,
green_hill_region_locations) green_hill_region_locations)
world.regions += [green_hill_region] 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. # Set up the regions correctly.
world.regions += [ 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] = {} names: typing.Dict[str, int] = {}
connect(world, player, names, 'Menu', LocationName.gate_0_region) 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, connect(world, player, names, LocationName.cannon_core_region, LocationName.biolizard_region,
lambda state: (state.can_reach(required_mission_name, "Location", player))) 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, connect(world, player, names, 'Menu', LocationName.green_hill_region,
lambda state: (state.has(ItemName.white_emerald, player) and lambda state: (state.has(ItemName.white_emerald, player) and
state.has(ItemName.red_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) connect(world, player, names, LocationName.green_hill_region, LocationName.biolizard_region)
elif world.goal[player] == 3: elif world.goal[player] == 3:
connect(world, player, names, LocationName.kart_race_expert_region, LocationName.grand_prix_region) 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)): for i in range(len(gates[0].gate_levels)):
connect(world, player, names, LocationName.gate_0_region, shuffleable_regions[gates[0].gate_levels[i]]) 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)) lambda state: state.has(ItemName.eggman_jet_engine, player))
add_rule_safe(world, LocationName.egg_quarters_5, player, add_rule_safe(world, LocationName.egg_quarters_5, player,
lambda state: state.has(ItemName.rouge_pick_nails, player) and 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, add_rule_safe(world, LocationName.lost_colony_5, player,
lambda state: state.has(ItemName.eggman_jet_engine, player) and lambda state: state.has(ItemName.eggman_jet_engine, player) and
state.has(ItemName.eggman_large_cannon, player)) 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)) lambda state: state.has(ItemName.tails_booster, player))
add_rule(world.get_location(LocationName.hidden_base_pipe_1, player), add_rule(world.get_location(LocationName.hidden_base_pipe_1, player),
lambda state: state.has(ItemName.tails_booster, 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), add_rule(world.get_location(LocationName.sand_ocean_pipe_1, player),
lambda state: state.has(ItemName.eggman_jet_engine, 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_hammer_gloves, player) and
state.has(ItemName.knuckles_air_necklace, player)) 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): def set_mission_upgrade_rules_hard(world: MultiWorld, player: int):
# Mission 1 Upgrade Requirements # Mission 1 Upgrade Requirements
add_rule_safe(world, LocationName.pumpkin_hill_1, player, 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: if world.whistlesanity[player].value == 1 or world.whistlesanity[player].value == 3:
add_rule(world.get_location(LocationName.hidden_base_pipe_1, player), add_rule(world.get_location(LocationName.hidden_base_pipe_1, player),
lambda state: state.has(ItemName.tails_booster, 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), add_rule(world.get_location(LocationName.cosmic_wall_pipe_1, player),
lambda state: state.has(ItemName.eggman_jet_engine, 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 lambda state: state.has(ItemName.tails_booster, player) and
state.has(ItemName.knuckles_hammer_gloves, player)) 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]): def set_boss_gate_rules(world: MultiWorld, player: int, gate_bosses: typing.Dict[int, int]):
for x in range(len(gate_bosses)): 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)) 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.) # Mission Progression Rules (Mission 1 begets Mission 2, etc.)
set_mission_progress_rules(world, player, mission_map, mission_count_map) 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: elif world.logic_difficulty[player].value == 1:
set_mission_upgrade_rules_hard(world, player) 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 # Upgrade Requirements for each boss gate
set_boss_gate_rules(world, player, gate_bosses) 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 .Rules import set_rules
from .Names import ItemName, LocationName from .Names import ItemName, LocationName
from worlds.AutoWorld import WebWorld, World 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 from .Missions import get_mission_table, get_mission_count_table, get_first_and_last_cannons_core_missions
import Patch import Patch
@ -52,7 +52,7 @@ class SA2BWorld(World):
game: str = "Sonic Adventure 2 Battle" game: str = "Sonic Adventure 2 Battle"
option_definitions = sa2b_options option_definitions = sa2b_options
topology_present = False topology_present = False
data_version = 5 data_version = 6
item_name_groups = item_groups item_name_groups = item_groups
item_name_to_id = {name: data.code for name, data in item_table.items()} 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] location_table: typing.Dict[str, int]
music_map: typing.Dict[int, int] music_map: typing.Dict[int, int]
voice_map: typing.Dict[int, int]
mission_map: typing.Dict[int, int] mission_map: typing.Dict[int, int]
mission_count_map: typing.Dict[int, int] mission_count_map: typing.Dict[int, int]
emblems_for_cannons_core: int emblems_for_cannons_core: int
region_emblem_map: typing.Dict[int, int] region_emblem_map: typing.Dict[int, int]
gate_costs: typing.Dict[int, int] gate_costs: typing.Dict[int, int]
gate_bosses: typing.Dict[int, int] gate_bosses: typing.Dict[int, int]
boss_rush_map: typing.Dict[int, int]
web = SA2BWeb() web = SA2BWeb()
def _get_slot_data(self): def _get_slot_data(self):
return { return {
"ModVersion": 201, "ModVersion": 202,
"Goal": self.multiworld.goal[self.player].value, "Goal": self.multiworld.goal[self.player].value,
"MusicMap": self.music_map, "MusicMap": self.music_map,
"VoiceMap": self.voice_map,
"MissionMap": self.mission_map, "MissionMap": self.mission_map,
"MissionCountMap": self.mission_count_map, "MissionCountMap": self.mission_count_map,
"MusicShuffle": self.multiworld.music_shuffle[self.player].value, "MusicShuffle": self.multiworld.music_shuffle[self.player].value,
"Narrator": self.multiworld.narrator[self.player].value, "Narrator": self.multiworld.narrator[self.player].value,
"MinigameTrapDifficulty": self.multiworld.minigame_trap_difficulty[self.player].value, "MinigameTrapDifficulty": self.multiworld.minigame_trap_difficulty[self.player].value,
"RingLoss": self.multiworld.ring_loss[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, "RequiredRank": self.multiworld.required_rank[self.player].value,
"ChaoKeys": self.multiworld.keysanity[self.player].value, "ChaoKeys": self.multiworld.keysanity[self.player].value,
"Whistlesanity": self.multiworld.whistlesanity[self.player].value, "Whistlesanity": self.multiworld.whistlesanity[self.player].value,
"GoldBeetles": self.multiworld.beetlesanity[self.player].value, "GoldBeetles": self.multiworld.beetlesanity[self.player].value,
"OmochaoChecks": self.multiworld.omosanity[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, "KartRaceChecks": self.multiworld.kart_race_checks[self.player].value,
"ChaoRaceChecks": self.multiworld.chao_race_checks[self.player].value, "ChaoRaceChecks": self.multiworld.chao_race_checks[self.player].value,
"ChaoGardenDifficulty": self.multiworld.chao_garden_difficulty[self.player].value, "ChaoGardenDifficulty": self.multiworld.chao_garden_difficulty[self.player].value,
@ -97,6 +102,7 @@ class SA2BWorld(World):
"RegionEmblemMap": self.region_emblem_map, "RegionEmblemMap": self.region_emblem_map,
"GateCosts": self.gate_costs, "GateCosts": self.gate_costs,
"GateBosses": self.gate_bosses, "GateBosses": self.gate_bosses,
"BossRushMap": self.boss_rush_map,
} }
def _create_items(self, name: str): def _create_items(self, name: str):
@ -160,19 +166,26 @@ class SA2BWorld(World):
self.multiworld.confusion_trap_weight[self.player].value = 0 self.multiworld.confusion_trap_weight[self.player].value = 0
self.multiworld.tiny_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.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: if valid_trap_weights == 0:
self.multiworld.exposition_trap_weight[self.player].value = 4 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 self.multiworld.pong_trap_weight[self.player].value = 4
if self.multiworld.kart_race_checks[self.player].value == 0: if self.multiworld.kart_race_checks[self.player].value == 0:
self.multiworld.kart_race_checks[self.player].value = 2 self.multiworld.kart_race_checks[self.player].value = 2
self.gate_bosses = {} self.gate_bosses = {}
self.boss_rush_map = {}
else: else:
self.gate_bosses = get_gate_bosses(self.multiworld, self.player) self.gate_bosses = get_gate_bosses(self.multiworld, self.player)
self.boss_rush_map = get_boss_rush_bosses(self.multiworld, self.player)
def create_regions(self): def create_regions(self):
self.mission_map = get_mission_table(self.multiworld, self.player) 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) create_regions(self.multiworld, self.player, self.location_table)
# Not Generate Basic # 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)) self.multiworld.get_location(LocationName.finalhazard, self.player).place_locked_item(self.create_item(ItemName.maria))
elif self.multiworld.goal[self.player].value == 1: 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)) 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: if self.multiworld.goal[self.player].value != 3:
# Fill item pool with all required items # Fill item pool with all required items
for item in {**upgrades_table}: 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 # Some flavor of Chaos Emerald Hunt
for item in {**emeralds_table}: for item in {**emeralds_table}:
itempool += self._create_items(item) itempool += self._create_items(item)
# Cap at 250 Emblems # Cap at player-specified Emblem count
raw_emblem_count = total_required_locations - len(itempool) 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 extra_junk_count = raw_emblem_count - total_emblem_count
self.emblems_for_cannons_core = math.floor( 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) 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) 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)] 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.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.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.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) trap_weights += ([ItemName.pong_trap] * self.multiworld.pong_trap_weight[self.player].value)
junk_count += extra_junk_count junk_count += extra_junk_count
@ -347,12 +363,52 @@ class SA2BWorld(World):
self.music_map = dict(zip(musiclist_o, musiclist_s)) 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] data = item_table[name]
if force_non_progression: if force_non_progression:
classification = ItemClassification.filler 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 classification = ItemClassification.progression_skip_balancing
elif data.progression: elif data.progression:
classification = ItemClassification.progression classification = ItemClassification.progression
@ -369,18 +425,28 @@ class SA2BWorld(World):
self.multiworld.random.choice(junk_table.keys()) self.multiworld.random.choice(junk_table.keys())
def set_rules(self): 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): 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") spoiler_handle.write("\n")
header_text = "Sonic Adventure 2 Bosses for {}:\n" header_text = "Sonic Adventure 2 Bosses for {}:\n"
header_text = header_text.format(self.multiworld.player_name[self.player]) header_text = header_text.format(self.multiworld.player_name[self.player])
spoiler_handle.write(header_text) 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())): for x in range(len(self.gate_bosses.values())):
text = "Gate {0} Boss: {1}\n" text = "Gate {0} Boss: {1}\n"
text = text.format((x + 1), get_boss_name(self.gate_bosses[x + 1])) text = text.format((x + 1), get_boss_name(self.gate_bosses[x + 1]))
spoiler_handle.writelines(text) 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]]): def extend_hint_information(self, hint_data: typing.Dict[int, typing.Dict[int, str]]):
gate_names = [ gate_names = [