435 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			435 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Python
		
	
	
	
import typing
 | 
						|
from Options import Choice, PerGameCommonOptions, Range, OptionDict, OptionList, OptionSet, Option, Toggle, DefaultOnToggle
 | 
						|
from .variaRandomizer.utils.objectives import _goals
 | 
						|
from dataclasses import dataclass
 | 
						|
 | 
						|
class StartItemsRemovesFromPool(Toggle):
 | 
						|
    """Remove items in starting inventory from pool."""
 | 
						|
    display_name = "StartItems Removes From Item Pool"
 | 
						|
 | 
						|
class Preset(Choice):
 | 
						|
    """Choose one of the presets or specify "varia_custom" to use varia_custom_preset option or specify "custom" to use
 | 
						|
    custom_preset option."""
 | 
						|
    display_name = "Preset"
 | 
						|
    option_newbie = 0
 | 
						|
    option_casual = 1
 | 
						|
    option_regular = 2
 | 
						|
    option_veteran = 3
 | 
						|
    option_expert = 4
 | 
						|
    option_master = 5
 | 
						|
    option_samus = 6
 | 
						|
    option_Season_Races = 7
 | 
						|
    option_SMRAT2021 = 8
 | 
						|
    option_solution = 9
 | 
						|
    option_custom = 10
 | 
						|
    option_varia_custom = 11
 | 
						|
    default = 2
 | 
						|
 | 
						|
class StartLocation(Choice):
 | 
						|
    """Choose where you want to start the game."""
 | 
						|
    display_name = "Start Location"
 | 
						|
    option_Ceres = 0
 | 
						|
    option_Landing_Site = 1
 | 
						|
    option_Gauntlet_Top = 2
 | 
						|
    option_Green_Brinstar_Elevator = 3
 | 
						|
    option_Big_Pink = 4
 | 
						|
    option_Etecoons_Supers = 5
 | 
						|
    option_Wrecked_Ship_Main = 6
 | 
						|
    option_Firefleas_Top = 7
 | 
						|
    option_Business_Center = 8
 | 
						|
    option_Bubble_Mountain = 9
 | 
						|
    option_Mama_Turtle = 10
 | 
						|
    option_Watering_Hole = 11
 | 
						|
    option_Aqueduct = 12
 | 
						|
    option_Red_Brinstar_Elevator = 13
 | 
						|
    option_Golden_Four = 14
 | 
						|
    default = 1
 | 
						|
 | 
						|
class DeathLink(Choice):
 | 
						|
    """When DeathLink is enabled and someone dies, you will die. With survive reserve tanks can save you."""
 | 
						|
    display_name = "Death Link"
 | 
						|
    option_disable = 0
 | 
						|
    option_enable = 1
 | 
						|
    option_enable_survive = 3
 | 
						|
    alias_false = 0
 | 
						|
    alias_true = 1
 | 
						|
    default = 0
 | 
						|
 | 
						|
class RemoteItems(Toggle):
 | 
						|
    """Indicates you get items sent from your own world. This allows coop play of a world."""
 | 
						|
    display_name = "Remote Items"  
 | 
						|
 | 
						|
class MaxDifficulty(Choice):
 | 
						|
    """Depending on the perceived difficulties of the techniques, bosses, hell runs etc. from the preset, it will
 | 
						|
    prevent the Randomizer from placing an item in a location too difficult to reach with the current items."""
 | 
						|
    display_name = "Maximum Difficulty"
 | 
						|
    option_easy = 0
 | 
						|
    option_medium = 1
 | 
						|
    option_hard = 2
 | 
						|
    option_harder = 3
 | 
						|
    option_hardcore = 4
 | 
						|
    option_mania = 5
 | 
						|
    option_infinity = 6
 | 
						|
    default = 4
 | 
						|
 | 
						|
class MorphPlacement(Choice):
 | 
						|
    """Influences where the Morphing Ball with be placed."""
 | 
						|
    display_name = "Morph Placement"
 | 
						|
    option_early = 0
 | 
						|
    option_normal = 1
 | 
						|
    default = 0
 | 
						|
 | 
						|
