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
|