492 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			492 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from dataclasses import dataclass
 | 
						|
from Options import Choice, DefaultOnToggle, Range, Toggle, PerGameCommonOptions, StartInventoryPool
 | 
						|
 | 
						|
 | 
						|
class CharacterStages(Choice):
 | 
						|
    """Whether to include Reinhardt-only stages, Carrie-only stages, or both with or without branching paths at the end
 | 
						|
    of Villa and Castle Center."""
 | 
						|
    display_name = "Character Stages"
 | 
						|
    option_both = 0
 | 
						|
    option_branchless_both = 1
 | 
						|
    option_reinhardt_only = 2
 | 
						|
    option_carrie_only = 3
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class StageShuffle(Toggle):
 | 
						|
    """Shuffles which stages appear in which stage slots. Villa and Castle Center will never appear in any character
 | 
						|
    stage slots if Character Stages is set to Both; they can only be somewhere on the main path.
 | 
						|
    Castle Keep will always be at the end of the line."""
 | 
						|
    display_name = "Stage Shuffle"
 | 
						|
 | 
						|
 | 
						|
class StartingStage(Choice):
 | 
						|
    """Which stage to start at if Stage Shuffle is turned on."""
 | 
						|
    display_name = "Starting Stage"
 | 
						|
    option_forest_of_silence = 0
 | 
						|
    option_castle_wall = 1
 | 
						|
    option_villa = 2
 | 
						|
    option_tunnel = 3
 | 
						|
    option_underground_waterway = 4
 | 
						|
    option_castle_center = 5
 | 
						|
    option_duel_tower = 6
 | 
						|
    option_tower_of_execution = 7
 | 
						|
    option_tower_of_science = 8
 | 
						|
    option_tower_of_sorcery = 9
 | 
						|
    option_room_of_clocks = 10
 | 
						|
    option_clock_tower = 11
 | 
						|
    default = "random"
 | 
						|
 | 
						|
 | 
						|
class WarpOrder(Choice):
 | 
						|
    """Arranges the warps in the warp menu in whichever stage order chosen,
 | 
						|
    thereby changing the order they are unlocked in."""
 | 
						|
    display_name = "Warp Order"
 | 
						|
    option_seed_stage_order = 0
 | 
						|
    option_vanilla_stage_order = 1
 | 
						|
    option_randomized_order = 2
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class SubWeaponShuffle(Choice):
 | 
						|
    """Shuffles all sub-weapons in the game within each other in their own pool or in the main item pool."""
 | 
						|
    display_name = "Sub-weapon Shuffle"
 | 
						|
    option_off = 0
 | 
						|
    option_own_pool = 1
 | 
						|
    option_anywhere = 2
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class SpareKeys(Choice):
 | 
						|
    """Puts an additional copy of every non-Special key item in the pool for every key item that there is.
 | 
						|
    Chance gives each key item a 50% chance of having a duplicate instead of guaranteeing one for all of them."""
 | 
						|
    display_name = "Spare Keys"
 | 
						|
    option_off = 0
 | 
						|
    option_on = 1
 | 
						|
    option_chance = 2
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class HardItemPool(Toggle):
 | 
						|
    """Replaces some items in the item pool with less valuable ones, to make the item pool sort of resemble Hard Mode
 | 
						|
    in the PAL version."""
 | 
						|
    display_name = "Hard Item Pool"
 | 
						|
 | 
						|
 | 
						|
class Special1sPerWarp(Range):
 | 
						|
    """Sets how many Special1 jewels are needed per warp menu option unlock.
 | 
						|
    This will decrease until the number x 7 is less than or equal to the Total Specail1s if it isn't already."""
 | 
						|
    range_start = 1
 | 
						|
    range_end = 10
 | 
						|
    default = 1
 | 
						|
    display_name = "Special1s Per Warp"
 | 
						|
 | 
						|
 | 
						|
