Files
Grinch-AP/worlds/sc2/mission_groups.py
Ziktofel 5f1835c546 SC2: Content update (#5312)
Feature highlights:
- Adds many content to the SC2 game
- Allows custom mission order
- Adds race-swapped missions for build missions (except Epilogue and NCO)
- Allows War Council Nerfs (Protoss units can get pre - War Council State, alternative units get another custom nerf to match the power level of base units)
- Revamps Predator's upgrade tree (never was considered strategically important)
- Adds some units and upgrades
- Locked and excluded items can specify quantity
- Key mode (if opt-in, missions require keys to be unlocked on top of their regular regular requirements
- Victory caches - Victory locations can grant multiple items to the multiworld instead of one 
- The generator is more resilient for generator failures as it validates logic for item excludes
- Fixes the following issues:
  - https://github.com/ArchipelagoMW/Archipelago/issues/3531 
  - https://github.com/ArchipelagoMW/Archipelago/issues/3548
2025-09-02 17:40:58 +02:00

195 lines
8.6 KiB
Python

"""
Mission group aliases for use in yaml options.
"""
from typing import Dict, List, Set
from .mission_tables import SC2Mission, MissionFlag, SC2Campaign
class MissionGroupNames:
ALL_MISSIONS = "All Missions"
WOL_MISSIONS = "WoL Missions"
HOTS_MISSIONS = "HotS Missions"
LOTV_MISSIONS = "LotV Missions"
NCO_MISSIONS = "NCO Missions"
PROPHECY_MISSIONS = "Prophecy Missions"
PROLOGUE_MISSIONS = "Prologue Missions"
EPILOGUE_MISSIONS = "Epilogue Missions"
TERRAN_MISSIONS = "Terran Missions"
ZERG_MISSIONS = "Zerg Missions"
PROTOSS_MISSIONS = "Protoss Missions"
NOBUILD_MISSIONS = "No-Build Missions"
DEFENSE_MISSIONS = "Defense Missions"
AUTO_SCROLLER_MISSIONS = "Auto-Scroller Missions"
COUNTDOWN_MISSIONS = "Countdown Missions"
KERRIGAN_MISSIONS = "Kerrigan Missions"
VANILLA_SOA_MISSIONS = "Vanilla SOA Missions"
TERRAN_ALLY_MISSIONS = "Controllable Terran Ally Missions"
ZERG_ALLY_MISSIONS = "Controllable Zerg Ally Missions"
PROTOSS_ALLY_MISSIONS = "Controllable Protoss Ally Missions"
VS_TERRAN_MISSIONS = "Vs Terran Missions"
VS_ZERG_MISSIONS = "Vs Zerg Missions"
VS_PROTOSS_MISSIONS = "Vs Protoss Missions"
RACESWAP_MISSIONS = "Raceswap Missions"
# By planet
PLANET_MAR_SARA_MISSIONS = "Planet Mar Sara"
PLANET_CHAR_MISSIONS = "Planet Char"
PLANET_KORHAL_MISSIONS = "Planet Korhal"
PLANET_AIUR_MISSIONS = "Planet Aiur"
# By quest chain
WOL_MAR_SARA_MISSIONS = "WoL Mar Sara"
WOL_COLONIST_MISSIONS = "WoL Colonist"
WOL_ARTIFACT_MISSIONS = "WoL Artifact"
WOL_COVERT_MISSIONS = "WoL Covert"
WOL_REBELLION_MISSIONS = "WoL Rebellion"
WOL_CHAR_MISSIONS = "WoL Char"
HOTS_UMOJA_MISSIONS = "HotS Umoja"
HOTS_KALDIR_MISSIONS = "HotS Kaldir"
HOTS_CHAR_MISSIONS = "HotS Char"
HOTS_ZERUS_MISSIONS = "HotS Zerus"
HOTS_SKYGEIRR_MISSIONS = "HotS Skygeirr Station"
HOTS_DOMINION_SPACE_MISSIONS = "HotS Dominion Space"
HOTS_KORHAL_MISSIONS = "HotS Korhal"
LOTV_AIUR_MISSIONS = "LotV Aiur"
LOTV_KORHAL_MISSIONS = "LotV Korhal"
LOTV_SHAKURAS_MISSIONS = "LotV Shakuras"
LOTV_ULNAR_MISSIONS = "LotV Ulnar"
LOTV_PURIFIER_MISSIONS = "LotV Purifier"
LOTV_TALDARIM_MISSIONS = "LotV Tal'darim"
LOTV_MOEBIUS_MISSIONS = "LotV Moebius"
LOTV_RETURN_TO_AIUR_MISSIONS = "LotV Return to Aiur"
NCO_MISSION_PACK_1 = "NCO Mission Pack 1"
NCO_MISSION_PACK_2 = "NCO Mission Pack 2"
NCO_MISSION_PACK_3 = "NCO Mission Pack 3"
@classmethod
def get_all_group_names(cls) -> Set[str]:
return {
name
for identifier, name in cls.__dict__.items()
if not identifier.startswith("_") and not identifier.startswith("get_")
}
mission_groups: Dict[str, List[str]] = {}
mission_groups[MissionGroupNames.ALL_MISSIONS] = [mission.mission_name for mission in SC2Mission]
for group_name, campaign in (
(MissionGroupNames.WOL_MISSIONS, SC2Campaign.WOL),
(MissionGroupNames.HOTS_MISSIONS, SC2Campaign.HOTS),
(MissionGroupNames.LOTV_MISSIONS, SC2Campaign.LOTV),
(MissionGroupNames.NCO_MISSIONS, SC2Campaign.NCO),
(MissionGroupNames.PROPHECY_MISSIONS, SC2Campaign.PROPHECY),
(MissionGroupNames.PROLOGUE_MISSIONS, SC2Campaign.PROLOGUE),
(MissionGroupNames.EPILOGUE_MISSIONS, SC2Campaign.EPILOGUE),
):
mission_groups[group_name] = [mission.mission_name for mission in SC2Mission if mission.campaign == campaign]
for group_name, flags in (
(MissionGroupNames.TERRAN_MISSIONS, MissionFlag.Terran),
(MissionGroupNames.ZERG_MISSIONS, MissionFlag.Zerg),
(MissionGroupNames.PROTOSS_MISSIONS, MissionFlag.Protoss),
(MissionGroupNames.NOBUILD_MISSIONS, MissionFlag.NoBuild),
(MissionGroupNames.DEFENSE_MISSIONS, MissionFlag.Defense),
(MissionGroupNames.AUTO_SCROLLER_MISSIONS, MissionFlag.AutoScroller),
(MissionGroupNames.COUNTDOWN_MISSIONS, MissionFlag.Countdown),
(MissionGroupNames.KERRIGAN_MISSIONS, MissionFlag.Kerrigan),
(MissionGroupNames.VANILLA_SOA_MISSIONS, MissionFlag.VanillaSoa),
(MissionGroupNames.TERRAN_ALLY_MISSIONS, MissionFlag.AiTerranAlly),
(MissionGroupNames.ZERG_ALLY_MISSIONS, MissionFlag.AiZergAlly),
(MissionGroupNames.PROTOSS_ALLY_MISSIONS, MissionFlag.AiProtossAlly),
(MissionGroupNames.VS_TERRAN_MISSIONS, MissionFlag.VsTerran),
(MissionGroupNames.VS_ZERG_MISSIONS, MissionFlag.VsZerg),
(MissionGroupNames.VS_PROTOSS_MISSIONS, MissionFlag.VsProtoss),
(MissionGroupNames.RACESWAP_MISSIONS, MissionFlag.RaceSwap),
):
mission_groups[group_name] = [mission.mission_name for mission in SC2Mission if flags in mission.flags]
for group_name, campaign, chain_name in (
(MissionGroupNames.WOL_MAR_SARA_MISSIONS, SC2Campaign.WOL, "Mar Sara"),
(MissionGroupNames.WOL_COLONIST_MISSIONS, SC2Campaign.WOL, "Colonist"),
(MissionGroupNames.WOL_ARTIFACT_MISSIONS, SC2Campaign.WOL, "Artifact"),
(MissionGroupNames.WOL_COVERT_MISSIONS, SC2Campaign.WOL, "Covert"),
(MissionGroupNames.WOL_REBELLION_MISSIONS, SC2Campaign.WOL, "Rebellion"),
(MissionGroupNames.WOL_CHAR_MISSIONS, SC2Campaign.WOL, "Char"),
(MissionGroupNames.HOTS_UMOJA_MISSIONS, SC2Campaign.HOTS, "Umoja"),
(MissionGroupNames.HOTS_KALDIR_MISSIONS, SC2Campaign.HOTS, "Kaldir"),
(MissionGroupNames.HOTS_CHAR_MISSIONS, SC2Campaign.HOTS, "Char"),
(MissionGroupNames.HOTS_ZERUS_MISSIONS, SC2Campaign.HOTS, "Zerus"),
(MissionGroupNames.HOTS_SKYGEIRR_MISSIONS, SC2Campaign.HOTS, "Skygeirr Station"),
(MissionGroupNames.HOTS_DOMINION_SPACE_MISSIONS, SC2Campaign.HOTS, "Dominion Space"),
(MissionGroupNames.HOTS_KORHAL_MISSIONS, SC2Campaign.HOTS, "Korhal"),
(MissionGroupNames.LOTV_AIUR_MISSIONS, SC2Campaign.LOTV, "Aiur"),
(MissionGroupNames.LOTV_KORHAL_MISSIONS, SC2Campaign.LOTV, "Korhal"),
(MissionGroupNames.LOTV_SHAKURAS_MISSIONS, SC2Campaign.LOTV, "Shakuras"),
(MissionGroupNames.LOTV_ULNAR_MISSIONS, SC2Campaign.LOTV, "Ulnar"),
(MissionGroupNames.LOTV_PURIFIER_MISSIONS, SC2Campaign.LOTV, "Purifier"),
(MissionGroupNames.LOTV_TALDARIM_MISSIONS, SC2Campaign.LOTV, "Tal'darim"),
(MissionGroupNames.LOTV_MOEBIUS_MISSIONS, SC2Campaign.LOTV, "Moebius"),
(MissionGroupNames.LOTV_RETURN_TO_AIUR_MISSIONS, SC2Campaign.LOTV, "Return to Aiur"),
):
mission_groups[group_name] = [
mission.mission_name for mission in SC2Mission if mission.campaign == campaign and mission.area == chain_name
]
mission_groups[MissionGroupNames.NCO_MISSION_PACK_1] = [
SC2Mission.THE_ESCAPE.mission_name,
SC2Mission.SUDDEN_STRIKE.mission_name,
SC2Mission.ENEMY_INTELLIGENCE.mission_name,
]
mission_groups[MissionGroupNames.NCO_MISSION_PACK_2] = [
SC2Mission.TROUBLE_IN_PARADISE.mission_name,
SC2Mission.NIGHT_TERRORS.mission_name,
SC2Mission.FLASHPOINT.mission_name,
]
mission_groups[MissionGroupNames.NCO_MISSION_PACK_3] = [
SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name,
SC2Mission.DARK_SKIES.mission_name,
SC2Mission.END_GAME.mission_name,
]
mission_groups[MissionGroupNames.PLANET_MAR_SARA_MISSIONS] = [
SC2Mission.LIBERATION_DAY.mission_name,
SC2Mission.THE_OUTLAWS.mission_name,
SC2Mission.ZERO_HOUR.mission_name,
]
mission_groups[MissionGroupNames.PLANET_CHAR_MISSIONS] = [
SC2Mission.GATES_OF_HELL.mission_name,
SC2Mission.BELLY_OF_THE_BEAST.mission_name,
SC2Mission.SHATTER_THE_SKY.mission_name,
SC2Mission.ALL_IN.mission_name,
SC2Mission.DOMINATION.mission_name,
SC2Mission.FIRE_IN_THE_SKY.mission_name,
SC2Mission.OLD_SOLDIERS.mission_name,
]
mission_groups[MissionGroupNames.PLANET_KORHAL_MISSIONS] = [
SC2Mission.MEDIA_BLITZ.mission_name,
SC2Mission.PLANETFALL.mission_name,
SC2Mission.DEATH_FROM_ABOVE.mission_name,
SC2Mission.THE_RECKONING.mission_name,
SC2Mission.SKY_SHIELD.mission_name,
SC2Mission.BROTHERS_IN_ARMS.mission_name,
]
mission_groups[MissionGroupNames.PLANET_AIUR_MISSIONS] = [
SC2Mission.ECHOES_OF_THE_FUTURE.mission_name,
SC2Mission.FOR_AIUR.mission_name,
SC2Mission.THE_GROWING_SHADOW.mission_name,
SC2Mission.THE_SPEAR_OF_ADUN.mission_name,
SC2Mission.TEMPLAR_S_RETURN.mission_name,
SC2Mission.THE_HOST.mission_name,
SC2Mission.SALVATION.mission_name,
]
for mission in SC2Mission:
if mission.flags & MissionFlag.HasRaceSwap:
short_name = mission.get_short_name()
mission_groups[short_name] = [
mission_var.mission_name for mission_var in SC2Mission if short_name in mission_var.mission_name
]