class StrictMinors(Toggle):
 | 
						|
    """Instead of using the Minors proportions as probabilities, enforce a strict distribution to match the proportions
 | 
						|
    as closely as possible."""
 | 
						|
    display_name = "Strict Minors"
 | 
						|
 | 
						|
class MissileQty(Range):
 | 
						|
    """The higher the number the higher the probability of choosing missles when placing a minor."""
 | 
						|
    display_name = "Missile Quantity"
 | 
						|
    range_start = 10
 | 
						|
    range_end = 90
 | 
						|
    default = 30
 | 
						|
 | 
						|
class SuperQty(Range):
 | 
						|
    """The higher the number the higher the probability of choosing super missles when placing a minor."""
 | 
						|
    display_name = "Super Quantity"
 | 
						|
    range_start = 10
 | 
						|
    range_end = 90
 | 
						|
    default = 20
 | 
						|
 | 
						|
class PowerBombQty(Range):
 | 
						|
    """The higher the number the higher the probability of choosing power bombs when placing a minor."""
 | 
						|
    display_name = "Power Bomb Quantity"
 | 
						|
    range_start = 10
 | 
						|
    range_end = 90
 | 
						|
    default = 10
 | 
						|
 | 
						|
class MinorQty(Range):
 | 
						|
    """From 7%, minimum number of minors required to finish the game, to 100%."""
 | 
						|
    display_name = "Minor Quantity"
 | 
						|
    range_start = 7
 | 
						|
    range_end = 100
 | 
						|
    default = 100
 | 
						|
 | 
						|
class EnergyQty(Choice):
 | 
						|
    """Choose how many Energy/Reserve Tanks will be available, from 0-1 in ultra sparse, 4-6 in sparse, 8-12 in medium
 | 
						|
    and 18 in vanilla."""
 | 
						|
    display_name = "Energy Quantity"
 | 
						|
    option_ultra_sparse = 0
 | 
						|
    option_sparse = 1
 | 
						|
    option_medium = 2
 | 
						|
    option_vanilla = 3
 | 
						|
    default = 3
 | 
						|
 | 
						|
class AreaRandomization(Choice):
 | 
						|
    """Randomize areas together using bidirectional access portals."""
 | 
						|
    display_name = "Area Randomization"
 | 
						|
    option_off = 0
 | 
						|
    option_light = 1
 | 
						|
    option_full = 2
 | 
						|
    alias_true = 2
 | 
						|
    default = 0
 | 
						|
 | 
						|
class AreaLayout(Toggle):
 | 
						|
    """Some layout tweaks to make your life easier in areas randomizer."""
 | 
						|
    display_name = "Area Layout"
 | 
						|
 | 
						|
class DoorsColorsRando(Toggle):
 | 
						|
    """Randomize the color of Red/Green/Yellow doors. Add four new type of doors which require Ice/Wave/Spazer/Plasma
 | 
						|
    beams to open them."""
 | 
						|
    display_name = "Doors Colors Rando"
 | 
						|
 | 
						|
class AllowGreyDoors(Toggle):
 | 
						|
    """When randomizing the color of Red/Green/Yellow doors, some doors can be randomized to Grey. Grey doors will never
 | 
						|
    open, you will have to go around them."""
 | 
						|
    display_name = "Allow Grey Doors"
 | 
						|
 | 
						|
class BossRandomization(Toggle):
 | 
						|
    """Randomize Golden 4 bosses access doors using bidirectional access portals."""
 | 
						|
    display_name = "Boss Randomization"
 | 
						|
 | 
						|
class FunCombat(Toggle):
 | 
						|
    """Forces removal of Plasma Beam and Screw Attack if the preset and settings allow it. In addition, can randomly
 | 
						|
    remove Spazer and Wave Beam from the Combat set. If used, might force 'minimal' accessibility."""
 | 
						|
    display_name = "Fun Combat"
 | 
						|
 | 
						|
