184 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			184 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from dataclasses import dataclass | ||
|  | from typing import Dict, Any | ||
|  | 
 | ||
|  | from Options import PerGameCommonOptions, DeathLink, StartInventoryPool, Choice, DefaultOnToggle, Range, Toggle, \ | ||
|  |     OptionGroup | ||
|  | 
 | ||
|  | 
 | ||
|  | class ExpandedPool(DefaultOnToggle): | ||
|  |     """
 | ||
|  |     Determines if places other than chests and special weapons will be locations. | ||
|  |     This includes boss fights as well as powering the tesla orb and completing the console login. | ||
|  |     In Expanded Pool, system power is instead restored when receiving the System Power item. | ||
|  |     Similarly, the final area door will open once the four Key items, one for each main area, have been found. | ||
|  |     """
 | ||
|  |     display_name = "Expanded Item Pool" | ||
|  | 
 | ||
|  | 
 | ||
|  | class InstantSaving(DefaultOnToggle): | ||
|  |     """
 | ||
|  |     When enabled, save points activate with no delay when touched. | ||
|  |     This makes saving much faster, at the cost of being unable to pick and choose when to save in order to save warp. | ||
|  |     """
 | ||
|  |     display_name = "Instant Saving" | ||
|  | 
 | ||
|  | 
 | ||
|  | class SprintAvailability(Choice): | ||
|  |     """
 | ||
|  |     Determines under which conditions the debug sprint is made accessible to the player. | ||
|  |     To sprint, hold down Ctrl if playing on keyboard, or Left Bumper if on gamepad (remappable). | ||
|  |     With Jacket: you will not be able to sprint until after the Jacket item has been found. | ||
|  |     """
 | ||
|  |     display_name = "Sprint Availability" | ||
|  |     option_never_available = 0 | ||
|  |     option_always_available = 1 | ||
|  |     option_available_with_jacket = 2 | ||
|  |     default = option_available_with_jacket | ||
|  | 
 | ||
|  | 
 | ||
|  | class CliffWeaponUpgrade(Choice): | ||
|  |     """
 | ||
|  |     Determines which weapon Cliff uses against you, base or upgraded. | ||
|  |     This does not change the available strategies all that much. | ||
|  |     Vanilla: Cliff adds fire to his grenades if Ace has been defeated. | ||
|  |     If playing with the expanded pool, the Arctic Key will trigger the change instead. | ||
|  |     """
 | ||
|  |     display_name = "Cliff Weapon Upgrade" | ||
|  |     option_never_upgraded = 0 | ||
|  |     option_always_upgraded = 1 | ||
|  |     option_vanilla = 2 | ||
|  |     default = option_always_upgraded | ||
|  | 
 | ||
|  | 
 | ||
|  | class AceWeaponUpgrade(Choice): | ||
|  |     """
 | ||
|  |     Determines which weapon Ace uses against you, base or upgraded. | ||
|  |     Ace with his base weapon is very hard to dodge, the upgraded weapon offers a more balanced experience. | ||
|  |     Vanilla: Ace uses ice attacks if Cliff has been defeated. | ||
|  |     If playing with the expanded pool, the Volcanic Key will trigger the change instead. | ||
|  |     """
 | ||
|  |     display_name = "Ace Weapon Upgrade" | ||
|  |     option_never_upgraded = 0 | ||
|  |     option_always_upgraded = 1 | ||
|  |     option_vanilla = 2 | ||
|  |     default = option_always_upgraded | ||
|  | 
 | ||
|  | 
 | ||
|  | class ScreenShakeIntensity(Range): | ||
|  |     """
 | ||
|  |     Percentage multiplier for screen shake effects. | ||
|  |     0% means the screen will not shake at all. | ||
|  |     100% means the screen shake will be the same as in vanilla. | ||
|  |     """
 | ||
|  |     display_name = "Screen Shake Intensity %" | ||
|  |     range_start = 0 | ||
|  |     range_end = 100 | ||
|  |     default = 50 | ||
|  | 
 | ||
|  | 
 | ||
|  | class IFramesDuration(Range): | ||
|  |     """
 | ||
|  |     Percentage multiplier for Portia's invincibility frames. | ||
|  |     0% means you will have no invincibility frames. | ||
|  |     100% means invincibility frames will be the same as vanilla. | ||
|  |     """
 | ||
|  |     display_name = "IFrame Duration %" | ||
|  |     range_start = 0 | ||
|  |     range_end = 400 | ||
|  |     default = 100 | ||
|  | 
 | ||
