908 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			908 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			Python
		
	
	
	
| from dataclasses import dataclass, fields, Field
 | |
| from typing import FrozenSet, Union, Set
 | |
| 
 | |
| from Options import Choice, Toggle, DefaultOnToggle, ItemSet, OptionSet, Range, PerGameCommonOptions
 | |
| from .MissionTables import SC2Campaign, SC2Mission, lookup_name_to_mission, MissionPools, get_no_build_missions, \
 | |
|     campaign_mission_table
 | |
| from worlds.AutoWorld import World
 | |
| 
 | |
| 
 | |
| class GameDifficulty(Choice):
 | |
|     """
 | |
|     The difficulty of the campaign, affects enemy AI, starting units, and game speed.
 | |
| 
 | |
|     For those unfamiliar with the Archipelago randomizer, the recommended settings are one difficulty level
 | |
|     lower than the vanilla game
 | |
|     """
 | |
|     display_name = "Game Difficulty"
 | |
|     option_casual = 0
 | |
|     option_normal = 1
 | |
|     option_hard = 2
 | |
|     option_brutal = 3
 | |
|     default = 1
 | |
| 
 | |
| 
 | |
| class GameSpeed(Choice):
 | |
|     """Optional setting to override difficulty-based game speed."""
 | |
|     display_name = "Game Speed"
 | |
|     option_default = 0
 | |
|     option_slower = 1
 | |
|     option_slow = 2
 | |
|     option_normal = 3
 | |
|     option_fast = 4
 | |
|     option_faster = 5
 | |
|     default = option_default
 | |
| 
 | |
| 
 | |
| class DisableForcedCamera(Toggle):
 | |
|     """
 | |
|     Prevents the game from moving or locking the camera without the player's consent.
 | |
|     """
 | |
|     display_name = "Disable Forced Camera Movement"
 | |
| 
 | |
| 
 | |
| class SkipCutscenes(Toggle):
 | |
|     """
 | |
|     Skips all cutscenes and prevents dialog from blocking progress.
 | |
|     """
 | |
|     display_name = "Skip Cutscenes"
 | |
| 
 | |
| 
 | |
| class AllInMap(Choice):
 | |
|     """Determines what version of All-In (WoL final map) that will be generated for the campaign."""
 | |
|     display_name = "All In Map"
 | |
|     option_ground = 0
 | |
|     option_air = 1
 | |
| 
 | |
| 
 | |
| class MissionOrder(Choice):
 | |
|     """
 | |
|     Determines the order the missions are played in.  The last three mission orders end in a random mission.
 | |
|     Vanilla (83 total if all campaigns enabled): Keeps the standard mission order and branching from the vanilla Campaigns.
 | |
|     Vanilla Shuffled (83 total if all campaigns enabled): Keeps same branching paths from the vanilla Campaigns but randomizes the order of missions within.
 | |
|     Mini Campaign (47 total if all campaigns enabled): Shorter version of the campaign with randomized missions and optional branches.
 | |
|     Medium Grid (16):  A 4x4 grid of random missions.  Start at the top-left and forge a path towards bottom-right mission to win.
 | |
|     Mini Grid (9):  A 3x3 version of Grid.  Complete the bottom-right mission to win.
 | |
|     Blitz (12):  12 random missions that open up very quickly.  Complete the bottom-right mission to win.
 | |
|     Gauntlet (7): Linear series of 7 random missions to complete the campaign.
 | |
|     Mini Gauntlet (4): Linear series of 4 random missions to complete the campaign.
 | |
|     Tiny Grid (4): A 2x2 version of Grid.  Complete the bottom-right mission to win.
 | |
|     Grid (variable): A grid that will resize to use all non-excluded missions.  Corners may be omitted to make the grid more square.  Complete the bottom-right mission to win.
 | |
|     """
 | |
|     display_name = "Mission Order"
 | |
|     option_vanilla = 0
 | |
|     option_vanilla_shuffled = 1
 | |
|     option_mini_campaign = 2
 | |
|     option_medium_grid = 3
 | |
|     option_mini_grid = 4
 | |
|     option_blitz = 5
 | |
|     option_gauntlet = 6
 | |
|     option_mini_gauntlet = 7
 | |
|     option_tiny_grid = 8
 | |
|     option_grid = 9
 | |
| 
 | |
| 
 | |
| class MaximumCampaignSize(Range):
 | |
|     """
 | |
|     Sets an upper bound on how many missions to include when a variable-size mission order is selected.
 | |
|     If a set-size mission order is selected, does nothing.
 | |
|     """
 | |
|     display_name = "Maximum Campaign Size"
 | |
|     range_start = 1
 | |
|     range_end = 83
 | |
|     default = 83
 | |
| 
 | |
| 
 | |
| class GridTwoStartPositions(Toggle):
 | |
|     """
 | |
|     If turned on and 'grid' mission order is selected, removes a mission from the starting
 | |
|     corner sets the adjacent two missions as the starter missions.
 | |
|     """
 | |
|     display_name = "Start with two unlocked missions on grid"
 | |
|     default = Toggle.option_false
 | |
| 
 | |
| 
 | |
| class ColorChoice(Choice):
 | |
|     option_white = 0
 | |
|     option_red = 1
 | |
|     option_blue = 2
 | |
|     option_teal = 3
 | |
|     option_purple = 4
 | |
|     option_yellow = 5
 | |
|     option_orange = 6
 | |
|     option_green = 7
 | |
|     option_light_pink = 8
 | |
|     option_violet = 9
 | |
|     option_light_grey = 10
 | |