class FunMovement(Toggle):
 | 
						|
    """Forces removal of Space Jump if the preset allows it. In addition, can randomly remove High Jump, Grappling Beam,
 | 
						|
    Spring Ball, Speed Booster, and Bombs from the Movement set. If used, might force 'minimal' accessibility."""
 | 
						|
    display_name = "Fun Movement"
 | 
						|
 | 
						|
class FunSuits(Toggle):
 | 
						|
    """If the preset and seed layout allow it, will force removal of at least one of Varia Suit and/or Gravity Suit. If
 | 
						|
    used, might force 'minimal' accessibility."""
 | 
						|
    display_name = "Fun Suits"
 | 
						|
 | 
						|
class LayoutPatches(DefaultOnToggle):
 | 
						|
    """Include the anti-softlock layout patches. Disable at your own softlocking risk!"""
 | 
						|
    display_name = "Layout Patches"
 | 
						|
 | 
						|
class VariaTweaks(Toggle):
 | 
						|
    """Include minor tweaks for the game to behave 'as it should' in a randomizer context"""
 | 
						|
    display_name = "Varia Tweaks"
 | 
						|
 | 
						|
class NerfedCharge(Toggle):
 | 
						|
    """Samus begins with a starter Charge Beam that does one third of charged shot damage that can damage bosses. Pseudo
 | 
						|
    Screws also do one third damage. Special Beam Attacks do normal damage but cost 3 Power Bombs instead of 1. Once the
 | 
						|
    Charge Beam item has been collected, it does full damage and special attacks are back to normal."""
 | 
						|
    display_name = "Nerfed Charge"
 | 
						|
 | 
						|
class GravityBehaviour(Choice):
 | 
						|
    """Modify the heat damage and enemy damage reduction qualities of the Gravity and Varia Suits."""
 | 
						|
    display_name = "Gravity Behaviour"
 | 
						|
    option_Vanilla = 0
 | 
						|
    option_Balanced = 1
 | 
						|
    option_Progressive = 2
 | 
						|
    default = 1
 | 
						|
 | 
						|
class ElevatorsSpeed(DefaultOnToggle):
 | 
						|
    """Accelerate elevators transitions."""
 | 
						|
    display_name = "Elevators speed"
 | 
						|
 | 
						|
class DoorsSpeed(DefaultOnToggle):
 | 
						|
    """Accelerate doors transitions."""
 | 
						|
    display_name = "Doors speed"
 | 
						|
 | 
						|
class SpinJumpRestart(Toggle):
 | 
						|
    """Allows Samus to start spinning in mid air after jumping or falling."""
 | 
						|
    display_name = "Spin Jump Restart"
 | 
						|
 | 
						|
class SpeedKeep(Toggle):
 | 
						|
    """Let Samus keeps her momentum when landing from a fall or from jumping."""
 | 
						|
    display_name = "Momentum conservation (a.k.a. Speedkeep)"
 | 
						|
 | 
						|
class InfiniteSpaceJump(Toggle):
 | 
						|
    """Space jumps can be done quicker and at any time in air, water or lava, even after falling long distances."""
 | 
						|
    display_name = "Infinite Space Jump"
 | 
						|
 | 
						|
class RefillBeforeSave(Toggle):
 | 
						|
    """Refill energy and ammo when saving."""
 | 
						|
    display_name = "Refill Before Save"
 | 
						|
 | 
						|
class Hud(Toggle):
 | 
						|
    """Displays the current area name and the number of remaining items of selected item split in the HUD for the
 | 
						|
    current area."""
 | 
						|
    display_name = "Hud"
 | 
						|
 | 
						|
class Animals(Toggle):
 | 
						|
    """
 | 
						|
    Replace saving the animals in the escape sequence by a random surprise.
 | 
						|
    Note: This setting is not available when Escape Randomization is enabled, as it is replaced by Animals Challenges
 | 
						|
    (see Escape Randomization help for more information).
 | 
						|
    """
 | 
						|
    display_name = "Animals"
 | 
						|
 | 
						|
class NoMusic(Toggle):
 | 
						|
    """Disable the background music."""
 | 
						|
    display_name = "No Music"
 | 
						|
 | 
						|
