Archipelago/worlds/overcooked2/Options.py

199 lines
7.1 KiB
Python
Raw Normal View History

2023-02-24 07:32:15 +00:00
from enum import IntEnum
from typing import TypedDict
from Options import DefaultOnToggle, Toggle, Range, Choice, OptionSet
from .Overcooked2Levels import Overcooked2Dlc
2023-02-24 07:32:15 +00:00
class LocationBalancingMode(IntEnum):
2023-02-17 08:21:56 +00:00
disabled = 0
compromise = 1
full = 2
2023-02-24 07:32:15 +00:00
class DeathLinkMode(IntEnum):
disabled = 0
death_only = 1
death_and_overcook = 2
class OC2OnToggle(DefaultOnToggle):
@property
def result(self) -> bool:
return bool(self.value)
2023-03-20 16:16:19 +00:00
class OC2Toggle(Toggle):
@property
def result(self) -> bool:
return bool(self.value)
2023-02-17 08:21:56 +00:00
class LocationBalancing(Choice):
2023-04-04 00:25:59 +00:00
"""Location balancing affects the density of progression items found in your world relative to other worlds. This setting changes nothing for solo games.
2023-02-17 08:21:56 +00:00
- Disabled: Location density in your world can fluctuate greatly depending on the settings of other players. In extreme cases, your world may be entirely populated with filler items
- Compromise: Locations are balanced to a midpoint between "fair" and "natural"
- Full: Locations are balanced in an attempt to make the number of progression items sent out and received equal over the entire game"""
auto_display_name = True
display_name = "Location Balancing"
option_disabled = LocationBalancingMode.disabled.value
option_compromise = LocationBalancingMode.compromise.value
option_full = LocationBalancingMode.full.value
default = LocationBalancingMode.compromise.value
2023-03-20 16:16:19 +00:00
class RampTricks(OC2Toggle):
"""If enabled, generated games may require sequence breaks on the overworld map. This includes crossing small gaps and escaping out of bounds."""
display_name = "Overworld Tricks"
2023-02-17 08:21:56 +00:00
2023-02-24 07:32:15 +00:00
class DeathLink(Choice):
2023-04-04 00:25:59 +00:00
"""DeathLink is an opt-in feature for Multiworlds where individual death events are propagated to all games with DeathLink enabled.
2023-02-24 07:32:15 +00:00
- Disabled: Death will behave as it does in the original game.
- Death Only: A DeathLink broadcast will be sent every time a chef falls into a stage hazard. All local chefs will be killed when any one perishes.
- Death and Overcook: Same as above, but an additional broadcast will be sent whenever the kitchen catches on fire from burnt food.
"""
auto_display_name = True
display_name = "DeathLink"
option_disabled = DeathLinkMode.disabled.value
option_death_only = DeathLinkMode.death_only.value
option_death_and_overcook = DeathLinkMode.death_and_overcook.value
default = DeathLinkMode.disabled.value
class AlwaysServeOldestOrder(OC2OnToggle):
"""Modifies the game so that serving an expired order doesn't target the ticket with the highest tip. This helps
players dig out of a broken tip combo faster."""
display_name = "Always Serve Oldest Order"
class AlwaysPreserveCookingProgress(OC2OnToggle):
"""Modifies the game to behave more like AYCE, where adding an item to an in-progress container doesn't reset the
entire progress bar."""
display_name = "Preserve Cooking/Mixing Progress"
2023-03-20 16:16:19 +00:00
class DisplayLeaderboardScores(OC2Toggle):
"""Modifies the Overworld map to fetch and display the current world records for each level. Press number keys 1-4
to view leaderboard scores for that number of players."""
display_name = "Display Leaderboard Scores"
class ShuffleLevelOrder(OC2OnToggle):
"""Shuffles the order of kitchens on the overworld map. Also draws from DLC maps."""
display_name = "Shuffle Level Order"
class DLCOptionSet(OptionSet):
"""Which DLCs should be included when 'Shuffle Level Order' is enabled?'"""
display_name = "Enabled DLC"
default = {"Story", "Seasonal"}
valid_keys = [dlc.value for dlc in Overcooked2Dlc]
class IncludeHordeLevels(OC2OnToggle):
2023-04-04 00:25:59 +00:00
"""Includes "Horde Defense" levels in the pool of possible kitchens when Shuffle Level Order is enabled. Also adds
two horde-specific items into the item pool."""
display_name = "Include Horde Levels"
class KevinLevels(OC2OnToggle):
"""Includes the 8 Kevin level locations on the map as unlockables. Turn off to make games shorter."""
display_name = "Kevin Level Checks"
class FixBugs(OC2OnToggle):
"""Fixes Bugs Present in the base game:
- Double Serving Exploit
- Sink Bug
- Control Stick Cancel/Throw Bug
- Can't Throw Near Empty Burner Bug"""
display_name = "Fix Bugs"
class ShorterLevelDuration(OC2OnToggle):
"""Modifies level duration to be about 1/3rd shorter than in the original game, thus bringing the item discovery
pace in line with other popular Archipelago games.
Points required to earn stars are scaled accordingly. ("Boss Levels" which change scenery mid-game are not
affected.)"""
display_name = "Shorter Level Duration"
class ShortHordeLevels(OC2OnToggle):
"""Modifies horde levels to contain roughly 1/3rd fewer waves than in the original game.
2023-04-04 00:25:59 +00:00
The kitchen's health is scaled appropriately to preserve the same approximate difficulty."""
display_name = "Shorter Horde Levels"
class PrepLevels(Choice):
"""Choose How "Prep Levels" are handled (levels where the timer does not start until the first order is served):
- Original: Prep Levels may appear
- Excluded: Prep Levels are excluded from the pool during level shuffling
- All You Can Eat: Prep Levels may appear, but the timer automatically starts. The star score requirements are also
adjusted to use the All You Can Eat World Record (if it exists)"""
auto_display_name = True
display_name = "Prep Level Behavior"
option_original = 0
option_excluded = 1
option_all_you_can_eat = 2
default = 1
class StarsToWin(Range):
"""Number of stars required to unlock 6-6.
Level purchase requirements between 1-1 and 6-6 will be spread between these two numbers. Using too high of a number
may result in more frequent generation failures, especially when horde levels are enabled."""
display_name = "Stars to Win"
range_start = 0
range_end = 100
default = 60
class StarThresholdScale(Range):
"""How difficult should the third star for each level be on a scale of 1-100%, where 100% is the current world
record score and 45% is the average vanilla 4-star score."""
display_name = "Star Difficulty %"
range_start = 1
range_end = 100
default = 35
overcooked_options = {
2023-02-17 08:21:56 +00:00
# generator options
"location_balancing": LocationBalancing,
2023-03-20 16:16:19 +00:00
"ramp_tricks": RampTricks,
2023-02-17 08:21:56 +00:00
2023-02-24 07:32:15 +00:00
# deathlink
"deathlink": DeathLink,
# randomization options
"shuffle_level_order": ShuffleLevelOrder,
"include_dlcs": DLCOptionSet,
"include_horde_levels": IncludeHordeLevels,
"prep_levels": PrepLevels,
"kevin_levels": KevinLevels,
# quality of life options
"fix_bugs": FixBugs,
"shorter_level_duration": ShorterLevelDuration,
"short_horde_levels": ShortHordeLevels,
"always_preserve_cooking_progress": AlwaysPreserveCookingProgress,
"always_serve_oldest_order": AlwaysServeOldestOrder,
"display_leaderboard_scores": DisplayLeaderboardScores,
# difficulty settings
"stars_to_win": StarsToWin,
"star_threshold_scale": StarThresholdScale,
}
OC2Options = TypedDict("OC2Options", {option.__name__: option for option in overcooked_options.values()})