class TotalSpecial1s(Range):
 | 
						|
    """Sets how many Speical1 jewels are in the pool in total."""
 | 
						|
    range_start = 7
 | 
						|
    range_end = 70
 | 
						|
    default = 7
 | 
						|
    display_name = "Total Special1s"
 | 
						|
 | 
						|
 | 
						|
class DraculasCondition(Choice):
 | 
						|
    """Sets the requirement for unlocking and opening the door to Dracula's chamber.
 | 
						|
    None: No requirement. Door is unlocked from the start.
 | 
						|
    Crystal: Activate the big crystal in Castle Center's basement. Neither boss afterwards has to be defeated.
 | 
						|
    Bosses: Kill a specified number of bosses with health bars and claim their Trophies.
 | 
						|
    Specials: Find a specified number of Special2 jewels shuffled in the main item pool."""
 | 
						|
    display_name = "Dracula's Condition"
 | 
						|
    option_none = 0
 | 
						|
    option_crystal = 1
 | 
						|
    option_bosses = 2
 | 
						|
    option_specials = 3
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class PercentSpecial2sRequired(Range):
 | 
						|
    """Percentage of Special2s required to enter Dracula's chamber when Dracula's Condition is Special2s."""
 | 
						|
    range_start = 1
 | 
						|
    range_end = 100
 | 
						|
    default = 80
 | 
						|
    display_name = "Percent Special2s Required"
 | 
						|
 | 
						|
 | 
						|
class TotalSpecial2s(Range):
 | 
						|
    """How many Speical2 jewels are in the pool in total when Dracula's Condition is Special2s."""
 | 
						|
    range_start = 1
 | 
						|
    range_end = 70
 | 
						|
    default = 25
 | 
						|
    display_name = "Total Special2s"
 | 
						|
 | 
						|
 | 
						|
class BossesRequired(Range):
 | 
						|
    """How many bosses need to be defeated to enter Dracula's chamber when Dracula's Condition is set to Bosses.
 | 
						|
    This will automatically adjust if there are fewer available bosses than the chosen number."""
 | 
						|
    range_start = 1
 | 
						|
    range_end = 16
 | 
						|
    default = 14
 | 
						|
    display_name = "Bosses Required"
 | 
						|
 | 
						|
 | 
						|
class CarrieLogic(Toggle):
 | 
						|
    """Adds the 2 checks inside Underground Waterway's crawlspace to the pool.
 | 
						|
    If you (and everyone else if racing the same seed) are planning to only ever play Reinhardt, don't enable this.
 | 
						|
    Can be combined with Hard Logic to include Carrie-only tricks."""
 | 
						|
    display_name = "Carrie Logic"
 | 
						|
 | 
						|
 | 
						|
class HardLogic(Toggle):
 | 
						|
    """Properly considers sequence break tricks in logic (i.e. maze skip). Can be combined with Carrie Logic to include
 | 
						|
    Carrie-only tricks.
 | 
						|
    See the Game Page for a full list of tricks and glitches that may be logically required."""
 | 
						|
    display_name = "Hard Logic"
 | 
						|
 | 
						|
 | 
						|
class MultiHitBreakables(Toggle):
 | 
						|
    """Adds the items that drop from the objects that break in three hits to the pool. There are 18 of these throughout
 | 
						|
    the game, adding up to 79 or 80 checks (depending on sub-weapons
 | 
						|
    being shuffled anywhere or not) in total with all stages.
 | 
						|
    The game will be modified to
 | 
						|
    remember exactly which of their items you've picked up instead of simply whether they were broken or not."""
 | 
						|
    display_name = "Multi-hit Breakables"
 | 
						|
 | 
						|
 | 
						|
class EmptyBreakables(Toggle):
 | 
						|
    """Adds 9 check locations in the form of breakables that normally have nothing (all empty Forest coffins, etc.)
 | 
						|
    and some additional Red Jewels and/or moneybags into the item pool to compensate."""
 | 
						|
    display_name = "Empty Breakables"
 | 
						|
 | 
						|
 | 
						|