|     option_dark_green = 11
 | |
|     option_brown = 12
 | |
|     option_light_green = 13
 | |
|     option_dark_grey = 14
 | |
|     option_pink = 15
 | |
|     option_rainbow = 16
 | |
|     option_default = 17
 | |
|     default = option_default
 | |
| 
 | |
| 
 | |
| class PlayerColorTerranRaynor(ColorChoice):
 | |
|     """Determines in-game team color for playable Raynor's Raiders (Terran) factions."""
 | |
|     display_name = "Terran Player Color (Raynor)"
 | |
| 
 | |
| 
 | |
| class PlayerColorProtoss(ColorChoice):
 | |
|     """Determines in-game team color for playable Protoss factions."""
 | |
|     display_name = "Protoss Player Color"
 | |
| 
 | |
| 
 | |
| class PlayerColorZerg(ColorChoice):
 | |
|     """Determines in-game team color for playable Zerg factions before Kerrigan becomes Primal Kerrigan."""
 | |
|     display_name = "Zerg Player Color"
 | |
| 
 | |
| 
 | |
| class PlayerColorZergPrimal(ColorChoice):
 | |
|     """Determines in-game team color for playable Zerg factions after Kerrigan becomes Primal Kerrigan."""
 | |
|     display_name = "Zerg Player Color (Primal)"
 | |
| 
 | |
| 
 | |
| class EnableWolMissions(DefaultOnToggle):
 | |
|     """
 | |
|     Enables missions from main Wings of Liberty campaign.
 | |
|     """
 | |
|     display_name = "Enable Wings of Liberty missions"
 | |
| 
 | |
| 
 | |
| class EnableProphecyMissions(DefaultOnToggle):
 | |
|     """
 | |
|     Enables missions from Prophecy mini-campaign.
 | |
|     """
 | |
|     display_name = "Enable Prophecy missions"
 | |
| 
 | |
| 
 | |
| class EnableHotsMissions(DefaultOnToggle):
 | |
|     """
 | |
|     Enables missions from Heart of the Swarm campaign.
 | |
|     """
 | |
|     display_name = "Enable Heart of the Swarm missions"
 | |
| 
 | |
| 
 | |
| class EnableLotVPrologueMissions(DefaultOnToggle):
 | |
|     """
 | |
|     Enables missions from Prologue campaign.
 | |
|     """
 | |
|     display_name = "Enable Prologue (Legacy of the Void) missions"
 | |
| 
 | |
| 
 | |
| class EnableLotVMissions(DefaultOnToggle):
 | |
|     """
 | |
|     Enables missions from Legacy of the Void campaign.
 | |
|     """
 | |
|     display_name = "Enable Legacy of the Void (main campaign) missions"
 | |
| 
 | |
| 
 | |
| class EnableEpilogueMissions(DefaultOnToggle):
 | |
|     """
 | |
|     Enables missions from Epilogue campaign.
 | |
|     These missions are considered very hard.
 | |
| 
 | |
|     Enabling Wings of Liberty, Heart of the Swarm and Legacy of the Void is strongly recommended in order to play Epilogue.
 | |
|     Not recommended for short mission orders.
 | |
|     See also: Exclude Very Hard Missions
 | |
|     """
 | |
|     display_name = "Enable Epilogue missions"
 | |
| 
 | |
| 
 | |
| class EnableNCOMissions(DefaultOnToggle):
 | |
|     """
 | |
|     Enables missions from Nova Covert Ops campaign.
 | |
| 
 | |
|     Note: For best gameplay experience it's recommended to also enable Wings of Liberty campaign.
 | |
|     """
 | |
|     display_name = "Enable Nova Covert Ops missions"
 | |
| 
 | |
| 
 | |
| class ShuffleCampaigns(DefaultOnToggle):
 | |
|     """
 | |
|     Shuffles the missions between campaigns if enabled.
 | |
|     Only available for Vanilla Shuffled and Mini Campaign mission order
 | |
|     """
 | |
|     display_name = "Shuffle Campaigns"
 | |
| 
 | |
| 
 | |
| class ShuffleNoBuild(DefaultOnToggle):
 | |
|     """
 | |
|     Determines if the no-build missions are included in the shuffle.
 | |
|     If turned off, the no-build missions will not appear. Has no effect for Vanilla mission order.
 | |
|     """
 | |
|     display_name = "Shuffle No-Build Missions"
 | |
| 
 | |
| 
 | |
| class StarterUnit(Choice):
 | |
|     """
 | |
|     Unlocks a random unit at the start of the game.
 | |
| 
 | |
|     Off: No units are provided, the first unit must be obtained from the randomizer
 | |
|     Balanced: A unit that doesn't give the player too much power early on is given
 | |
|     Any Starter Unit: Any starter unit can be given
 | |
|     """
 | |
|     display_name = "Starter Unit"
 | |
|     option_off = 0
 | |
|     option_balanced = 1
 | |
|     option_any_starter_unit = 2
 | |
| 
 | |
| 
 | |
| class RequiredTactics(Choice):
 | |
|     """
 | |
|     Determines the maximum tactical difficulty of the world (separate from mission difficulty).  Higher settings
 | |
|     increase randomness.
 | |
| 
 | |
|     Standard:  All missions can be completed with good micro and macro.
 | |
|     Advanced:  Completing missions may require relying on starting units and micro-heavy units.
 | |
|     No Logic:  Units and upgrades may be placed anywhere.  LIKELY TO RENDER THE RUN IMPOSSIBLE ON HARDER DIFFICULTIES!
 | |
|                Locks Grant Story Tech option to true.
 | |
|     """
 | |