class RandomMusic(Toggle):
 | 
						|
    """Randomize the background music."""
 | 
						|
    display_name = "Random Music"
 | 
						|
 | 
						|
class CustomPreset(OptionDict):
 | 
						|
    """
 | 
						|
    see https://randommetroidsolver.pythonanywhere.com/presets for detailed info on each preset settings
 | 
						|
    knows: each skill (know) has a pair [can use, perceived difficulty using one of 1, 5, 10, 25, 50 or 100 each one
 | 
						|
           matching a max_difficulty]
 | 
						|
    settings: hard rooms, hellruns and bosses settings
 | 
						|
    controller: predefined controller mapping and moon walk setting
 | 
						|
    """
 | 
						|
    display_name = "Custom Preset"
 | 
						|
    default = {  "knows": {},
 | 
						|
                 "settings": {},
 | 
						|
                 "controller": {}
 | 
						|
              }
 | 
						|
 | 
						|
class VariaCustomPreset(OptionList):
 | 
						|
    """use an entry from the preset list on https://randommetroidsolver.pythonanywhere.com/presets"""
 | 
						|
    display_name = "Varia Custom Preset"  
 | 
						|
    default = {}
 | 
						|
 | 
						|
 | 
						|
class EscapeRando(Toggle):
 | 
						|
    """
 | 
						|
    When leaving Tourian, get teleported to the exit of a random Map station (between Brinstar/Maridia/Norfair/Wrecked Ship).
 | 
						|
    You then have to find your way to the ship in the remaining time. Allotted time depends on area layout, but not on skill settings and is pretty generous.
 | 
						|
    
 | 
						|
    During the escape sequence:
 | 
						|
    - All doors are opened
 | 
						|
    - Maridia tube is opened
 | 
						|
    - The Hyper Beam can destroy Bomb , Power Bomb  and Super Missile  blocks and open blue/green gates from both sides
 | 
						|
    - All mini bosses are defeated
 | 
						|
    - All minor enemies are removed to allow you to move faster and remove lag
 | 
						|
 | 
						|
    During regular game only Crateria Map station door can be opened and activating the station will act as if all map stations were activated at once.
 | 
						|
 | 
						|
    Animals Challenges:
 | 
						|
    You can use the extra available time to:
 | 
						|
    - find the animals that are hidden behind a (now blue) map station door
 | 
						|
    - go to the vanilla animals door to cycle through the 4 available escapes, and complete as many escapes as you can
 | 
						|
 | 
						|
    Pick your challenge, or try to do both, but watch your timer!
 | 
						|
    """
 | 
						|
    display_name = "Randomize the escape sequence"
 | 
						|
 | 
						|
class RemoveEscapeEnemies(Toggle):
 | 
						|
    """Remove enemies during escape sequence, disable it to blast through enemies with your Hyper Beam and cause lag."""
 | 
						|
    display_name = "Remove enemies during escape"   
 | 
						|
 | 
						|
class Tourian(Choice):
 | 
						|
    """
 | 
						|
    Choose endgame Tourian behaviour:
 | 
						|
    Vanilla: regular vanilla Tourian
 | 
						|
    Fast: speed up Tourian to skip Metroids, Zebetites, and all cutscenes (including Mother Brain 3 fight). Golden Four statues are replaced by an invincible Gadora until all objectives are completed.
 | 
						|
    Disabled: skip Tourian entirely, ie. escape sequence is triggered as soon as all objectives are completed.
 | 
						|
    """
 | 
						|
    display_name = "Endgame behavior with Tourian"
 | 
						|
    option_Vanilla = 0
 | 
						|
    option_Fast = 1
 | 
						|
    option_Disabled = 2
 | 
						|
    default = 0  
 | 
						|
 | 
						|
class CustomObjective(Toggle):
 | 
						|
    """
 | 
						|
    Use randomized custom objectives. You can choose which objectives are available for the randomizer to choose from. If enabled, the randomizer 
 | 
						|
    will choose "Custom objective count" objectives from "Custom objective list". Otherwise, only objective is used. Default is disabled.
 | 
						|
    """
 | 
						|
    display_name = "Custom objectives"
 | 
						|
 | 
						|