class LizardLockerItems(Toggle):
 | 
						|
    """Adds the 6 items inside Castle Center 2F's Lizard-man generators to the pool.
 | 
						|
    Picking up all of these can be a very tedious luck-based process, so they are off by default."""
 | 
						|
    display_name = "Lizard Locker Items"
 | 
						|
 | 
						|
 | 
						|
class Shopsanity(Toggle):
 | 
						|
    """Adds 7 one-time purchases from Renon's shop into the location pool. After buying an item from a slot, it will
 | 
						|
    revert to whatever it is in the vanilla game."""
 | 
						|
    display_name = "Shopsanity"
 | 
						|
 | 
						|
 | 
						|
class ShopPrices(Choice):
 | 
						|
    """Randomizes the amount of gold each item costs in Renon's shop.
 | 
						|
    Use the below options to control how much or little an item can cost."""
 | 
						|
    display_name = "Shop Prices"
 | 
						|
    option_vanilla = 0
 | 
						|
    option_randomized = 1
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class MinimumGoldPrice(Range):
 | 
						|
    """The lowest amount of gold an item can cost in Renon's shop, divided by 100."""
 | 
						|
    display_name = "Minimum Gold Price"
 | 
						|
    range_start = 1
 | 
						|
    range_end = 50
 | 
						|
    default = 2
 | 
						|
 | 
						|
 | 
						|
class MaximumGoldPrice(Range):
 | 
						|
    """The highest amount of gold an item can cost in Renon's shop, divided by 100."""
 | 
						|
    display_name = "Maximum Gold Price"
 | 
						|
    range_start = 1
 | 
						|
    range_end = 50
 | 
						|
    default = 30
 | 
						|
 | 
						|
 | 
						|
class PostBehemothBoss(Choice):
 | 
						|
    """Sets which boss is fought in the vampire triplets' room in Castle Center by which characters after defeating
 | 
						|
    Behemoth."""
 | 
						|
    display_name = "Post-Behemoth Boss"
 | 
						|
    option_vanilla = 0
 | 
						|
    option_inverted = 1
 | 
						|
    option_always_rosa = 2
 | 
						|
    option_always_camilla = 3
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class RoomOfClocksBoss(Choice):
 | 
						|
    """Sets which boss is fought at Room of Clocks by which characters."""
 | 
						|
    display_name = "Room of Clocks Boss"
 | 
						|
    option_vanilla = 0
 | 
						|
    option_inverted = 1
 | 
						|
    option_always_death = 2
 | 
						|
    option_always_actrise = 3
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class RenonFightCondition(Choice):
 | 
						|
    """Sets the condition on which the Renon fight will trigger."""
 | 
						|
    display_name = "Renon Fight Condition"
 | 
						|
    option_never = 0
 | 
						|
    option_spend_30k = 1
 | 
						|
    option_always = 2
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class VincentFightCondition(Choice):
 | 
						|
    """Sets the condition on which the vampire Vincent fight will trigger."""
 | 
						|
    display_name = "Vincent Fight Condition"
 | 
						|
    option_never = 0
 | 
						|
    option_wait_16_days = 1
 | 
						|
    option_always = 2
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class BadEndingCondition(Choice):
 | 
						|
    """Sets the condition on which the currently-controlled character's Bad Ending will trigger."""
 | 
						|
    display_name = "Bad Ending Condition"
 | 
						|
    option_never = 0
 | 
						|
    option_kill_vincent = 1
 | 
						|
    option_always = 2
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class IncreaseItemLimit(DefaultOnToggle):
 | 
						|
    """Increases the holding limit of usable items from 10 to 99 of each item."""
 | 
						|
    display_name = "Increase Item Limit"
 | 
						|
 | 
						|
 | 
						|
