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
This commit is contained in:
194
worlds/sc2/mission_groups.py
Normal file
194
worlds/sc2/mission_groups.py
Normal file
@@ -0,0 +1,194 @@
|
||||
"""
|
||||
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
|
||||
]
|
||||
Reference in New Issue
Block a user