|     display_name = "Required Tactics"
 | |
|     option_standard = 0
 | |
|     option_advanced = 1
 | |
|     option_no_logic = 2
 | |
| 
 | |
| 
 | |
| class GenericUpgradeMissions(Range):
 | |
|     """Determines the percentage of missions in the mission order that must be completed before
 | |
|     level 1 of all weapon and armor upgrades is unlocked.  Level 2 upgrades require double the amount of missions,
 | |
|     and level 3 requires triple the amount.  The required amounts are always rounded down.
 | |
|     If set to 0, upgrades are instead added to the item pool and must be found to be used."""
 | |
|     display_name = "Generic Upgrade Missions"
 | |
|     range_start = 0
 | |
|     range_end = 100
 | |
|     default = 0
 | |
| 
 | |
| 
 | |
| class GenericUpgradeResearch(Choice):
 | |
|     """Determines how weapon and armor upgrades affect missions once unlocked.
 | |
| 
 | |
|     Vanilla:  Upgrades must be researched as normal.
 | |
|     Auto In No-Build:  In No-Build missions, upgrades are automatically researched.
 | |
|     In all other missions, upgrades must be researched as normal.
 | |
|     Auto In Build:  In No-Build missions, upgrades are unavailable as normal.
 | |
|     In all other missions, upgrades are automatically researched.
 | |
|     Always Auto:  Upgrades are automatically researched in all missions."""
 | |
|     display_name = "Generic Upgrade Research"
 | |
|     option_vanilla = 0
 | |
|     option_auto_in_no_build = 1
 | |
|     option_auto_in_build = 2
 | |
|     option_always_auto = 3
 | |
| 
 | |
| 
 | |
| class GenericUpgradeItems(Choice):
 | |
|     """Determines how weapon and armor upgrades are split into items.  All options produce 3 levels of each item.
 | |
|     Does nothing if upgrades are unlocked by completed mission counts.
 | |
| 
 | |
|     Individual Items:  All weapon and armor upgrades are each an item,
 | |
|     resulting in 18 total upgrade items for Terran and 15 total items for Zerg and Protoss each.
 | |
|     Bundle Weapon And Armor:  All types of weapon upgrades are one item per race,
 | |
|     and all types of armor upgrades are one item per race,
 | |
|     resulting in 18 total items.
 | |
|     Bundle Unit Class:  Weapon and armor upgrades are merged,
 | |
|     but upgrades are bundled separately for each race:
 | |
|     Infantry, Vehicle, and Starship upgrades for Terran (9 items),
 | |
|     Ground and Flyer upgrades for Zerg (6 items),
 | |
|     Ground and Air upgrades for Protoss (6 items),
 | |
|     resulting in 21 total items.
 | |
|     Bundle All:  All weapon and armor upgrades are one item per race,
 | |
|     resulting in 9 total items."""
 | |
|     display_name = "Generic Upgrade Items"
 | |
|     option_individual_items = 0
 | |
|     option_bundle_weapon_and_armor = 1
 | |
|     option_bundle_unit_class = 2
 | |
|     option_bundle_all = 3
 | |
| 
 | |
| 
 | |
| class NovaCovertOpsItems(Toggle):
 | |
|     """
 | |
|     If turned on, the equipment upgrades from Nova Covert Ops may be present in the world.
 | |
| 
 | |
|     If Nova Covert Ops campaign is enabled, this option is locked to be turned on.
 | |
|     """
 | |
|     display_name = "Nova Covert Ops Items"
 | |
|     default = Toggle.option_true
 | |
| 
 | |
| 
 | |
| class BroodWarItems(Toggle):
 | |
|     """If turned on, returning items from StarCraft: Brood War may appear in the world."""
 | |
|     display_name = "Brood War Items"
 | |
|     default = Toggle.option_true
 | |
| 
 | |
| 
 | |
| class ExtendedItems(Toggle):
 | |
|     """If turned on, original items that did not appear in Campaign mode may appear in the world."""
 | |
|     display_name = "Extended Items"
 | |
|     default = Toggle.option_true
 | |
| 
 | |
| 
 | |
| # Current maximum number of upgrades for a unit
 | |
| MAX_UPGRADES_OPTION = 12
 | |
| 
 | |
| 
 | |
| class EnsureGenericItems(Range):
 | |
|     """
 | |
|     Specifies a minimum percentage of the generic item pool that will be present for the slot.
 | |
|     The generic item pool is the pool of all generically useful items after all exclusions.
 | |
|     Generically-useful items include: Worker upgrades, Building upgrades, economy upgrades,
 | |
|     Mercenaries, Kerrigan levels and abilities, and Spear of Adun abilities
 | |
|     Increasing this percentage will make units less common.
 | |
|     """
 | |
|     display_name = "Ensure Generic Items"
 | |
|     range_start = 0
 | |
|     range_end = 100
 | |
|     default = 25
 | |
| 
 | |
| 
 | |
| class MinNumberOfUpgrades(Range):
 | |
|     """
 | |
|     Set a minimum to the number of upgrades a unit/structure can have.
 | |
|     Note that most units have 4 or 6 upgrades.
 | |
|     If a unit has fewer upgrades than the minimum, it will have all of its upgrades.
 | |
| 
 | |
|     Doesn't affect shared unit upgrades.
 | |
|     """
 | |
|     display_name = "Minimum number of upgrades per unit/structure"
 | |
|     range_start = 0
 | |
|     range_end = MAX_UPGRADES_OPTION
 | |
|     default = 2
 | |
| 
 | |
| 
 | |
