230 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			230 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from dataclasses import dataclass | ||
|  | 
 | ||
|  | from Options import Choice, Toggle, DeathLink, DefaultOnToggle, TextChoice, Range, OptionDict, PerGameCommonOptions | ||
|  | from schema import Schema, And, Use, Optional | ||
|  | 
 | ||
|  | bosses = { | ||
|  |     "Heat Man": 0, | ||
|  |     "Air Man": 1, | ||
|  |     "Wood Man": 2, | ||
|  |     "Bubble Man": 3, | ||
|  |     "Quick Man": 4, | ||
|  |     "Flash Man": 5, | ||
|  |     "Metal Man": 6, | ||
|  |     "Crash Man": 7, | ||
|  |     "Mecha Dragon": 8, | ||
|  |     "Picopico-kun": 9, | ||
|  |     "Guts Tank": 10, | ||
|  |     "Boobeam Trap": 11, | ||
|  |     "Wily Machine 2": 12, | ||
|  |     "Alien": 13 | ||
|  | } | ||
|  | 
 | ||
|  | weapons_to_id = { | ||
|  |     "Mega Buster": 0, | ||
|  |     "Atomic Fire": 1, | ||
|  |     "Air Shooter": 2, | ||
|  |     "Leaf Shield": 3, | ||
|  |     "Bubble Lead": 4, | ||
|  |     "Quick Boomerang": 5, | ||
|  |     "Metal Blade": 7, | ||
|  |     "Crash Bomber": 6, | ||
|  |     "Time Stopper": 8, | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | class EnergyLink(Toggle): | ||
|  |     """
 | ||
|  |     Enables EnergyLink support. | ||
|  |     When enabled, pickups dropped from enemies are sent to the EnergyLink pool, and healing/weapon energy/1-Ups can | ||
|  |     be requested from the EnergyLink pool. | ||
|  |     Some of the energy sent to the pool will be lost on transfer. | ||
|  |     """
 | ||
|  |     display_name = "EnergyLink" | ||
|  | 
 | ||
|  | 
 | ||
|  | class StartingRobotMaster(Choice): | ||
|  |     """
 | ||
|  |     The initial stage unlocked at the start. | ||
|  |     """
 | ||
|  |     display_name = "Starting Robot Master" | ||
|  |     option_heat_man = 0 | ||
|  |     option_air_man = 1 | ||
|  |     option_wood_man = 2 | ||
|  |     option_bubble_man = 3 | ||
|  |     option_quick_man = 4 | ||
|  |     option_flash_man = 5 | ||
|  |     option_metal_man = 6 | ||
|  |     option_crash_man = 7 | ||
|  |     default = "random" | ||
|  | 
 | ||
|  | 
 | ||
|  | class YokuJumps(Toggle): | ||
|  |     """
 | ||
|  |     When enabled, the player is expected to be able to perform the yoku block sequence in Heat Man's | ||
|  |     stage without Item 2. | ||
|  |     """
 | ||
|  |     display_name = "Yoku Block Jumps" | ||
|  | 
 | ||
|  | 
 | ||
|  | class EnableLasers(Toggle): | ||
|  |     """
 | ||
|  |     When enabled, the player is expected to complete (and acquire items within) the laser sections of Quick Man's | ||
|  |     stage without the Time Stopper. | ||
|  |     """
 | ||
|  |     display_name = "Enable Lasers" | ||
|  | 
 | ||
|  | 
 | ||
|  | class Consumables(Choice): | ||
|  |     """
 | ||
|  |     When enabled, e-tanks/1-ups/health/weapon energy will be added to the pool of items and included as checks. | ||
|  |     E-Tanks and 1-Ups add 20 checks to the pool. | ||
|  |     Weapon/Health Energy add 27 checks to the pool. | ||
|  |     """
 | ||
|  |     display_name = "Consumables" | ||
|  |     option_none = 0 | ||
|  |     option_1up_etank = 1 | ||
|  |     option_weapon_health = 2 | ||
|  |     option_all = 3 | ||
|  |     default = 1 | ||
|  |     alias_true = 3 | ||
|  |     alias_false = 0 | ||
|  | 
 | ||
|  |     @classmethod | ||
|  |     def get_option_name(cls, value: int) -> str: | ||
|  |         if value == 1: | ||
|  |             return "1-Ups/E-Tanks" | ||
|  |         if value == 2: | ||
|  |             return "Weapon/Health Energy" | ||
|  |         return super().get_option_name(value) | ||
|  | 
 | ||
|  | 
 | ||
|  | class Quickswap(DefaultOnToggle): | ||
|  |     """
 | ||
|  |     When enabled, the player can quickswap through all received weapons by pressing Select. | ||
|  |     """
 | ||
|  |     display_name = "Quickswap" | ||
|  | 
 | ||
|  | 
 | ||
|  | class PaletteShuffle(TextChoice): | ||
|  |     """
 | ||
|  |     Change the color of Mega Man and the Robot Masters. | ||
|  |     None: The palettes are unchanged. | ||
|  |     Shuffled: Palette colors are shuffled amongst the robot masters. | ||
|  |     Randomized: Random (usually good) palettes are generated for each robot master. | ||
|  |     Singularity: one palette is generated and used for all robot masters. | ||
|  |     Supports custom palettes using HTML named colors in the | ||
|  |     following format: Mega Buster-Lavender|Violet;randomized | ||
|  |     The first value is the character whose palette you'd like to define, then separated by - is a set of 2 colors for | ||
|  |     that character. separate every color with a pipe, and separate every character as well as the remaining shuffle with | ||
|  |     a semicolon. | ||
|  |     """
 | ||
|  |     display_name = "Palette Shuffle" | ||
|  |     option_none = 0 | ||
|  |     option_shuffled = 1 | ||
|  |     option_randomized = 2 | ||
|  |     option_singularity = 3 | ||
|  | 
 | ||
|  | 
 | ||
|  | class EnemyWeaknesses(Toggle): | ||
|  |     """
 | ||
|  |     Randomizes the damage dealt to enemies by weapons. Friender will always take damage from the buster. | ||
|  |     """
 | ||
|  |     display_name = "Random Enemy Weaknesses" | ||
|  | 
 | ||
|  | 
 | ||
|  | class StrictWeaknesses(Toggle): | ||
|  |     """
 | ||
|  |     Only your starting Robot Master will take damage from the Mega Buster, the rest must be defeated with weapons. | ||
|  |     Weapons that only do 1-3 damage to bosses no longer deal damage (aside from Alien). | ||
|  |     """
 | ||
|  |     display_name = "Strict Boss Weaknesses" | ||
|  | 
 | ||
|  | 
 | ||
|  | class RandomWeaknesses(Choice): | ||
|  |     """
 | ||
|  |     None: Bosses will have their regular weaknesses. | ||
|  |     Shuffled: Weapon damage will be shuffled amongst the weapons, so Metal Blade may do Bubble Lead damage. | ||
|  |     Time Stopper will deplete half of a random Robot Master's HP. | ||
|  |     Randomized: Weapon damage will be fully randomized. | ||
|  |     """
 | ||
|  |     display_name = "Random Boss Weaknesses" | ||
|  |     option_none = 0 | ||
|  |     option_shuffled = 1 | ||
|  |     option_randomized = 2 | ||
|  |     alias_false = 0 | ||
|  |     alias_true = 2 | ||
|  | 
 | ||
|  | 
 | ||
|  | class Wily5Requirement(Range): | ||
|  |     """Change the number of Robot Masters that are required to be defeated for
 | ||
|  |     the teleporter to the Wily Machine to appear."""
 | ||
|  |     display_name = "Wily 5 Requirement" | ||
|  |     default = 8 | ||
|  |     range_start = 1 | ||
|  |     range_end = 8 | ||
|  | 
 | ||
|  | 
 | ||
|  | class WeaknessPlando(OptionDict): | ||
|  |     """
 | ||
|  |     Specify specific damage numbers for boss damage. Can be used even without strict/random weaknesses. | ||
|  |     plando_weakness: | ||
|  |         Robot Master: | ||
|  |             Weapon: Damage | ||
|  |     """
 | ||
|  |     display_name = "Plando Weaknesses" | ||
|  |     schema = Schema({ | ||
|  |         Optional(And(str, Use(str.title), lambda s: s in bosses)): { | ||
|  |             And(str, Use(str.title), lambda s: s in weapons_to_id): And(int, lambda i: i in range(-1, 14)) | ||
|  |         } | ||
|  |     }) | ||
|  |     default = {} | ||
|  | 
 | ||
|  | 
 | ||
|  | class ReduceFlashing(Choice): | ||
|  |     """
 | ||
|  |     Reduce flashing seen in gameplay, such as the stage select and when defeating a Wily boss. | ||
|  |     Virtual Console: increases length of most flashes, changes some flashes from white to a dark gray. | ||
|  |     Minor: VC changes + decreasing the speed of Bubble/Metal Man stage animations. | ||
|  |     Full: VC changes + further decreasing the brightness of most flashes and | ||
|  |     disables stage animations for Metal/Bubble Man stages. | ||
|  |     """
 | ||
|  |     display_name = "Reduce Flashing" | ||
|  |     option_none = 0 | ||
|  |     option_virtual_console = 1 | ||
|  |     option_minor = 2 | ||
|  |     option_full = 3 | ||
|  |     default = 1 | ||
|  | 
 | ||
|  | 
 | ||
|  | class RandomMusic(Choice): | ||
|  |     """
 | ||
|  |     Vanilla: music is unchanged | ||
|  |     Shuffled: stage and certain menu music is shuffled. | ||
|  |     Randomized: stage and certain menu music is randomly selected | ||
|  |     None: no music will play | ||
|  |     """
 | ||
|  |     display_name = "Random Music" | ||
|  |     option_vanilla = 0 | ||
|  |     option_shuffled = 1 | ||
|  |     option_randomized = 2 | ||
|  |     option_none = 3 | ||
|  | 
 | ||
|  | @dataclass | ||
|  | class MM2Options(PerGameCommonOptions): | ||
|  |     death_link: DeathLink | ||
|  |     energy_link: EnergyLink | ||
|  |     starting_robot_master: StartingRobotMaster | ||
|  |     consumables: Consumables | ||
|  |     yoku_jumps: YokuJumps | ||
|  |     enable_lasers: EnableLasers | ||
|  |     enemy_weakness: EnemyWeaknesses | ||
|  |     strict_weakness: StrictWeaknesses | ||
|  |     random_weakness: RandomWeaknesses | ||
|  |     wily_5_requirement: Wily5Requirement | ||
|  |     plando_weakness: WeaknessPlando | ||
|  |     palette_shuffle: PaletteShuffle | ||
|  |     quickswap: Quickswap | ||
|  |     reduce_flashing: ReduceFlashing | ||
|  |     random_music: RandomMusic |