class NerfHealingItems(Toggle):
 | 
						|
    """Decreases the amount of health healed by Roast Chickens to 25%, Roast Beefs to 50%, and Healing Kits to 80%."""
 | 
						|
    display_name = "Nerf Healing Items"
 | 
						|
 | 
						|
 | 
						|
class LoadingZoneHeals(DefaultOnToggle):
 | 
						|
    """Whether end-of-level loading zones restore health and cure status aliments or not.
 | 
						|
    Recommended off for those looking for more of a survival horror experience!"""
 | 
						|
    display_name = "Loading Zone Heals"
 | 
						|
 | 
						|
 | 
						|
class InvisibleItems(Choice):
 | 
						|
    """Sets which items are visible in their locations and which are invisible until picked up.
 | 
						|
    'Chance' gives each item a 50/50 chance of being visible or invisible."""
 | 
						|
    display_name = "Invisible Items"
 | 
						|
    option_vanilla = 0
 | 
						|
    option_reveal_all = 1
 | 
						|
    option_hide_all = 2
 | 
						|
    option_chance = 3
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class DropPreviousSubWeapon(Toggle):
 | 
						|
    """When receiving a sub-weapon, the one you had before will drop behind you, so it can be taken back if desired."""
 | 
						|
    display_name = "Drop Previous Sub-weapon"
 | 
						|
 | 
						|
 | 
						|
class PermanentPowerUps(Toggle):
 | 
						|
    """Replaces PowerUps with PermaUps, which upgrade your B weapon level permanently and will stay even after
 | 
						|
    dying and/or continuing.
 | 
						|
    To compensate, only two will be in the pool overall, and they will not drop from any enemy or projectile."""
 | 
						|
    display_name = "Permanent PowerUps"
 | 
						|
 | 
						|
 | 
						|
class IceTrapPercentage(Range):
 | 
						|
    """Replaces a percentage of junk items with Ice Traps.
 | 
						|
    These will be visibly disguised as other items, and receiving one will freeze you
 | 
						|
    as if you were hit by Camilla's ice cloud attack."""
 | 
						|
    display_name = "Ice Trap Percentage"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 100
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class IceTrapAppearance(Choice):
 | 
						|
    """What items Ice Traps can possibly be disguised as."""
 | 
						|
    display_name = "Ice Trap Appearance"
 | 
						|
    option_major_only = 0
 | 
						|
    option_junk_only = 1
 | 
						|
    option_anything = 2
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class DisableTimeRestrictions(Toggle):
 | 
						|
    """Disables the restriction on every event and door that requires the current time
 | 
						|
    to be within a specific range, so they can be triggered at any time.
 | 
						|
    This includes all sun/moon doors and, in the Villa, the meeting with Rosa and the fountain pillar.
 | 
						|
    The Villa coffin is not affected by this."""
 | 
						|
    display_name = "Disable Time Requirements"
 | 
						|
 | 
						|
 | 
						|
class SkipGondolas(Toggle):
 | 
						|
    """Makes jumping on and activating a gondola in Tunnel instantly teleport you
 | 
						|
    to the other station, thereby skipping the entire three-minute ride.
 | 
						|
    The item normally at the gondola transfer point is moved to instead be
 | 
						|
    near the red gondola at its station."""
 | 
						|
    display_name = "Skip Gondolas"
 | 
						|
 | 
						|
 | 
						|
class SkipWaterwayBlocks(Toggle):
 | 
						|
    """Opens the door to the third switch in Underground Waterway from the start so that the jumping across floating
 | 
						|
    brick platforms won't have to be done. Shopping at the Contract on the other side of them may still be logically
 | 
						|
    required if Shopsanity is on."""
 | 
						|
    display_name = "Skip Waterway Blocks"
 | 
						|
 | 
						|
 | 
						|