| class MaxNumberOfUpgrades(Range):
 | |
|     """
 | |
|     Set a maximum to the number of upgrades a unit/structure can have. -1 is used to define unlimited.
 | |
|     Note that most unit have 4 to 6 upgrades.
 | |
| 
 | |
|     Doesn't affect shared unit upgrades.
 | |
|     """
 | |
|     display_name = "Maximum number of upgrades per unit/structure"
 | |
|     range_start = -1
 | |
|     range_end = MAX_UPGRADES_OPTION
 | |
|     default = -1
 | |
| 
 | |
| 
 | |
| class KerriganPresence(Choice):
 | |
|     """
 | |
|     Determines whether Kerrigan is playable outside of missions that require her.
 | |
| 
 | |
|     Vanilla: Kerrigan is playable as normal, appears in the same missions as in vanilla game.
 | |
|     Not Present:  Kerrigan is not playable, unless the mission requires her to be present.  Other hero units stay playable,
 | |
|         and locations normally requiring Kerrigan can be checked by any unit.
 | |
|         Kerrigan level items, active abilities and passive abilities affecting her will not appear.
 | |
|         In missions where the Kerrigan unit is required, story abilities are given in same way as Grant Story Tech is set to true
 | |
|     Not Present And No Passives:  In addition to the above, Kerrigan's passive abilities affecting other units (such as Twin Drones) will not appear.
 | |
| 
 | |
|     Note: Always set to "Not Present" if Heart of the Swarm campaign is disabled.
 | |
|     """
 | |
|     display_name = "Kerrigan Presence"
 | |
|     option_vanilla = 0
 | |
|     option_not_present = 1
 | |
|     option_not_present_and_no_passives = 2
 | |
| 
 | |
| 
 | |
| class KerriganLevelsPerMissionCompleted(Range):
 | |
|     """
 | |
|     Determines how many levels Kerrigan gains when a mission is beaten.
 | |
| 
 | |
|     NOTE: Setting this too low can result in generation failures if The Infinite Cycle or Supreme are in the mission pool.
 | |
|     """
 | |
|     display_name = "Levels Per Mission Beaten"
 | |
|     range_start = 0
 | |
|     range_end = 20
 | |
|     default = 0
 | |
| 
 | |
| 
 | |
| class KerriganLevelsPerMissionCompletedCap(Range):
 | |
|     """
 | |
|     Limits how many total levels Kerrigan can gain from beating missions.  This does not affect levels gained from items.  
 | |
|     Set to -1 to disable this limit.
 | |
| 
 | |
|     NOTE: The following missions have these level requirements:
 | |
|     Supreme: 35
 | |
|     The Infinite Cycle: 70
 | |
|     See Grant Story Levels for more details.
 | |
|     """
 | |
|     display_name = "Levels Per Mission Beaten Cap"
 | |
|     range_start = -1
 | |
|     range_end = 140
 | |
|     default = -1
 | |
| 
 | |
| 
 | |
| class KerriganLevelItemSum(Range):
 | |
|     """
 | |
|     Determines the sum of the level items in the world.  This does not affect levels gained from beating missions.
 | |
| 
 | |
|     NOTE: The following missions have these level requirements:
 | |
|     Supreme: 35
 | |
|     The Infinite Cycle: 70
 | |
|     See Grant Story Levels for more details.
 | |
|     """
 | |
|     display_name = "Kerrigan Level Item Sum"
 | |
|     range_start = 0
 | |
|     range_end = 140
 | |
|     default = 70
 | |
| 
 | |
| 
 | |
| class KerriganLevelItemDistribution(Choice):
 | |
|     """Determines the amount and size of Kerrigan level items.
 | |
| 
 | |
|     Vanilla:  Uses the distribution in the vanilla campaign.
 | |
|     This entails 32 individual levels and 6 packs of varying sizes.
 | |
|     This distribution always adds up to 70, ignoring the Level Item Sum setting.
 | |
|     Smooth:  Uses a custom, condensed distribution of 10 items between sizes 4 and 10,
 | |
|     intended to fit more levels into settings with little room for filler while keeping some variance in level gains.
 | |
|     This distribution always adds up to 70, ignoring the Level Item Sum setting.
 | |
|     Size 70:  Uses items worth 70 levels each.
 | |
|     Size 35:  Uses items worth 35 levels each.
 | |
|     Size 14:  Uses items worth 14 levels each.
 | |
|     Size 10:  Uses items worth 10 levels each.
 | |
|     Size 7:  Uses items worth 7 levels each.
 | |
|     Size 5:  Uses items worth 5 levels each.
 | |
|     Size 2:  Uses items worth 2 level eachs.
 | |
|     Size 1:  Uses individual levels.  As there are not enough locations in the game for this distribution,
 | |
|     this will result in a greatly reduced total level, and is likely to remove many other items."""
 | |
|     display_name = "Kerrigan Level Item Distribution"
 | |
|     option_vanilla = 0
 | |
|     option_smooth = 1
 | |
|     option_size_70 = 2
 | |
|     option_size_35 = 3
 | |
|     option_size_14 = 4
 | |
|     option_size_10 = 5
 | |
|     option_size_7 = 6
 | |
|     option_size_5 = 7
 | |
|     option_size_2 = 8
 | |
|     option_size_1 = 9
 | |
|     default = option_smooth
 | |
| 
 | |
| 
 | |
| class KerriganTotalLevelCap(Range):
 | |
