SC2: For non-campaign order pick one of the hardest missions as goal (#3180)
This allows End Game as the goal even if long campaigns are present
This commit is contained in:
parent
9d478ba2bc
commit
8c8b29ae92
|
@ -650,7 +650,7 @@ campaign_final_mission_locations: Dict[SC2Campaign, SC2CampaignGoal] = {
|
||||||
SC2Campaign.PROLOGUE: SC2CampaignGoal(SC2Mission.EVIL_AWOKEN, "Evil Awoken: Victory"),
|
SC2Campaign.PROLOGUE: SC2CampaignGoal(SC2Mission.EVIL_AWOKEN, "Evil Awoken: Victory"),
|
||||||
SC2Campaign.LOTV: SC2CampaignGoal(SC2Mission.SALVATION, "Salvation: Victory"),
|
SC2Campaign.LOTV: SC2CampaignGoal(SC2Mission.SALVATION, "Salvation: Victory"),
|
||||||
SC2Campaign.EPILOGUE: None,
|
SC2Campaign.EPILOGUE: None,
|
||||||
SC2Campaign.NCO: None,
|
SC2Campaign.NCO: SC2CampaignGoal(SC2Mission.END_GAME, "End Game: Victory"),
|
||||||
}
|
}
|
||||||
|
|
||||||
campaign_alt_final_mission_locations: Dict[SC2Campaign, Dict[SC2Mission, str]] = {
|
campaign_alt_final_mission_locations: Dict[SC2Campaign, Dict[SC2Mission, str]] = {
|
||||||
|
@ -683,7 +683,6 @@ campaign_alt_final_mission_locations: Dict[SC2Campaign, Dict[SC2Mission, str]] =
|
||||||
SC2Mission.THE_ESSENCE_OF_ETERNITY: "The Essence of Eternity: Victory",
|
SC2Mission.THE_ESSENCE_OF_ETERNITY: "The Essence of Eternity: Victory",
|
||||||
},
|
},
|
||||||
SC2Campaign.NCO: {
|
SC2Campaign.NCO: {
|
||||||
SC2Mission.END_GAME: "End Game: Victory",
|
|
||||||
SC2Mission.FLASHPOINT: "Flashpoint: Victory",
|
SC2Mission.FLASHPOINT: "Flashpoint: Victory",
|
||||||
SC2Mission.DARK_SKIES: "Dark Skies: Victory",
|
SC2Mission.DARK_SKIES: "Dark Skies: Victory",
|
||||||
SC2Mission.NIGHT_TERRORS: "Night Terrors: Victory",
|
SC2Mission.NIGHT_TERRORS: "Night Terrors: Victory",
|
||||||
|
@ -709,10 +708,10 @@ def get_goal_location(mission: SC2Mission) -> Union[str, None]:
|
||||||
return primary_campaign_goal.location
|
return primary_campaign_goal.location
|
||||||
|
|
||||||
campaign_alt_goals = campaign_alt_final_mission_locations[campaign]
|
campaign_alt_goals = campaign_alt_final_mission_locations[campaign]
|
||||||
if campaign_alt_goals is not None:
|
if campaign_alt_goals is not None and mission in campaign_alt_goals:
|
||||||
return campaign_alt_goals.get(mission)
|
return campaign_alt_goals.get(mission)
|
||||||
|
|
||||||
return None
|
return mission.mission_name + ": Victory"
|
||||||
|
|
||||||
|
|
||||||
def get_campaign_potential_goal_missions(campaign: SC2Campaign) -> List[SC2Mission]:
|
def get_campaign_potential_goal_missions(campaign: SC2Campaign) -> List[SC2Mission]:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from typing import Callable, Dict, List, Set, Union, Tuple
|
from typing import Callable, Dict, List, Set, Union, Tuple, Optional
|
||||||
from BaseClasses import Item, Location
|
from BaseClasses import Item, Location
|
||||||
from .Items import get_full_item_list, spider_mine_sources, second_pass_placeable_items, progressive_if_nco, \
|
from .Items import get_full_item_list, spider_mine_sources, second_pass_placeable_items, progressive_if_nco, \
|
||||||
progressive_if_ext, spear_of_adun_calldowns, spear_of_adun_castable_passives, nova_equipment
|
progressive_if_ext, spear_of_adun_calldowns, spear_of_adun_castable_passives, nova_equipment
|
||||||
|
@ -69,10 +69,14 @@ def filter_missions(world: World) -> Dict[MissionPools, List[SC2Mission]]:
|
||||||
return mission_pools
|
return mission_pools
|
||||||
|
|
||||||
# Finding the goal map
|
# Finding the goal map
|
||||||
|
goal_mission: Optional[SC2Mission] = None
|
||||||
|
if mission_order_type in campaign_depending_orders:
|
||||||
|
# Prefer long campaigns over shorter ones and harder missions over easier ones
|
||||||
goal_priorities = {campaign: get_campaign_goal_priority(campaign, excluded_missions) for campaign in enabled_campaigns}
|
goal_priorities = {campaign: get_campaign_goal_priority(campaign, excluded_missions) for campaign in enabled_campaigns}
|
||||||
goal_level = max(goal_priorities.values())
|
goal_level = max(goal_priorities.values())
|
||||||
candidate_campaigns: List[SC2Campaign] = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level]
|
candidate_campaigns: List[SC2Campaign] = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level]
|
||||||
candidate_campaigns.sort(key=lambda it: it.id)
|
candidate_campaigns.sort(key=lambda it: it.id)
|
||||||
|
|
||||||
goal_campaign = world.random.choice(candidate_campaigns)
|
goal_campaign = world.random.choice(candidate_campaigns)
|
||||||
primary_goal = campaign_final_mission_locations[goal_campaign]
|
primary_goal = campaign_final_mission_locations[goal_campaign]
|
||||||
if primary_goal is None or primary_goal.mission in excluded_missions:
|
if primary_goal is None or primary_goal.mission in excluded_missions:
|
||||||
|
@ -84,6 +88,20 @@ def filter_missions(world: World) -> Dict[MissionPools, List[SC2Mission]]:
|
||||||
goal_mission = world.random.choice(candidate_missions)
|
goal_mission = world.random.choice(candidate_missions)
|
||||||
else:
|
else:
|
||||||
goal_mission = primary_goal.mission
|
goal_mission = primary_goal.mission
|
||||||
|
else:
|
||||||
|
# Find one of the missions with the hardest difficulty
|
||||||
|
available_missions: List[SC2Mission] = \
|
||||||
|
[mission for mission in SC2Mission
|
||||||
|
if (mission not in excluded_missions and mission.campaign in enabled_campaigns)]
|
||||||
|
available_missions.sort(key=lambda it: it.id)
|
||||||
|
# Loop over pools, from hardest to easiest
|
||||||
|
for mission_pool in range(MissionPools.VERY_HARD, MissionPools.STARTER - 1, -1):
|
||||||
|
pool_missions: List[SC2Mission] = [mission for mission in available_missions if mission.pool == mission_pool]
|
||||||
|
if pool_missions:
|
||||||
|
goal_mission = world.random.choice(pool_missions)
|
||||||
|
break
|
||||||
|
if goal_mission is None:
|
||||||
|
raise Exception("There are no valid goal missions. Please exclude fewer missions.")
|
||||||
|
|
||||||
# Excluding missions
|
# Excluding missions
|
||||||
for difficulty, mission_pool in mission_pools.items():
|
for difficulty, mission_pool in mission_pools.items():
|
||||||
|
|
Loading…
Reference in New Issue