class CustomObjectiveCount(Range):
 | 
						|
    """
 | 
						|
    By default you need to complete 4 objectives from the list to access Tourian. You can choose between 1 and 5. This setting is ignored if
 | 
						|
    ""Custom objectives"" is set to false.
 | 
						|
    """
 | 
						|
    display_name = "Custom objective count"
 | 
						|
    range_start = 1
 | 
						|
    range_end = 5
 | 
						|
    default = 4
 | 
						|
 | 
						|
class CustomObjectiveList(OptionSet):
 | 
						|
    """
 | 
						|
    If ""Custom objectives"" is enabled, "Custom Objective count" will be used to pick an amount of objective from the list.
 | 
						|
    This setting is ignored if ""Custom objectives"" is set to false.
 | 
						|
    Note: If you leave the list empty no objective is required to access Tourian, ie. it's open.
 | 
						|
    Note: See the Tourian parameter to enable fast Tourian or trigger the escape when all objectives are completed.
 | 
						|
    Note: Current percentage of collected items is displayed in the inventory pause menu.
 | 
						|
    Note: Collect 100% items is excluded by default as it requires you to complete all the objectives.
 | 
						|
    Note: In AP, Items% and areas objectives are counted toward location checks, not items collected or received, except for "collect all upgrades"
 | 
						|
    
 | 
						|
    Format as a comma-separated list of objective names: ["kill three G4", "collect 75% items"] or ["random"] to specify the whole list except
 | 
						|
    "collect 100% items" and "nothing". The default is ["random"]. A full list of supported objectives can be found at:
 | 
						|
    https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/sm/variaRandomizer/utils/objectives.py
 | 
						|
    """
 | 
						|
    display_name = "Custom objective list"
 | 
						|
    default = ["random"]
 | 
						|
    valid_keys = frozenset([name for name in _goals.keys()] + ["random"])
 | 
						|
    #valid_keys_casefold = True
 | 
						|
 | 
						|
class Objective(OptionSet):
 | 
						|
    """
 | 
						|
    If ""Custom objectives"" is disabled, choose which objectives are required to sink the Golden Four statue and to open access to Tourian.
 | 
						|
    You can choose from 0 to 5 objectives. Up to the first 5 objectives from the list will be selected.
 | 
						|
    Note: If you leave the list empty no objective is required to access Tourian, ie. it's open.
 | 
						|
    Note: See the Tourian parameter to enable fast Tourian or trigger the escape when all objectives are completed.
 | 
						|
    Note: Current percentage of collected items is displayed in the inventory pause menu.
 | 
						|
    Note: In AP, Items% and areas objectives are counted toward location checks, not items collected or received, except for "collect all upgrades"
 | 
						|
    
 | 
						|
    Format as a comma-separated list of objective names: ["kill three G4", "collect 75% items"]. The default is ["kill all G4"].
 | 
						|
    A full list of supported objectives can be found at:
 | 
						|
    https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/sm/variaRandomizer/utils/objectives.py
 | 
						|
    """
 | 
						|
    display_name = "Objectives"
 | 
						|
    default = ["kill all G4"]
 | 
						|
    valid_keys = frozenset({name: goal for (name, goal) in _goals.items()})
 | 
						|
    #valid_keys_casefold = True
 | 
						|
 | 
						|
class HideItems(Toggle):
 | 
						|
    """
 | 
						|
    Hides half of the visible items.
 | 
						|
    Items always visible:
 | 
						|
    - Energy Tank, Gauntlet
 | 
						|
    - Energy Tank, Terminator
 | 
						|
    - Morphing Ball
 | 
						|
    - Missile (Crateria moat)
 | 
						|
    - Missile (green Brinstar below super missile)
 | 
						|
    - Missile (above Crocomire)
 | 
						|
    - Power Bomb (lower Norfair above fire flea room)
 | 
						|
    - Missile (Gravity Suit)
 | 
						|
    - Missile (green Maridia shinespark)
 | 
						|
    """
 | 
						|
    display_name = "Hide half the items"
 | 
						|
 | 
						|