|     """
 | |
|     Limits how many total levels Kerrigan can gain from any source.  Depending on your other settings,
 | |
|     there may be more levels available in the world, but they will not affect Kerrigan.  
 | |
|     Set to -1 to disable this limit.
 | |
| 
 | |
|     NOTE: The following missions have these level requirements:
 | |
|     Supreme: 35
 | |
|     The Infinite Cycle: 70
 | |
|     See Grant Story Levels for more details.
 | |
|     """
 | |
|     display_name = "Total Level Cap"
 | |
|     range_start = -1
 | |
|     range_end = 140
 | |
|     default = -1
 | |
| 
 | |
| 
 | |
| class StartPrimaryAbilities(Range):
 | |
|     """Number of Primary Abilities (Kerrigan Tier 1, 2, and 4) to start the game with.
 | |
|     If set to 4, a Tier 7 ability is also included."""
 | |
|     display_name = "Starting Primary Abilities"
 | |
|     range_start = 0
 | |
|     range_end = 4
 | |
|     default = 0
 | |
| 
 | |
| 
 | |
| class KerriganPrimalStatus(Choice):
 | |
|     """Determines when Kerrigan appears in her Primal Zerg form.
 | |
|     This greatly increases her energy regeneration.
 | |
| 
 | |
|     Vanilla:  Kerrigan is human in missions that canonically appear before The Crucible,
 | |
|     and zerg thereafter.
 | |
|     Always Zerg:  Kerrigan is always zerg.
 | |
|     Always Human:  Kerrigan is always human.
 | |
|     Level 35:  Kerrigan is human until reaching level 35, and zerg thereafter.
 | |
|     Half Completion:  Kerrigan is human until half of the missions in the world are completed,
 | |
|     and zerg thereafter.
 | |
|     Item:  Kerrigan's Primal Form is an item. She is human until it is found, and zerg thereafter."""
 | |
|     display_name = "Kerrigan Primal Status"
 | |
|     option_vanilla = 0
 | |
|     option_always_zerg = 1
 | |
|     option_always_human = 2
 | |
|     option_level_35 = 3
 | |
|     option_half_completion = 4
 | |
|     option_item = 5
 | |
| 
 | |
| 
 | |
| class SpearOfAdunPresence(Choice):
 | |
|     """
 | |
|     Determines in which missions Spear of Adun calldowns will be available.
 | |
|     Affects only abilities used from Spear of Adun top menu.
 | |
| 
 | |
|     Not Present: Spear of Adun calldowns are unavailable.
 | |
|     LotV Protoss: Spear of Adun calldowns are only available in LotV main campaign
 | |
|     Protoss: Spear od Adun calldowns are available in any Protoss mission
 | |
|     Everywhere: Spear od Adun calldowns are available in any mission of any race
 | |
|     """
 | |
|     display_name = "Spear of Adun Presence"
 | |
|     option_not_present = 0
 | |
|     option_lotv_protoss = 1
 | |
|     option_protoss = 2
 | |
|     option_everywhere = 3
 | |
|     default = option_lotv_protoss
 | |
| 
 | |
|     # Fix case
 | |
|     @classmethod
 | |
|     def get_option_name(cls, value: int) -> str:
 | |
|         if value == SpearOfAdunPresence.option_lotv_protoss:
 | |
|             return "LotV Protoss"
 | |
|         else:
 | |
|             return super().get_option_name(value)
 | |
| 
 | |
| 
 | |
| class SpearOfAdunPresentInNoBuild(Toggle):
 | |
|     """
 | |
|     Determines if Spear of Adun calldowns are available in no-build missions.
 | |
| 
 | |
|     If turned on, Spear of Adun calldown powers are available in missions specified under "Spear of Adun Presence".
 | |
|     If turned off, Spear of Adun calldown powers are unavailable in all no-build missions
 | |
|     """
 | |
|     display_name = "Spear of Adun Present in No-Build"
 | |
| 
 | |
| 
 | |
| class SpearOfAdunAutonomouslyCastAbilityPresence(Choice):
 | |
|     """
 | |
|     Determines availability of Spear of Adun powers, that are autonomously cast.
 | |
|     Affects abilities like Reconstruction Beam or Overwatch
 | |
| 
 | |
|     Not Presents: Autocasts are not available.
 | |
|     LotV Protoss: Spear of Adun autocasts are only available in LotV main campaign
 | |
|     Protoss: Spear od Adun autocasts are available in any Protoss mission
 | |
|     Everywhere: Spear od Adun autocasts are available in any mission of any race
 | |
|     """
 | |
|     display_name = "Spear of Adun Autonomously Cast Powers Presence"
 | |
|     option_not_present = 0
 | |
|     option_lotv_protoss = 1
 | |
|     option_protoss = 2
 | |
|     option_everywhere = 3
 | |
|     default = option_lotv_protoss
 | |
| 
 | |
|     # Fix case
 | |
|     @classmethod
 | |
|     def get_option_name(cls, value: int) -> str:
 | |
|         if value == SpearOfAdunPresence.option_lotv_protoss:
 | |
|             return "LotV Protoss"
 | |
|         else:
 | |
|             return super().get_option_name(value)
 | |
| 
 | |
| 
 | |
| class SpearOfAdunAutonomouslyCastPresentInNoBuild(Toggle):
 | |
|     """
 | |
|     Determines if Spear of Adun autocasts are available in no-build missions.
 | |
| 
 | |
|     If turned on, Spear of Adun autocasts are available in missions specified under "Spear of Adun Autonomously Cast Powers Presence".
 | |
|     If turned off, Spear of Adun autocasts are unavailable in all no-build missions
 | |
|     """
 | |
|     display_name = "Spear of Adun Autonomously Cast Powers Present in No-Build"
 | |
