 e71ea94fe5
			
		
	
	e71ea94fe5
	
	
	
		
			
			* SC2: Fixed nondeterminism resulting from early unit placement * SC2: Renamed "world" arguments to "multiworld" * SC2: Fixed All-In Ground including anti-air in defense score, fixed error in beats_protoss_deathball * SC2: Fixed No Logic using logic on Beat events * SC2: Fixed /unfinished command failing when All-In available
		
			
				
	
	
		
			149 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from typing import Dict
 | |
| from BaseClasses import MultiWorld
 | |
| from Options import Choice, Option, Toggle, DefaultOnToggle, ItemSet, OptionSet, Range
 | |
| 
 | |
| 
 | |
| class GameDifficulty(Choice):
 | |
|     """The difficulty of the campaign, affects enemy AI, starting units, and game speed."""
 | |
|     display_name = "Game Difficulty"
 | |
|     option_casual = 0
 | |
|     option_normal = 1
 | |
|     option_hard = 2
 | |
|     option_brutal = 3
 | |
| 
 | |
| 
 | |
| class UpgradeBonus(Choice):
 | |
|     """Determines what lab upgrade to use, whether it is Ultra-Capacitors which boost attack speed with every weapon
 | |
|     upgrade or Vanadium Plating which boosts life with every armor upgrade."""
 | |
|     display_name = "Upgrade Bonus"
 | |
|     option_ultra_capacitors = 0
 | |
|     option_vanadium_plating = 1
 | |
| 
 | |
| 
 | |
| class BunkerUpgrade(Choice):
 | |
|     """Determines what bunker lab upgrade to use, whether it is Shrike Turret which outfits bunkers with an automated
 | |
|     turret or Fortified Bunker which boosts the life of bunkers."""
 | |
|     display_name = "Bunker Upgrade"
 | |
|     option_shrike_turret = 0
 | |
|     option_fortified_bunker = 1
 | |
| 
 | |
| 
 | |
| class AllInMap(Choice):
 | |
|     """Determines what version of All-In (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 (29): Keeps the standard mission order and branching from the WoL Campaign.
 | |
|     Vanilla Shuffled (29): Keeps same branching paths from the WoL Campaign but randomizes the order of missions within.
 | |
|     Mini Campaign (15): Shorter version of the campaign with randomized missions and optional branches.
 | |
|     Grid (16):  A 4x4 grid of random missions.  Start at the top-left and forge a path towards All-In.
 | |
|     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."""
 | |
|     display_name = "Mission Order"
 | |
|     option_vanilla = 0
 | |
|     option_vanilla_shuffled = 1
 | |
|     option_mini_campaign = 2
 | |
|     option_grid = 3
 | |
|     option_mini_grid = 4
 | |
|     option_blitz = 5
 | |
|     option_gauntlet = 6
 | |
| 
 | |
| 
 | |
| class ShuffleProtoss(DefaultOnToggle):
 | |
|     """Determines if the 3 protoss missions are included in the shuffle if Vanilla mission order is not enabled.
 | |
|     If turned off with Vanilla Shuffled, the 3 protoss missions will be in their normal position on the Prophecy chain
 | |
|        if not shuffled.
 | |
|     If turned off with reduced mission settings, the 3 protoss missions will not appear and Protoss units are removed
 | |
|         from the pool."""
 | |
|     display_name = "Shuffle Protoss Missions"
 | |
| 
 | |
| 
 | |
| class ShuffleNoBuild(DefaultOnToggle):
 | |
|     """Determines if the 5 no-build missions are included in the shuffle if Vanilla mission order is not enabled.
 | |
|     If turned off with Vanilla Shuffled, one no-build mission will be placed as the first mission and the rest will be
 | |
|         placed at the end of optional routes.
 | |
|     If turned off with reduced mission settings, the 5 no-build missions will not appear."""
 | |
|     display_name = "Shuffle No-Build Missions"
 | |
| 
 | |
| 
 | |
| class EarlyUnit(DefaultOnToggle):
 | |
|     """Guarantees that the first mission will contain a unit."""
 | |
|     display_name = "Early Unit"
 | |
| 
 | |
| 
 | |
| class RequiredTactics(Choice):
 | |
|     """Determines the maximum tactical difficulty of the seed (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!"""
 | |
|     display_name = "Required Tactics"
 | |
|     option_standard = 0
 | |
|     option_advanced = 1
 | |
|     option_no_logic = 2
 | |
| 
 | |
| 
 | |
| class UnitsAlwaysHaveUpgrades(DefaultOnToggle):
 | |
|     """If turned on, both upgrades will be present for each unit and structure in the seed.
 | |
|     This usually results in fewer units."""
 | |
|     display_name = "Units Always Have Upgrades"
 | |
| 
 | |
| 
 | |
| 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
 | |
|     Only applies on shortened mission orders.
 | |
|     It may be impossible to build a valid campaign if too many missions are excluded."""
 | |
|     display_name = "Excluded Missions"
 | |
| 
 | |
| 
 | |
| # noinspection PyTypeChecker
 | |
| sc2wol_options: Dict[str, Option] = {
 | |
|     "game_difficulty": GameDifficulty,
 | |
|     "upgrade_bonus": UpgradeBonus,
 | |
|     "bunker_upgrade": BunkerUpgrade,
 | |
|     "all_in_map": AllInMap,
 | |
|     "mission_order": MissionOrder,
 | |
|     "shuffle_protoss": ShuffleProtoss,
 | |
|     "shuffle_no_build": ShuffleNoBuild,
 | |
|     "early_unit": EarlyUnit,
 | |
|     "required_tactics": RequiredTactics,
 | |
|     "units_always_have_upgrades": UnitsAlwaysHaveUpgrades,
 | |
|     "locked_items": LockedItems,
 | |
|     "excluded_items": ExcludedItems,
 | |
|     "excluded_missions": ExcludedMissions
 | |
| }
 | |
| 
 | |
| 
 | |
| def get_option_value(multiworld: MultiWorld, player: int, name: str) -> int:
 | |
|     option = getattr(multiworld, name, None)
 | |
| 
 | |
|     if option is None:
 | |
|         return 0
 | |
| 
 | |
|     return int(option[player].value)
 | |
| 
 | |
| 
 | |
| def get_option_set_value(multiworld: MultiWorld, player: int, name: str) -> set:
 | |
|     option = getattr(multiworld, name, None)
 | |
| 
 | |
|     if option is None:
 | |
|         return set()
 | |
| 
 | |
|     return option[player].value
 |