Skip to content

Commit 7515773

Browse files
Ziktofelqwint
authored andcommitted
SC2: For non-campaign order pick one of the hardest missions as goal (ArchipelagoMW#3180)
This allows End Game as the goal even if long campaigns are present
1 parent 73d986b commit 7515773

File tree

2 files changed

+36
-19
lines changed

2 files changed

+36
-19
lines changed

worlds/sc2/MissionTables.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ class SC2CampaignGoal(NamedTuple):
650650
SC2Campaign.PROLOGUE: SC2CampaignGoal(SC2Mission.EVIL_AWOKEN, "Evil Awoken: Victory"),
651651
SC2Campaign.LOTV: SC2CampaignGoal(SC2Mission.SALVATION, "Salvation: Victory"),
652652
SC2Campaign.EPILOGUE: None,
653-
SC2Campaign.NCO: None,
653+
SC2Campaign.NCO: SC2CampaignGoal(SC2Mission.END_GAME, "End Game: Victory"),
654654
}
655655

656656
campaign_alt_final_mission_locations: Dict[SC2Campaign, Dict[SC2Mission, str]] = {
@@ -683,7 +683,6 @@ class SC2CampaignGoal(NamedTuple):
683683
SC2Mission.THE_ESSENCE_OF_ETERNITY: "The Essence of Eternity: Victory",
684684
},
685685
SC2Campaign.NCO: {
686-
SC2Mission.END_GAME: "End Game: Victory",
687686
SC2Mission.FLASHPOINT: "Flashpoint: Victory",
688687
SC2Mission.DARK_SKIES: "Dark Skies: Victory",
689688
SC2Mission.NIGHT_TERRORS: "Night Terrors: Victory",
@@ -709,10 +708,10 @@ def get_goal_location(mission: SC2Mission) -> Union[str, None]:
709708
return primary_campaign_goal.location
710709

711710
campaign_alt_goals = campaign_alt_final_mission_locations[campaign]
712-
if campaign_alt_goals is not None:
711+
if campaign_alt_goals is not None and mission in campaign_alt_goals:
713712
return campaign_alt_goals.get(mission)
714713

715-
return None
714+
return mission.mission_name + ": Victory"
716715

717716

718717
def get_campaign_potential_goal_missions(campaign: SC2Campaign) -> List[SC2Mission]:

worlds/sc2/PoolFilter.py

+33-15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Callable, Dict, List, Set, Union, Tuple
1+
from typing import Callable, Dict, List, Set, Union, Tuple, Optional
22
from BaseClasses import Item, Location
33
from .Items import get_full_item_list, spider_mine_sources, second_pass_placeable_items, progressive_if_nco, \
44
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]]:
6969
return mission_pools
7070

7171
# 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
8591
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.")
87105

88106
# Excluding missions
89107
for difficulty, mission_pool in mission_pools.items():

0 commit comments

Comments
 (0)