class Countdown(Choice):
 | 
						|
    """Displays, near the HUD clock and below the health bar, the number of unobtained progression-marked items
 | 
						|
    or the total check locations remaining in the stage you are currently in."""
 | 
						|
    display_name = "Countdown"
 | 
						|
    option_none = 0
 | 
						|
    option_majors = 1
 | 
						|
    option_all_locations = 2
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class BigToss(Toggle):
 | 
						|
    """Makes every non-immobilizing damage source launch you as if you got hit by Behemoth's charge.
 | 
						|
    Press A while tossed to cancel the launch momentum and avoid being thrown off ledges.
 | 
						|
    Hold Z to have all incoming damage be treated as it normally would.
 | 
						|
    Any tricks that might be possible with it are NOT considered in logic by any options."""
 | 
						|
    display_name = "Big Toss"
 | 
						|
 | 
						|
 | 
						|
class PantherDash(Choice):
 | 
						|
    """Hold C-right at any time to sprint way faster. Any tricks that might be
 | 
						|
    possible with it are NOT considered in logic by any options and any boss
 | 
						|
    fights with boss health meters, if started, are expected to be finished
 | 
						|
    before leaving their arenas if Dracula's Condition is bosses. Jumpless will
 | 
						|
    prevent jumping while moving at the increased speed to ensure logic cannot be broken with it."""
 | 
						|
    display_name = "Panther Dash"
 | 
						|
    option_off = 0
 | 
						|
    option_on = 1
 | 
						|
    option_jumpless = 2
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class IncreaseShimmySpeed(Toggle):
 | 
						|
    """Increases the speed at which characters shimmy left and right while hanging on ledges."""
 | 
						|
    display_name = "Increase Shimmy Speed"
 | 
						|
 | 
						|
 | 
						|
class FallGuard(Toggle):
 | 
						|
    """Removes fall damage from landing too hard. Note that falling for too long will still result in instant death."""
 | 
						|
    display_name = "Fall Guard"
 | 
						|
 | 
						|
 | 
						|
class BackgroundMusic(Choice):
 | 
						|
    """Randomizes or disables the music heard throughout the game.
 | 
						|
    Randomized music is split into two pools: songs that loop and songs that don't.
 | 
						|
    The "lead-in" versions of some songs will be paired accordingly."""
 | 
						|
    display_name = "Background Music"
 | 
						|
    option_normal = 0
 | 
						|
    option_disabled = 1
 | 
						|
    option_randomized = 2
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class MapLighting(Choice):
 | 
						|
    """Randomizes the lighting color RGB values on every map during every time of day to be literally anything.
 | 
						|
    The colors and/or shading of the following things are affected: fog, maps, player, enemies, and some objects."""
 | 
						|
    display_name = "Map Lighting"
 | 
						|
    option_normal = 0
 | 
						|
    option_randomized = 1
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class CinematicExperience(Toggle):
 | 
						|
    """Enables an unused film reel effect on every cutscene in the game. Purely cosmetic."""
 | 
						|
    display_name = "Cinematic Experience"
 | 
						|
 | 
						|
 | 
						|
class WindowColorR(Range):
 | 
						|
    """The red value for the background color of the text windows during gameplay."""
 | 
						|
    display_name = "Window Color R"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 15
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class WindowColorG(Range):
 | 
						|
    """The green value for the background color of the text windows during gameplay."""
 | 
						|
    display_name = "Window Color G"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 15
 | 
						|
    default = 5
 | 
						|
 | 
						|
 | 
						|
class WindowColorB(Range):
 | 
						|
    """The blue value for the background color of the text windows during gameplay."""
 | 
						|
    display_name = "Window Color B"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 15
 | 
						|
    default = 15
 | 
						|
 | 
						|
 | 
						|
class WindowColorA(Range):
 | 
						|
    """The alpha value for the background color of the text windows during gameplay."""
 | 
						|
    display_name = "Window Color A"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 15
 | 
						|
    default = 8
 | 
						|
 | 
						|
 | 
						|