| 
 | |
| 
 | |
| class GrantStoryTech(Toggle):
 | |
|     """
 | |
|     If set true, grants special tech required for story mission completion for duration of the mission.
 | |
|     Otherwise, you need to find these tech by a normal means as items.
 | |
|     Affects story missions like Back in the Saddle and Supreme
 | |
| 
 | |
|     Locked to true if Required Tactics is set to no logic.
 | |
|     """
 | |
|     display_name = "Grant Story Tech"
 | |
| 
 | |
| 
 | |
| class GrantStoryLevels(Choice):
 | |
|     """
 | |
|     If enabled, grants Kerrigan the required minimum levels for the following missions:
 | |
|     Supreme: 35
 | |
|     The Infinite Cycle: 70
 | |
|     The bonus levels only apply during the listed missions, and can exceed the Total Level Cap.
 | |
| 
 | |
|     If disabled, either of these missions is included, and there are not enough levels in the world, generation may fail.  
 | |
|     To prevent this, either increase the amount of levels in the world, or enable this option.
 | |
| 
 | |
|     If disabled and Required Tactics is set to no logic, this option is forced to Minimum.
 | |
| 
 | |
|     Disabled: Kerrigan does not get bonus levels for these missions,
 | |
|               instead the levels must be gained from items or beating missions.
 | |
|     Additive: Kerrigan gains bonus levels equal to the mission's required level.
 | |
|     Minimum: Kerrigan is either at her real level, or at the mission's required level,
 | |
|              depending on which is higher.
 | |
|     """
 | |
|     display_name = "Grant Story Levels"
 | |
|     option_disabled = 0
 | |
|     option_additive = 1
 | |
|     option_minimum = 2
 | |
|     default = option_minimum
 | |
| 
 | |
| 
 | |
| class TakeOverAIAllies(Toggle):
 | |
|     """
 | |
|     On maps supporting this feature allows you to take control over an AI Ally.
 | |
|     """
 | |
|     display_name = "Take Over AI Allies"
 | |
| 
 | |
| 
 | |
| class LockedItems(ItemSet):
 | |
|     """Guarantees that these items will be unlockable"""
 | |
|     display_name = "Locked Items"
 | |
| 
 | |
| 
 | |
| class ExcludedItems(ItemSet):
 | |
|     """Guarantees that these items will not be unlockable"""
 | |
|     display_name = "Excluded Items"
 | |
| 
 | |
| 
 | |
| class ExcludedMissions(OptionSet):
 | |
|     """Guarantees that these missions will not appear in the campaign
 | |
|     Doesn't apply to vanilla mission order.
 | |
|     It may be impossible to build a valid campaign if too many missions are excluded."""
 | |
|     display_name = "Excluded Missions"
 | |
|     valid_keys = {mission.mission_name for mission in SC2Mission}
 | |
| 
 | |
| 
 | |
| class ExcludeVeryHardMissions(Choice):
 | |
|     """
 | |
|     Excludes Very Hard missions outside of Epilogue campaign (All-In, Salvation, and all Epilogue missions are considered Very Hard).
 | |
|     Doesn't apply to "Vanilla" mission order.
 | |
| 
 | |
|     Default: Not excluded for mission orders "Vanilla Shuffled" or "Grid" with Maximum Campaign Size >= 20,
 | |
|              excluded for any other order
 | |
|     Yes: Non-Epilogue Very Hard missions are excluded and won't be generated
 | |
|     No: Non-Epilogue Very Hard missions can appear normally. Not recommended for too short mission orders.
 | |
| 
 | |
|     See also: Excluded Missions, Enable Epilogue Missions, Maximum Campaign Size
 | |
|     """
 | |
|     display_name = "Exclude Very Hard Missions"
 | |
|     option_default = 0
 | |
|     option_true = 1
 | |
|     option_false = 2
 | |
| 
 | |
|     @classmethod
 | |
|     def get_option_name(cls, value):
 | |
|         return ["Default", "Yes", "No"][int(value)]
 | |
| 
 | |
| 
 | |
| class LocationInclusion(Choice):
 | |
|     option_enabled = 0
 | |
|     option_resources = 1
 | |
|     option_disabled = 2
 | |
| 
 | |
| 
 | |
| class VanillaLocations(LocationInclusion):
 | |
|     """
 | |
|     Enables or disables item rewards for completing vanilla objectives.
 | |
|     Vanilla objectives are bonus objectives from the vanilla game,
 | |
|     along with some additional objectives to balance the missions.
 | |
|     Enable these locations for a balanced experience.
 | |
| 
 | |
|     Enabled: All locations fitting into this do their normal rewards
 | |
|     Resources: Forces these locations to contain Starting Resources
 | |
|     Disabled: Removes item rewards from these locations.
 | |
| 
 | |
|     Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
 | |
|     See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
 | |
|     """
 | |
|     display_name = "Vanilla Locations"
 | |
| 
 | |
| 
 | |
| class ExtraLocations(LocationInclusion):
 | |
|     """
 | |
|     Enables or disables item rewards for mission progress and minor objectives.
 | |
|     This includes mandatory mission objectives,
 | |
|     collecting reinforcements and resource pickups,
 | |
|     destroying structures, and overcoming minor challenges.
 | |
|     Enables these locations to add more checks and items to your world.
 | |
| 
 | |
|     Enabled: All locations fitting into this do their normal rewards
 | |
|     Resources: Forces these locations to contain Starting Resources
 | |
|     Disabled: Removes item rewards from these locations.
 | |
| 
 | |
|     Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
 | |
|     See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
 | |
|     """
 | |
