2022-12-07 05:20:02 +00:00
|
|
|
import typing
|
|
|
|
import copy
|
|
|
|
|
|
|
|
from BaseClasses import MultiWorld
|
2023-11-16 07:08:38 +00:00
|
|
|
from worlds.AutoWorld import World
|
2022-12-07 05:20:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
mission_orders: typing.List[typing.List[int]] = [
|
|
|
|
[1, 2, 3, 4, 5],
|
|
|
|
[1, 2, 3, 5, 4],
|
|
|
|
[1, 2, 4, 3, 5],
|
|
|
|
[1, 2, 4, 5, 3],
|
|
|
|
[1, 2, 5, 3, 4],
|
|
|
|
[1, 2, 5, 4, 3],
|
|
|
|
|
|
|
|
[1, 3, 2, 4, 5],
|
|
|
|
[1, 3, 2, 5, 4],
|
|
|
|
[1, 3, 4, 2, 5],
|
|
|
|
[1, 3, 4, 5, 2],
|
|
|
|
[1, 3, 5, 2, 4],
|
|
|
|
[1, 3, 5, 4, 2],
|
|
|
|
|
|
|
|
[1, 4, 2, 3, 5],
|
|
|
|
[1, 4, 2, 5, 3],
|
|
|
|
[1, 4, 3, 2, 5],
|
|
|
|
[1, 4, 3, 5, 2],
|
|
|
|
[1, 4, 5, 2, 3],
|
|
|
|
[1, 4, 5, 3, 2],
|
|
|
|
|
|
|
|
[1, 5, 2, 3, 4],
|
|
|
|
[1, 5, 2, 4, 3],
|
|
|
|
[1, 5, 3, 2, 4],
|
|
|
|
[1, 5, 3, 4, 2],
|
|
|
|
[1, 5, 4, 2, 3],
|
|
|
|
[1, 5, 4, 3, 2],
|
|
|
|
|
|
|
|
[2, 1, 3, 4, 5],
|
|
|
|
[2, 1, 3, 5, 4],
|
|
|
|
[2, 1, 4, 3, 5],
|
|
|
|
[2, 1, 4, 5, 3],
|
|
|
|
[2, 1, 5, 3, 4],
|
|
|
|
[2, 1, 5, 4, 3],
|
|
|
|
|
|
|
|
[2, 3, 1, 4, 5],
|
|
|
|
[2, 3, 1, 5, 4],
|
|
|
|
[2, 3, 4, 1, 5],
|
|
|
|
[2, 3, 4, 5, 1],
|
|
|
|
[2, 3, 5, 1, 4],
|
|
|
|
[2, 3, 5, 4, 1],
|
|
|
|
|
|
|
|
[2, 4, 1, 3, 5],
|
|
|
|
[2, 4, 1, 5, 3],
|
|
|
|
[2, 4, 3, 1, 5],
|
|
|
|
[2, 4, 3, 5, 1],
|
|
|
|
[2, 4, 5, 1, 3],
|
|
|
|
[2, 4, 5, 3, 1],
|
|
|
|
|
|
|
|
[2, 5, 1, 3, 4],
|
|
|
|
[2, 5, 1, 4, 3],
|
|
|
|
[2, 5, 3, 1, 4],
|
|
|
|
[2, 5, 3, 4, 1],
|
|
|
|
[2, 5, 4, 1, 3],
|
|
|
|
[2, 5, 4, 3, 1],
|
|
|
|
|
|
|
|
[3, 1, 2, 4, 5],
|
|
|
|
[3, 1, 2, 5, 4],
|
|
|
|
[3, 1, 4, 2, 5],
|
|
|
|
[3, 1, 4, 5, 2],
|
|
|
|
[3, 1, 5, 4, 2],
|
|
|
|
[3, 1, 5, 2, 4],
|
|
|
|
|
|
|
|
[3, 2, 1, 4, 5],
|
|
|
|
[3, 2, 1, 5, 4],
|
|
|
|
[3, 2, 4, 1, 5],
|
|
|
|
[3, 2, 4, 5, 1],
|
|
|
|
[3, 2, 5, 1, 4],
|
|
|
|
[3, 2, 5, 4, 1],
|
|
|
|
|
|
|
|
[3, 4, 1, 2, 5],
|
|
|
|
[3, 4, 1, 5, 2],
|
|
|
|
[3, 4, 2, 1, 5],
|
|
|
|
[3, 4, 2, 5, 1],
|
|
|
|
[3, 4, 5, 1, 2],
|
|
|
|
[3, 4, 5, 2, 1],
|
|
|
|
|
|
|
|
[3, 5, 1, 4, 2],
|
|
|
|
[3, 5, 1, 2, 4],
|
|
|
|
[3, 5, 2, 1, 4],
|
|
|
|
[3, 5, 2, 4, 1],
|
|
|
|
[3, 5, 4, 1, 2],
|
|
|
|
[3, 5, 4, 2, 1],
|
|
|
|
|
|
|
|
[4, 1, 2, 3, 5],
|
|
|
|
[4, 1, 2, 5, 3],
|
|
|
|
[4, 1, 3, 2, 5],
|
|
|
|
[4, 1, 3, 5, 2],
|
|
|
|
[4, 1, 5, 3, 2],
|
|
|
|
[4, 1, 5, 2, 3],
|
|
|
|
|
|
|
|
[4, 2, 1, 3, 5],
|
|
|
|
[4, 2, 1, 5, 3],
|
|
|
|
[4, 2, 3, 1, 5],
|
|
|
|
[4, 2, 3, 5, 1],
|
|
|
|
[4, 2, 5, 1, 3],
|
|
|
|
[4, 2, 5, 3, 1],
|
|
|
|
|
|
|
|
[4, 3, 1, 2, 5],
|
|
|
|
[4, 3, 1, 5, 2],
|
|
|
|
[4, 3, 2, 1, 5],
|
|
|
|
[4, 3, 2, 5, 1],
|
|
|
|
[4, 3, 5, 1, 2],
|
|
|
|
[4, 3, 5, 2, 1],
|
|
|
|
|
|
|
|
[4, 5, 1, 3, 2],
|
|
|
|
[4, 5, 1, 2, 3],
|
|
|
|
[4, 5, 2, 1, 3],
|
|
|
|
[4, 5, 2, 3, 1],
|
|
|
|
[4, 5, 3, 1, 2],
|
|
|
|
[4, 5, 3, 2, 1],
|
|
|
|
]
|
|
|
|
|
|
|
|
### 0: Speed
|
|
|
|
### 1: Mech
|
|
|
|
### 2: Hunt
|
|
|
|
### 3: Kart
|
|
|
|
### 4: Cannon's Core
|
|
|
|
level_styles: typing.List[int] = [
|
|
|
|
0,
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
2,
|
|
|
|
3,
|
|
|
|
1,
|
|
|
|
0,
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
2,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
|
|
|
|
1,
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
0,
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
1,
|
|
|
|
2,
|
|
|
|
0,
|
|
|
|
3,
|
|
|
|
0,
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
0,
|
|
|
|
|
|
|
|
4,
|
|
|
|
]
|
|
|
|
|
|
|
|
stage_name_prefixes: typing.List[str] = [
|
|
|
|
"City Escape - ",
|
|
|
|
"Wild Canyon - ",
|
|
|
|
"Prison Lane - ",
|
|
|
|
"Metal Harbor - ",
|
|
|
|
"Green Forest - ",
|
|
|
|
"Pumpkin Hill - ",
|
|
|
|
"Mission Street - ",
|
|
|
|
"Aquatic Mine - ",
|
|
|
|
"Route 101 - ",
|
|
|
|
"Hidden Base - ",
|
|
|
|
"Pyramid Cave - ",
|
|
|
|
"Death Chamber - ",
|
|
|
|
"Eternal Engine - ",
|
|
|
|
"Meteor Herd - ",
|
|
|
|
"Crazy Gadget - ",
|
|
|
|
"Final Rush - ",
|
|
|
|
"Iron Gate - ",
|
|
|
|
"Dry Lagoon - ",
|
|
|
|
"Sand Ocean - ",
|
|
|
|
"Radical Highway - ",
|
|
|
|
"Egg Quarters - ",
|
|
|
|
"Lost Colony - ",
|
|
|
|
"Weapons Bed - ",
|
|
|
|
"Security Hall - ",
|
|
|
|
"White Jungle - ",
|
|
|
|
"Route 280 - ",
|
|
|
|
"Sky Rail - ",
|
|
|
|
"Mad Space - ",
|
|
|
|
"Cosmic Wall - ",
|
|
|
|
"Final Chase - ",
|
2023-06-27 21:38:58 +00:00
|
|
|
"Cannon's Core - ",
|
2022-12-07 05:20:02 +00:00
|
|
|
]
|
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
def get_mission_count_table(multiworld: MultiWorld, world: World, player: int):
|
2022-12-07 05:20:02 +00:00
|
|
|
mission_count_table: typing.Dict[int, int] = {}
|
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if world.options.goal == 3:
|
2023-03-21 20:26:13 +00:00
|
|
|
for level in range(31):
|
|
|
|
mission_count_table[level] = 0
|
|
|
|
else:
|
|
|
|
speed_active_missions = 1
|
|
|
|
mech_active_missions = 1
|
|
|
|
hunt_active_missions = 1
|
|
|
|
kart_active_missions = 1
|
|
|
|
cannons_core_active_missions = 1
|
|
|
|
|
|
|
|
for i in range(2,6):
|
2023-11-16 07:08:38 +00:00
|
|
|
if getattr(world.options, "speed_mission_" + str(i), None):
|
2023-03-21 20:26:13 +00:00
|
|
|
speed_active_missions += 1
|
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if getattr(world.options, "mech_mission_" + str(i), None):
|
2023-03-21 20:26:13 +00:00
|
|
|
mech_active_missions += 1
|
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if getattr(world.options, "hunt_mission_" + str(i), None):
|
2023-03-21 20:26:13 +00:00
|
|
|
hunt_active_missions += 1
|
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if getattr(world.options, "kart_mission_" + str(i), None):
|
2023-03-21 20:26:13 +00:00
|
|
|
kart_active_missions += 1
|
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if getattr(world.options, "cannons_core_mission_" + str(i), None):
|
2023-03-21 20:26:13 +00:00
|
|
|
cannons_core_active_missions += 1
|
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
speed_active_missions = min(speed_active_missions, world.options.speed_mission_count.value)
|
|
|
|
mech_active_missions = min(mech_active_missions, world.options.mech_mission_count.value)
|
|
|
|
hunt_active_missions = min(hunt_active_missions, world.options.hunt_mission_count.value)
|
|
|
|
kart_active_missions = min(kart_active_missions, world.options.kart_mission_count.value)
|
|
|
|
cannons_core_active_missions = min(cannons_core_active_missions, world.options.cannons_core_mission_count.value)
|
2023-03-21 20:26:13 +00:00
|
|
|
|
|
|
|
active_missions: typing.List[typing.List[int]] = [
|
|
|
|
speed_active_missions,
|
|
|
|
mech_active_missions,
|
|
|
|
hunt_active_missions,
|
|
|
|
kart_active_missions,
|
|
|
|
cannons_core_active_missions
|
|
|
|
]
|
|
|
|
|
|
|
|
for level in range(31):
|
|
|
|
level_style = level_styles[level]
|
|
|
|
level_mission_count = active_missions[level_style]
|
|
|
|
mission_count_table[level] = level_mission_count
|
2022-12-07 05:20:02 +00:00
|
|
|
|
|
|
|
return mission_count_table
|
|
|
|
|
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
def get_mission_table(multiworld: MultiWorld, world: World, player: int):
|
2022-12-07 05:20:02 +00:00
|
|
|
mission_table: typing.Dict[int, int] = {}
|
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if world.options.goal == 3:
|
2023-03-21 20:26:13 +00:00
|
|
|
for level in range(31):
|
|
|
|
mission_table[level] = 0
|
|
|
|
else:
|
|
|
|
speed_active_missions: typing.List[int] = [1]
|
|
|
|
mech_active_missions: typing.List[int] = [1]
|
|
|
|
hunt_active_missions: typing.List[int] = [1]
|
|
|
|
kart_active_missions: typing.List[int] = [1]
|
|
|
|
cannons_core_active_missions: typing.List[int] = [1]
|
|
|
|
|
|
|
|
# Add included missions
|
|
|
|
for i in range(2,6):
|
2023-11-16 07:08:38 +00:00
|
|
|
if getattr(world.options, "speed_mission_" + str(i), None):
|
2023-03-21 20:26:13 +00:00
|
|
|
speed_active_missions.append(i)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if getattr(world.options, "mech_mission_" + str(i), None):
|
2023-03-21 20:26:13 +00:00
|
|
|
mech_active_missions.append(i)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if getattr(world.options, "hunt_mission_" + str(i), None):
|
2023-03-21 20:26:13 +00:00
|
|
|
hunt_active_missions.append(i)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if getattr(world.options, "kart_mission_" + str(i), None):
|
2023-03-21 20:26:13 +00:00
|
|
|
kart_active_missions.append(i)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if getattr(world.options, "cannons_core_mission_" + str(i), None):
|
2023-03-21 20:26:13 +00:00
|
|
|
cannons_core_active_missions.append(i)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-03-21 20:26:13 +00:00
|
|
|
active_missions: typing.List[typing.List[int]] = [
|
|
|
|
speed_active_missions,
|
|
|
|
mech_active_missions,
|
|
|
|
hunt_active_missions,
|
|
|
|
kart_active_missions,
|
|
|
|
cannons_core_active_missions
|
|
|
|
]
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-03-21 20:26:13 +00:00
|
|
|
for level in range(31):
|
|
|
|
level_style = level_styles[level]
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-03-21 20:26:13 +00:00
|
|
|
level_active_missions: typing.List[int] = copy.deepcopy(active_missions[level_style])
|
|
|
|
level_chosen_missions: typing.List[int] = []
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-03-21 20:26:13 +00:00
|
|
|
# The first mission must be M1, M2, M3, or M4
|
|
|
|
first_mission = 1
|
2023-06-27 21:38:58 +00:00
|
|
|
first_mission_options = [1, 2, 3]
|
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if not world.options.animalsanity:
|
2023-06-27 21:38:58 +00:00
|
|
|
first_mission_options.append(4)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if world.options.mission_shuffle:
|
2023-06-27 21:38:58 +00:00
|
|
|
first_mission = multiworld.random.choice([mission for mission in level_active_missions if mission in first_mission_options])
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-03-21 20:26:13 +00:00
|
|
|
level_active_missions.remove(first_mission)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-03-21 20:26:13 +00:00
|
|
|
# Place Active Missions in the chosen mission list
|
|
|
|
for mission in level_active_missions:
|
|
|
|
if mission not in level_chosen_missions:
|
|
|
|
level_chosen_missions.append(mission)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-11-16 07:08:38 +00:00
|
|
|
if world.options.mission_shuffle:
|
2023-03-21 20:26:13 +00:00
|
|
|
multiworld.random.shuffle(level_chosen_missions)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-03-21 20:26:13 +00:00
|
|
|
level_chosen_missions.insert(0, first_mission)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-03-21 20:26:13 +00:00
|
|
|
# Fill in the non-included missions
|
|
|
|
for i in range(2,6):
|
|
|
|
if i not in level_chosen_missions:
|
|
|
|
level_chosen_missions.append(i)
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-03-21 20:26:13 +00:00
|
|
|
# Determine which mission order index we have, for conveying to the mod
|
|
|
|
for i in range(len(mission_orders)):
|
|
|
|
if mission_orders[i] == level_chosen_missions:
|
|
|
|
level_mission_index = i
|
|
|
|
break
|
2022-12-07 05:20:02 +00:00
|
|
|
|
2023-03-21 20:26:13 +00:00
|
|
|
mission_table[level] = level_mission_index
|
2022-12-07 05:20:02 +00:00
|
|
|
|
|
|
|
return mission_table
|
|
|
|
|
|
|
|
|
|
|
|
def get_first_and_last_cannons_core_missions(mission_map: typing.Dict[int, int], mission_count_map: typing.Dict[int, int]):
|
|
|
|
mission_count = mission_count_map[30]
|
|
|
|
mission_order: typing.List[int] = mission_orders[mission_map[30]]
|
|
|
|
stage_prefix: str = stage_name_prefixes[30]
|
|
|
|
|
|
|
|
first_mission_number = mission_order[0]
|
|
|
|
last_mission_number = mission_order[mission_count - 1]
|
|
|
|
first_location_name: str = stage_prefix + str(first_mission_number)
|
|
|
|
last_location_name: str = stage_prefix + str(last_mission_number)
|
|
|
|
|
|
|
|
return first_location_name, last_location_name
|