|
1 |
| -from typing import Callable, Dict, List, Set, Union, Tuple |
| 1 | +from typing import Callable, Dict, List, Set, Union, Tuple, Optional |
2 | 2 | from BaseClasses import Item, Location
|
3 | 3 | from .Items import get_full_item_list, spider_mine_sources, second_pass_placeable_items, progressive_if_nco, \
|
4 | 4 | progressive_if_ext, spear_of_adun_calldowns, spear_of_adun_castable_passives, nova_equipment
|
@@ -69,21 +69,39 @@ def filter_missions(world: World) -> Dict[MissionPools, List[SC2Mission]]:
|
69 | 69 | return mission_pools
|
70 | 70 |
|
71 | 71 | # Finding the goal map
|
72 |
| - goal_priorities = {campaign: get_campaign_goal_priority(campaign, excluded_missions) for campaign in enabled_campaigns} |
73 |
| - goal_level = max(goal_priorities.values()) |
74 |
| - candidate_campaigns: List[SC2Campaign] = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level] |
75 |
| - candidate_campaigns.sort(key=lambda it: it.id) |
76 |
| - goal_campaign = world.random.choice(candidate_campaigns) |
77 |
| - primary_goal = campaign_final_mission_locations[goal_campaign] |
78 |
| - if primary_goal is None or primary_goal.mission in excluded_missions: |
79 |
| - # No primary goal or its mission is excluded |
80 |
| - candidate_missions = list(campaign_alt_final_mission_locations[goal_campaign].keys()) |
81 |
| - candidate_missions = [mission for mission in candidate_missions if mission not in excluded_missions] |
82 |
| - if len(candidate_missions) == 0: |
83 |
| - raise Exception("There are no valid goal missions. Please exclude fewer missions.") |
84 |
| - goal_mission = world.random.choice(candidate_missions) |
| 72 | + goal_mission: Optional[SC2Mission] = None |
| 73 | + if mission_order_type in campaign_depending_orders: |
| 74 | + # Prefer long campaigns over shorter ones and harder missions over easier ones |
| 75 | + goal_priorities = {campaign: get_campaign_goal_priority(campaign, excluded_missions) for campaign in enabled_campaigns} |
| 76 | + goal_level = max(goal_priorities.values()) |
| 77 | + candidate_campaigns: List[SC2Campaign] = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level] |
| 78 | + candidate_campaigns.sort(key=lambda it: it.id) |
| 79 | + |
| 80 | + goal_campaign = world.random.choice(candidate_campaigns) |
| 81 | + primary_goal = campaign_final_mission_locations[goal_campaign] |
| 82 | + if primary_goal is None or primary_goal.mission in excluded_missions: |
| 83 | + # No primary goal or its mission is excluded |
| 84 | + candidate_missions = list(campaign_alt_final_mission_locations[goal_campaign].keys()) |
| 85 | + candidate_missions = [mission for mission in candidate_missions if mission not in excluded_missions] |
| 86 | + if len(candidate_missions) == 0: |
| 87 | + raise Exception("There are no valid goal missions. Please exclude fewer missions.") |
| 88 | + goal_mission = world.random.choice(candidate_missions) |
| 89 | + else: |
| 90 | + goal_mission = primary_goal.mission |
85 | 91 | else:
|
86 |
| - goal_mission = primary_goal.mission |
| 92 | + # Find one of the missions with the hardest difficulty |
| 93 | + available_missions: List[SC2Mission] = \ |
| 94 | + [mission for mission in SC2Mission |
| 95 | + if (mission not in excluded_missions and mission.campaign in enabled_campaigns)] |
| 96 | + available_missions.sort(key=lambda it: it.id) |
| 97 | + # Loop over pools, from hardest to easiest |
| 98 | + for mission_pool in range(MissionPools.VERY_HARD, MissionPools.STARTER - 1, -1): |
| 99 | + pool_missions: List[SC2Mission] = [mission for mission in available_missions if mission.pool == mission_pool] |
| 100 | + if pool_missions: |
| 101 | + goal_mission = world.random.choice(pool_missions) |
| 102 | + break |
| 103 | + if goal_mission is None: |
| 104 | + raise Exception("There are no valid goal missions. Please exclude fewer missions.") |
87 | 105 |
|
88 | 106 | # Excluding missions
|
89 | 107 | for difficulty, mission_pool in mission_pools.items():
|
|
0 commit comments