diff --git a/Starcraft2Client.py b/Starcraft2Client.py index c1eed74b4c..2c6406b15e 100644 --- a/Starcraft2Client.py +++ b/Starcraft2Client.py @@ -711,7 +711,7 @@ def calc_available_missions(ctx: SC2Context, unlocks=None): return available_missions -def mission_reqs_completed(ctx: SC2Context, mission_name: str, missions_complete): +def mission_reqs_completed(ctx: SC2Context, mission_name: str, missions_complete: int, mission_path: list[str] = []): """Returns a bool signifying if the mission has all requirements complete and can be done Arguments: @@ -719,6 +719,12 @@ def mission_reqs_completed(ctx: SC2Context, mission_name: str, missions_complete locations_to_check -- the mission string name to check missions_complete -- an int of how many missions have been completed """ + # Tracking mission path to prevent infinite recursion + if not mission_path: + mission_path = [] + if mission_name in mission_path: + return False + mission_path.append(mission_name) if len(ctx.mission_req_table[mission_name].required_world) >= 1: # A check for when the requirements are being or'd or_success = False @@ -736,7 +742,7 @@ def mission_reqs_completed(ctx: SC2Context, mission_name: str, missions_complete req_success = False # Recursively check required mission to see if it's requirements are met, in case !collect has been done - if not mission_reqs_completed(ctx, list(ctx.mission_req_table)[req_mission - 1], missions_complete): + if not mission_reqs_completed(ctx, list(ctx.mission_req_table)[req_mission - 1], missions_complete, mission_path): if not ctx.mission_req_table[mission_name].or_requirements: return False else: diff --git a/worlds/sc2wol/MissionTables.py b/worlds/sc2wol/MissionTables.py index 7f9c981d7d..7cb4520d45 100644 --- a/worlds/sc2wol/MissionTables.py +++ b/worlds/sc2wol/MissionTables.py @@ -90,7 +90,53 @@ gauntlet_order = [ FillMission("all_in", [5], "Char", completion_critical=True) ] -mission_orders = [vanilla_shuffle_order, vanilla_shuffle_order, mini_shuffle_order, gauntlet_order] +grid_order = [ + FillMission("no_build", [-1], "Colonist"), + FillMission("medium", [0], "Colonist"), + FillMission("medium", [1, 6, 3], "Colonist", or_requirements=True), + FillMission("hard", [2, 7], "Colonist", or_requirements=True), + FillMission("easy", [0], "Artifact"), + FillMission("medium", [1, 4], "Artifact", or_requirements=True), + FillMission("hard", [2, 5, 10, 7], "Artifact", or_requirements=True), + FillMission("hard", [3, 6, 11], "Artifact", or_requirements=True), + FillMission("medium", [4, 9], "Covert", or_requirements=True), + FillMission("hard", [5, 8, 10], "Covert", or_requirements=True), + FillMission("hard", [6, 9, 11], "Covert", or_requirements=True), + FillMission("hard", [7, 10], "Covert", or_requirements=True), + FillMission("hard", [8, 13], "Rebellion", or_requirements=True), + FillMission("hard", [9, 12, 14], "Rebellion", or_requirements=True), + FillMission("hard", [10, 13, 15], "Rebellion", or_requirements=True), + FillMission("all_in", [11, 14], "Rebellion", or_requirements=True) +] + +mini_grid_order = [ + FillMission("no_build", [-1], "Colonist"), + FillMission("medium", [0], "Colonist"), + FillMission("medium", [1, 5], "Colonist", or_requirements=True), + FillMission("easy", [0], "Artifact"), + FillMission("medium", [1, 3], "Artifact", or_requirements=True), + FillMission("hard", [2, 4, 8], "Artifact", or_requirements=True), + FillMission("medium", [3, 7], "Covert", or_requirements=True), + FillMission("hard", [4, 6, 8], "Covert", or_requirements=True), + FillMission("all_in", [5, 7], "Covert", or_requirements=True) +] + +blitz_order = [ + FillMission("no_build", [-1], "Mar Sara"), + FillMission("easy", [-1], "Mar Sara"), + FillMission("medium", [0, 1], "Colonist", number=1, or_requirements=True), + FillMission("medium", [0, 1], "Colonist", number=1, or_requirements=True), + FillMission("medium", [0, 1], "Artifact", number=2, or_requirements=True), + FillMission("medium", [0, 1], "Artifact", number=2, or_requirements=True), + FillMission("hard", [0, 1], "Covert", number=3, or_requirements=True), + FillMission("hard", [0, 1], "Covert", number=3, or_requirements=True), + FillMission("hard", [0, 1], "Rebellion", number=4, or_requirements=True), + FillMission("hard", [0, 1], "Rebellion", number=4, or_requirements=True), + FillMission("hard", [0, 1], "Char", number=5, or_requirements=True), + FillMission("all_in", [0, 1], "Char", number=5, or_requirements=True) +] + +mission_orders = [vanilla_shuffle_order, vanilla_shuffle_order, mini_shuffle_order, grid_order, mini_grid_order, blitz_order, gauntlet_order] vanilla_mission_req_table = {