class DeathLink(Choice):
 | 
						|
    """When you die, everyone dies. Of course the reverse is true too.
 | 
						|
    Explosive: Makes received DeathLinks kill you via the Magical Nitro explosion
 | 
						|
    instead of the normal death animation."""
 | 
						|
    display_name = "DeathLink"
 | 
						|
    option_off = 0
 | 
						|
    alias_no = 0
 | 
						|
    alias_true = 1
 | 
						|
    alias_yes = 1
 | 
						|
    option_on = 1
 | 
						|
    option_explosive = 2
 | 
						|
 | 
						|
 | 
						|
@dataclass
 | 
						|
class CV64Options(PerGameCommonOptions):
 | 
						|
    character_stages: CharacterStages
 | 
						|
    stage_shuffle: StageShuffle
 | 
						|
    starting_stage: StartingStage
 | 
						|
    warp_order: WarpOrder
 | 
						|
    sub_weapon_shuffle: SubWeaponShuffle
 | 
						|
    spare_keys: SpareKeys
 | 
						|
    hard_item_pool: HardItemPool
 | 
						|
    special1s_per_warp: Special1sPerWarp
 | 
						|
    total_special1s: TotalSpecial1s
 | 
						|
    draculas_condition: DraculasCondition
 | 
						|
    percent_special2s_required: PercentSpecial2sRequired
 | 
						|
    total_special2s: TotalSpecial2s
 | 
						|
    bosses_required: BossesRequired
 | 
						|
    carrie_logic: CarrieLogic
 | 
						|
    hard_logic: HardLogic
 | 
						|
    multi_hit_breakables: MultiHitBreakables
 | 
						|
    empty_breakables: EmptyBreakables
 | 
						|
    lizard_locker_items: LizardLockerItems
 | 
						|
    shopsanity: Shopsanity
 | 
						|
    shop_prices: ShopPrices
 | 
						|
    minimum_gold_price: MinimumGoldPrice
 | 
						|
    maximum_gold_price: MaximumGoldPrice
 | 
						|
    post_behemoth_boss: PostBehemothBoss
 | 
						|
    room_of_clocks_boss: RoomOfClocksBoss
 | 
						|
    renon_fight_condition: RenonFightCondition
 | 
						|
    vincent_fight_condition: VincentFightCondition
 | 
						|
    bad_ending_condition: BadEndingCondition
 | 
						|
    increase_item_limit: IncreaseItemLimit
 | 
						|
    nerf_healing_items: NerfHealingItems
 | 
						|
    loading_zone_heals: LoadingZoneHeals
 | 
						|
    invisible_items: InvisibleItems
 | 
						|
    drop_previous_sub_weapon: DropPreviousSubWeapon
 | 
						|
    permanent_powerups: PermanentPowerUps
 | 
						|
    ice_trap_percentage: IceTrapPercentage
 | 
						|
    ice_trap_appearance: IceTrapAppearance
 | 
						|
    disable_time_restrictions: DisableTimeRestrictions
 | 
						|
    skip_gondolas: SkipGondolas
 | 
						|
    skip_waterway_blocks: SkipWaterwayBlocks
 | 
						|
    countdown: Countdown
 | 
						|
    big_toss: BigToss
 | 
						|
    panther_dash: PantherDash
 | 
						|
    increase_shimmy_speed: IncreaseShimmySpeed
 | 
						|
    background_music: BackgroundMusic
 | 
						|
    map_lighting: MapLighting
 | 
						|
    fall_guard: FallGuard
 | 
						|
    cinematic_experience: CinematicExperience
 | 
						|
    window_color_r: WindowColorR
 | 
						|
    window_color_g: WindowColorG
 | 
						|
    window_color_b: WindowColorB
 | 
						|
    window_color_a: WindowColorA
 | 
						|
    death_link: DeathLink
 | 
						|
    start_inventory_from_pool: StartInventoryPool
 |