|     display_name = "Extra Locations"
 | |
| 
 | |
| 
 | |
| class ChallengeLocations(LocationInclusion):
 | |
|     """
 | |
|     Enables or disables item rewards for completing challenge tasks.
 | |
|     Challenges are tasks that are more difficult than completing the mission, and are often based on achievements.
 | |
|     You might be required to visit the same mission later after getting stronger in order to finish these tasks.
 | |
|     Enable these locations to increase the difficulty of completing the multiworld.
 | |
| 
 | |
|     Enabled: All locations fitting into this do their normal rewards
 | |
|     Resources: Forces these locations to contain Starting Resources
 | |
|     Disabled: Removes item rewards from these locations.
 | |
| 
 | |
|     Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
 | |
|     See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
 | |
|     """
 | |
|     display_name = "Challenge Locations"
 | |
| 
 | |
| 
 | |
| class MasteryLocations(LocationInclusion):
 | |
|     """
 | |
|     Enables or disables item rewards for overcoming especially difficult challenges.
 | |
|     These challenges are often based on Mastery achievements and Feats of Strength.
 | |
|     Enable these locations to add the most difficult checks to the world.
 | |
| 
 | |
|     Enabled: All locations fitting into this do their normal rewards
 | |
|     Resources: Forces these locations to contain Starting Resources
 | |
|     Disabled: Removes item rewards from these locations.
 | |
| 
 | |
|     Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
 | |
|     See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
 | |
|     """
 | |
|     display_name = "Mastery Locations"
 | |
| 
 | |
| 
 | |
| class MineralsPerItem(Range):
 | |
|     """
 | |
|     Configures how many minerals are given per resource item.
 | |
|     """
 | |
|     display_name = "Minerals Per Item"
 | |
|     range_start = 0
 | |
|     range_end = 500
 | |
|     default = 25
 | |
| 
 | |
| 
 | |
| class VespenePerItem(Range):
 | |
|     """
 | |
|     Configures how much vespene gas is given per resource item.
 | |
|     """
 | |
|     display_name = "Vespene Per Item"
 | |
|     range_start = 0
 | |
|     range_end = 500
 | |
|     default = 25
 | |
| 
 | |
| 
 | |
| class StartingSupplyPerItem(Range):
 | |
|     """
 | |
|     Configures how much starting supply per is given per item.
 | |
|     """
 | |
|     display_name = "Starting Supply Per Item"
 | |
|     range_start = 0
 | |
|     range_end = 200
 | |
|     default = 5
 | |
| 
 | |
| 
 | |
| @dataclass
 | |
| class Starcraft2Options(PerGameCommonOptions):
 | |
|     game_difficulty: GameDifficulty
 | |
|     game_speed: GameSpeed
 | |
|     disable_forced_camera: DisableForcedCamera
 | |
|     skip_cutscenes: SkipCutscenes
 | |
|     all_in_map: AllInMap
 | |
|     mission_order: MissionOrder
 | |
|     maximum_campaign_size: MaximumCampaignSize
 | |
|     grid_two_start_positions: GridTwoStartPositions
 | |
|     player_color_terran_raynor: PlayerColorTerranRaynor
 | |
|     player_color_protoss: PlayerColorProtoss
 | |
|     player_color_zerg: PlayerColorZerg
 | |
|     player_color_zerg_primal: PlayerColorZergPrimal
 | |
|     enable_wol_missions: EnableWolMissions
 | |
|     enable_prophecy_missions: EnableProphecyMissions
 | |
|     enable_hots_missions: EnableHotsMissions
 | |
|     enable_lotv_prologue_missions: EnableLotVPrologueMissions
 | |
|     enable_lotv_missions: EnableLotVMissions
 | |
|     enable_epilogue_missions: EnableEpilogueMissions
 | |
|     enable_nco_missions: EnableNCOMissions
 | |
|     shuffle_campaigns: ShuffleCampaigns
 | |
|     shuffle_no_build: ShuffleNoBuild
 | |
|     starter_unit: StarterUnit
 | |
|     required_tactics: RequiredTactics
 | |
|     ensure_generic_items: EnsureGenericItems
 | |
|     min_number_of_upgrades: MinNumberOfUpgrades
 | |
|     max_number_of_upgrades: MaxNumberOfUpgrades
 | |
|     generic_upgrade_missions: GenericUpgradeMissions
 | |
|     generic_upgrade_research: GenericUpgradeResearch
 | |
|     generic_upgrade_items: GenericUpgradeItems
 | |
|     kerrigan_presence: KerriganPresence
 | |
|     kerrigan_levels_per_mission_completed: KerriganLevelsPerMissionCompleted
 | |
|     kerrigan_levels_per_mission_completed_cap: KerriganLevelsPerMissionCompletedCap
 | |
|     kerrigan_level_item_sum: KerriganLevelItemSum
 | |
|     kerrigan_level_item_distribution: KerriganLevelItemDistribution
 | |
|     kerrigan_total_level_cap: KerriganTotalLevelCap
 | |
|     start_primary_abilities: StartPrimaryAbilities
 | |
|     kerrigan_primal_status: KerriganPrimalStatus
 | |
|     spear_of_adun_presence: SpearOfAdunPresence
 | |
|     spear_of_adun_present_in_no_build: SpearOfAdunPresentInNoBuild
 | |
|     spear_of_adun_autonomously_cast_ability_presence: SpearOfAdunAutonomouslyCastAbilityPresence
 | |
|     spear_of_adun_autonomously_cast_present_in_no_build: SpearOfAdunAutonomouslyCastPresentInNoBuild
 | |