|  | 
 | ||
|  | class TrapChance(Range): | ||
|  |     """
 | ||
|  |     Likelihood of a filler item becoming a trap. | ||
|  |     """
 | ||
|  |     display_name = "Trap Chance" | ||
|  |     range_start = 0 | ||
|  |     range_end = 100 | ||
|  |     default = 50 | ||
|  | 
 | ||
|  | 
 | ||
|  | class MusicShuffle(Toggle): | ||
|  |     """
 | ||
|  |     Enables music shuffling. | ||
|  |     The title screen song is not shuffled, as it plays before the client connects. | ||
|  |     """
 | ||
|  |     display_name = "Music Shuffle" | ||
|  | 
 | ||
|  | 
 | ||
|  | @dataclass | ||
|  | class SavingPrincessOptions(PerGameCommonOptions): | ||
|  |     # generation options | ||
|  |     start_inventory_from_pool: StartInventoryPool | ||
|  |     expanded_pool: ExpandedPool | ||
|  |     trap_chance: TrapChance | ||
|  |     # gameplay options | ||
|  |     death_link: DeathLink | ||
|  |     instant_saving: InstantSaving | ||
|  |     sprint_availability: SprintAvailability | ||
|  |     cliff_weapon_upgrade: CliffWeaponUpgrade | ||
|  |     ace_weapon_upgrade: AceWeaponUpgrade | ||
|  |     iframes_duration: IFramesDuration | ||
|  |     # aesthetic options | ||
|  |     shake_intensity: ScreenShakeIntensity | ||
|  |     music_shuffle: MusicShuffle | ||
|  | 
 | ||
|  | 
 | ||
|  | groups = [ | ||
|  |     OptionGroup("Generation Options", [ | ||
|  |         ExpandedPool, | ||
|  |         TrapChance, | ||
|  |     ]), | ||
|  |     OptionGroup("Gameplay Options", [ | ||
|  |         DeathLink, | ||
|  |         InstantSaving, | ||
|  |         SprintAvailability, | ||
|  |         CliffWeaponUpgrade, | ||
|  |         AceWeaponUpgrade, | ||
|  |         IFramesDuration, | ||
|  |     ]), | ||
|  |     OptionGroup("Aesthetic Options", [ | ||
|  |         ScreenShakeIntensity, | ||
|  |         MusicShuffle, | ||
|  |     ]), | ||
|  | ] | ||
|  | 
 | ||
|  | presets = { | ||
|  |     "Vanilla-like": { | ||
|  |         "expanded_pool": False, | ||
|  |         "trap_chance": 0, | ||
|  |         "death_link": False, | ||
|  |         "instant_saving": False, | ||
|  |         "sprint_availability": SprintAvailability.option_never_available, | ||
|  |         "cliff_weapon_upgrade": CliffWeaponUpgrade.option_vanilla, | ||
|  |         "ace_weapon_upgrade": AceWeaponUpgrade.option_vanilla, | ||
|  |         "iframes_duration": 100, | ||
|  |         "shake_intensity": 100, | ||
|  |         "music_shuffle": False, | ||
|  |     }, | ||
|  |     "Easy": { | ||
|  |         "expanded_pool": True, | ||
|  |         "trap_chance": 0, | ||
|  |         "death_link": False, | ||
|  |         "instant_saving": True, | ||
|  |         "sprint_availability": SprintAvailability.option_always_available, | ||
|  |         "cliff_weapon_upgrade": CliffWeaponUpgrade.option_never_upgraded, | ||
|  |         "ace_weapon_upgrade": AceWeaponUpgrade.option_always_upgraded, | ||
|  |         "iframes_duration": 200, | ||
|  |         "shake_intensity": 50, | ||
|  |         "music_shuffle": False, | ||
|  |     }, | ||
|  |     "Hard": { | ||
|  |         "expanded_pool": True, | ||
|  |         "trap_chance": 100, | ||
|  |         "death_link": True, | ||
|  |         "instant_saving": True, | ||
|  |         "sprint_availability": SprintAvailability.option_never_available, | ||
|  |         "cliff_weapon_upgrade": CliffWeaponUpgrade.option_always_upgraded, | ||
|  |         "ace_weapon_upgrade": AceWeaponUpgrade.option_never_upgraded, | ||
|  |         "iframes_duration": 50, | ||
|  |         "shake_intensity": 100, | ||
|  |         "music_shuffle": False, | ||
|  |     } | ||
|  | } |