class RelaxedRoundRobinCF(Toggle):
 | 
						|
    """
 | 
						|
    Changes Crystal Flashes behavior and requirements as follows:
 | 
						|
 | 
						|
    You can perform a Crystal Flash with any amount of ammo, but you need at least one Power Bomb to begin the process.
 | 
						|
    After consuming 1 ammo, Samus gains 50 energy, and it will try a different ammo type next,  
 | 
						|
    cycling through Missiles, Supers, and Power Bombs as available. The cycling is to keep the consumption even between ammo types.
 | 
						|
    If one of your ammo types is at 0, it will be skipped.
 | 
						|
    The Crystal Flash ends when Samus is out of ammo or a total of 30 ammo has been consumed.
 | 
						|
    """
 | 
						|
    display_name = "Relaxed round robin Crystal Flash"
 | 
						|
 | 
						|
@dataclass
 | 
						|
class SMOptions(PerGameCommonOptions):
 | 
						|
    start_inventory_removes_from_pool: StartItemsRemovesFromPool
 | 
						|
    preset: Preset
 | 
						|
    start_location: StartLocation
 | 
						|
    remote_items: RemoteItems
 | 
						|
    death_link: DeathLink
 | 
						|
    #majors_split: "Full"
 | 
						|
    #scav_num_locs: "10"
 | 
						|
    #scav_randomized: "off"
 | 
						|
    #scav_escape: "off"
 | 
						|
    max_difficulty: MaxDifficulty
 | 
						|
    #progression_speed": "medium"
 | 
						|
    #progression_difficulty": "normal"
 | 
						|
    morph_placement: MorphPlacement
 | 
						|
    #suits_restriction": SuitsRestriction
 | 
						|
    hide_items: HideItems
 | 
						|
    strict_minors: StrictMinors
 | 
						|
    missile_qty: MissileQty
 | 
						|
    super_qty: SuperQty
 | 
						|
    power_bomb_qty: PowerBombQty
 | 
						|
    minor_qty: MinorQty
 | 
						|
    energy_qty: EnergyQty
 | 
						|
    area_randomization: AreaRandomization
 | 
						|
    area_layout: AreaLayout
 | 
						|
    doors_colors_rando: DoorsColorsRando
 | 
						|
    allow_grey_doors: AllowGreyDoors
 | 
						|
    boss_randomization: BossRandomization
 | 
						|
    #minimizer: "off"
 | 
						|
    #minimizer_qty: "45"
 | 
						|
    #minimizer_tourian: "off"
 | 
						|
    escape_rando: EscapeRando
 | 
						|
    remove_escape_enemies: RemoveEscapeEnemies
 | 
						|
    fun_combat: FunCombat
 | 
						|
    fun_movement: FunMovement
 | 
						|
    fun_suits: FunSuits
 | 
						|
    layout_patches: LayoutPatches
 | 
						|
    varia_tweaks: VariaTweaks
 | 
						|
    nerfed_charge: NerfedCharge
 | 
						|
    gravity_behaviour: GravityBehaviour
 | 
						|
    #item_sounds: "on"
 | 
						|
    elevators_speed: ElevatorsSpeed
 | 
						|
    fast_doors: DoorsSpeed
 | 
						|
    spin_jump_restart: SpinJumpRestart
 | 
						|
    rando_speed: SpeedKeep
 | 
						|
    infinite_space_jump: InfiniteSpaceJump
 | 
						|
    refill_before_save: RefillBeforeSave
 | 
						|
    hud: Hud
 | 
						|
    animals: Animals
 | 
						|
    no_music: NoMusic
 | 
						|
    random_music: RandomMusic
 | 
						|
    custom_preset: CustomPreset
 | 
						|
    varia_custom_preset: VariaCustomPreset
 | 
						|
    tourian: Tourian
 | 
						|
    custom_objective: CustomObjective
 | 
						|
    custom_objective_list: CustomObjectiveList
 | 
						|
    custom_objective_count: CustomObjectiveCount
 | 
						|
    objective: Objective
 | 
						|
    relaxed_round_robin_cf: RelaxedRoundRobinCF
 |