|     grant_story_tech: GrantStoryTech
 | |
|     grant_story_levels: GrantStoryLevels
 | |
|     take_over_ai_allies: TakeOverAIAllies
 | |
|     locked_items: LockedItems
 | |
|     excluded_items: ExcludedItems
 | |
|     excluded_missions: ExcludedMissions
 | |
|     exclude_very_hard_missions: ExcludeVeryHardMissions
 | |
|     nco_items: NovaCovertOpsItems
 | |
|     bw_items: BroodWarItems
 | |
|     ext_items: ExtendedItems
 | |
|     vanilla_locations: VanillaLocations
 | |
|     extra_locations: ExtraLocations
 | |
|     challenge_locations: ChallengeLocations
 | |
|     mastery_locations: MasteryLocations
 | |
|     minerals_per_item: MineralsPerItem
 | |
|     vespene_per_item: VespenePerItem
 | |
|     starting_supply_per_item: StartingSupplyPerItem
 | |
| 
 | |
| 
 | |
| def get_option_value(world: World, name: str) -> Union[int,  FrozenSet]:
 | |
|     if world is None:
 | |
|         field: Field = [class_field for class_field in fields(Starcraft2Options) if class_field.name == name][0]
 | |
|         return field.type.default
 | |
| 
 | |
|     player_option = getattr(world.options, name)
 | |
| 
 | |
|     return player_option.value
 | |
| 
 | |
| 
 | |
| def get_enabled_campaigns(world: World) -> Set[SC2Campaign]:
 | |
|     enabled_campaigns = set()
 | |
|     if get_option_value(world, "enable_wol_missions"):
 | |
|         enabled_campaigns.add(SC2Campaign.WOL)
 | |
|     if get_option_value(world, "enable_prophecy_missions"):
 | |
|         enabled_campaigns.add(SC2Campaign.PROPHECY)
 | |
|     if get_option_value(world, "enable_hots_missions"):
 | |
|         enabled_campaigns.add(SC2Campaign.HOTS)
 | |
|     if get_option_value(world, "enable_lotv_prologue_missions"):
 | |
|         enabled_campaigns.add(SC2Campaign.PROLOGUE)
 | |
|     if get_option_value(world, "enable_lotv_missions"):
 | |
|         enabled_campaigns.add(SC2Campaign.LOTV)
 | |
|     if get_option_value(world, "enable_epilogue_missions"):
 | |
|         enabled_campaigns.add(SC2Campaign.EPILOGUE)
 | |
|     if get_option_value(world, "enable_nco_missions"):
 | |
|         enabled_campaigns.add(SC2Campaign.NCO)
 | |
|     return enabled_campaigns
 | |
| 
 | |
| 
 | |
| def get_disabled_campaigns(world: World) -> Set[SC2Campaign]:
 | |
|     all_campaigns = set(SC2Campaign)
 | |
|     enabled_campaigns = get_enabled_campaigns(world)
 | |
|     disabled_campaigns = all_campaigns.difference(enabled_campaigns)
 | |
|     disabled_campaigns.remove(SC2Campaign.GLOBAL)
 | |
|     return disabled_campaigns
 | |
| 
 | |
| 
 | |
| def get_excluded_missions(world: World) -> Set[SC2Mission]:
 | |
|     mission_order_type = get_option_value(world, "mission_order")
 | |
|     excluded_mission_names = get_option_value(world, "excluded_missions")
 | |
|     shuffle_no_build = get_option_value(world, "shuffle_no_build")
 | |
|     disabled_campaigns = get_disabled_campaigns(world)
 | |
| 
 | |
|     excluded_missions: Set[SC2Mission] = set([lookup_name_to_mission[name] for name in excluded_mission_names])
 | |
| 
 | |
|     # Excluding Very Hard missions depending on options
 | |
|     if (get_option_value(world, "exclude_very_hard_missions") == ExcludeVeryHardMissions.option_true
 | |
|         ) or (
 | |
|             get_option_value(world, "exclude_very_hard_missions") == ExcludeVeryHardMissions.option_default
 | |
|             and (
 | |
|                     mission_order_type not in [MissionOrder.option_vanilla_shuffled, MissionOrder.option_grid]
 | |
|                     or (
 | |
|                             mission_order_type == MissionOrder.option_grid
 | |
|                             and get_option_value(world, "maximum_campaign_size") < 20
 | |
|                     )
 | |
|             )
 | |
|     ):
 | |
|         excluded_missions = excluded_missions.union(
 | |
|             [mission for mission in SC2Mission if
 | |
|              mission.pool == MissionPools.VERY_HARD and mission.campaign != SC2Campaign.EPILOGUE]
 | |
|         )
 | |
|     # Omitting No-Build missions if not shuffling no-build
 | |
|     if not shuffle_no_build:
 | |
|         excluded_missions = excluded_missions.union(get_no_build_missions())
 | |
|     # Omitting missions not in enabled campaigns
 | |
|     for campaign in disabled_campaigns:
 | |
|         excluded_missions = excluded_missions.union(campaign_mission_table[campaign])
 | |
| 
 | |
|     return excluded_missions
 | |
| 
 | |
| 
 | |
| campaign_depending_orders = [
 | |
|     MissionOrder.option_vanilla,
 | |
|     MissionOrder.option_vanilla_shuffled,
 | |
|     MissionOrder.option_mini_campaign
 | |
| ]
 | |
| 
 | |
| kerrigan_unit_available = [
 | |
|     KerriganPresence.option_vanilla,
 | |
| ] |