771 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			771 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import List, TYPE_CHECKING, Dict, Any
 | 
						|
from schema import Schema, Optional
 | 
						|
from dataclasses import dataclass
 | 
						|
from worlds.AutoWorld import PerGameCommonOptions
 | 
						|
from Options import Range, Toggle, DeathLink, Choice, OptionDict, DefaultOnToggle, OptionGroup
 | 
						|
 | 
						|
if TYPE_CHECKING:
 | 
						|
    from . import HatInTimeWorld
 | 
						|
 | 
						|
 | 
						|
def create_option_groups() -> List[OptionGroup]:
 | 
						|
    option_group_list: List[OptionGroup] = []
 | 
						|
    for name, options in ahit_option_groups.items():
 | 
						|
        option_group_list.append(OptionGroup(name=name, options=options))
 | 
						|
 | 
						|
    return option_group_list
 | 
						|
 | 
						|
 | 
						|
def adjust_options(world: "HatInTimeWorld"):
 | 
						|
    if world.options.HighestChapterCost < world.options.LowestChapterCost:
 | 
						|
        world.options.HighestChapterCost.value, world.options.LowestChapterCost.value = \
 | 
						|
         world.options.LowestChapterCost.value, world.options.HighestChapterCost.value
 | 
						|
 | 
						|
    if world.options.FinalChapterMaxCost < world.options.FinalChapterMinCost:
 | 
						|
        world.options.FinalChapterMaxCost.value, world.options.FinalChapterMinCost.value = \
 | 
						|
         world.options.FinalChapterMinCost.value, world.options.FinalChapterMaxCost.value
 | 
						|
 | 
						|
    if world.options.BadgeSellerMaxItems < world.options.BadgeSellerMinItems:
 | 
						|
        world.options.BadgeSellerMaxItems.value, world.options.BadgeSellerMinItems.value = \
 | 
						|
         world.options.BadgeSellerMinItems.value, world.options.BadgeSellerMaxItems.value
 | 
						|
 | 
						|
    if world.options.NyakuzaThugMaxShopItems < world.options.NyakuzaThugMinShopItems:
 | 
						|
        world.options.NyakuzaThugMaxShopItems.value, world.options.NyakuzaThugMinShopItems.value = \
 | 
						|
         world.options.NyakuzaThugMinShopItems.value, world.options.NyakuzaThugMaxShopItems.value
 | 
						|
 | 
						|
    if world.options.DWShuffleCountMax < world.options.DWShuffleCountMin:
 | 
						|
        world.options.DWShuffleCountMax.value, world.options.DWShuffleCountMin.value = \
 | 
						|
         world.options.DWShuffleCountMin.value, world.options.DWShuffleCountMax.value
 | 
						|
 | 
						|
    total_tps: int = get_total_time_pieces(world)
 | 
						|
    if world.options.HighestChapterCost > total_tps-5:
 | 
						|
        world.options.HighestChapterCost.value = min(45, total_tps-5)
 | 
						|
 | 
						|
    if world.options.LowestChapterCost > total_tps-5:
 | 
						|
        world.options.LowestChapterCost.value = min(45, total_tps-5)
 | 
						|
 | 
						|
    if world.options.FinalChapterMaxCost > total_tps:
 | 
						|
        world.options.FinalChapterMaxCost.value = min(50, total_tps)
 | 
						|
 | 
						|
    if world.options.FinalChapterMinCost > total_tps:
 | 
						|
        world.options.FinalChapterMinCost.value = min(50, total_tps)
 | 
						|
 | 
						|
    if world.is_dlc1() and world.options.ShipShapeCustomTaskGoal <= 0:
 | 
						|
        # automatically determine task count based on Tasksanity settings
 | 
						|
        if world.options.Tasksanity:
 | 
						|
            world.options.ShipShapeCustomTaskGoal.value = world.options.TasksanityCheckCount * world.options.TasksanityTaskStep
 | 
						|
        else:
 | 
						|
            world.options.ShipShapeCustomTaskGoal.value = 18
 | 
						|
 | 
						|
    # Don't allow Rush Hour goal if DLC2 content is disabled
 | 
						|
    if world.options.EndGoal == EndGoal.option_rush_hour and not world.options.EnableDLC2:
 | 
						|
        world.options.EndGoal.value = EndGoal.option_finale
 | 
						|
 | 
						|
    # Don't allow Seal the Deal goal if Death Wish content is disabled
 | 
						|
    if world.options.EndGoal == EndGoal.option_seal_the_deal and not world.is_dw():
 | 
						|
        world.options.EndGoal.value = EndGoal.option_finale
 | 
						|
 | 
						|
    if world.options.DWEnableBonus:
 | 
						|
        world.options.DWAutoCompleteBonuses.value = 0
 | 
						|
 | 
						|
    if world.is_dw_only():
 | 
						|
        world.options.EndGoal.value = EndGoal.option_seal_the_deal
 | 
						|
        world.options.ActRandomizer.value = 0
 | 
						|
        world.options.ShuffleAlpineZiplines.value = 0
 | 
						|
        world.options.ShuffleSubconPaintings.value = 0
 | 
						|
        world.options.ShuffleStorybookPages.value = 0
 | 
						|
        world.options.ShuffleActContracts.value = 0
 | 
						|
        world.options.EnableDLC1.value = 0
 | 
						|
        world.options.LogicDifficulty.value = LogicDifficulty.option_normal
 | 
						|
        world.options.DWTimePieceRequirement.value = 0
 | 
						|
 | 
						|
 | 
						|
def get_total_time_pieces(world: "HatInTimeWorld") -> int:
 | 
						|
    count: int = 40
 | 
						|
    if world.is_dlc1():
 | 
						|
        count += 6
 | 
						|
 | 
						|
    if world.is_dlc2():
 | 
						|
        count += 10
 | 
						|
 | 
						|
    return min(40+world.options.MaxExtraTimePieces, count)
 | 
						|
 | 
						|
 | 
						|
class EndGoal(Choice):
 | 
						|
    """The end goal required to beat the game.
 | 
						|
    Finale: Reach Time's End and beat Mustache Girl. The Finale will be in its vanilla location.
 | 
						|
 | 
						|
    Rush Hour: Reach and complete Rush Hour. The level will be in its vanilla location and Chapter 7
 | 
						|
    will be the final chapter. You also must find Nyakuza Metro itself and complete all of its levels.
 | 
						|
    Requires DLC2 content to be enabled.
 | 
						|
 | 
						|
    Seal the Deal: Reach and complete the Seal the Deal death wish main objective.
 | 
						|
    Requires Death Wish content to be enabled."""
 | 
						|
    display_name = "End Goal"
 | 
						|
    option_finale = 1
 | 
						|
    option_rush_hour = 2
 | 
						|
    option_seal_the_deal = 3
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class ActRandomizer(Choice):
 | 
						|
    """If enabled, shuffle the game's Acts between each other.
 | 
						|
    Light will cause Time Rifts to only be shuffled amongst each other,
 | 
						|
    and Blue Time Rifts and Purple Time Rifts to be shuffled separately."""
 | 
						|
    display_name = "Shuffle Acts"
 | 
						|
    option_false = 0
 | 
						|
    option_light = 1
 | 
						|
    option_insanity = 2
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class ActPlando(OptionDict):
 | 
						|
    """Plando acts onto other acts. For example, \"Train Rush\": \"Alpine Free Roam\" will place Alpine Free Roam
 | 
						|
    at Train Rush."""
 | 
						|
    display_name = "Act Plando"
 | 
						|
    schema = Schema({
 | 
						|
        Optional(str): str
 | 
						|
    })
 | 
						|
 | 
						|
 | 
						|
class ActBlacklist(OptionDict):
 | 
						|
    """Blacklist acts from being shuffled onto other acts. Multiple can be listed per act.
 | 
						|
    For example, \"Barrel Battle\": [\"The Big Parade\", \"Dead Bird Studio\"]
 | 
						|
    will prevent The Big Parade and Dead Bird Studio from being shuffled onto Barrel Battle."""
 | 
						|
    display_name = "Act Blacklist"
 | 
						|
    schema = Schema({
 | 
						|
        Optional(str): list
 | 
						|
    })
 | 
						|
 | 
						|
 | 
						|
class FinaleShuffle(Toggle):
 | 
						|
    """If enabled, chapter finales will only be shuffled amongst each other in act shuffle."""
 | 
						|
    display_name = "Finale Shuffle"
 | 
						|
 | 
						|
 | 
						|
class LogicDifficulty(Choice):
 | 
						|
    """Choose the difficulty setting for logic.
 | 
						|
    For an exhaustive list of all logic tricks for each difficulty, see this Google Doc:
 | 
						|
    https://docs.google.com/document/d/1x9VLSQ5davfx1KGamR9T0mD5h69_lDXJ6H7Gq7knJRI/edit?usp=sharing"""
 | 
						|
    display_name = "Logic Difficulty"
 | 
						|
    option_normal = -1
 | 
						|
    option_moderate = 0
 | 
						|
    option_hard = 1
 | 
						|
    option_expert = 2
 | 
						|
    default = -1
 | 
						|
 | 
						|
 | 
						|
class CTRLogic(Choice):
 | 
						|
    """Choose how you want to logically clear Cheating the Race."""
 | 
						|
    display_name = "Cheating the Race Logic"
 | 
						|
    option_time_stop_only = 0
 | 
						|
    option_scooter = 1
 | 
						|
    option_sprint = 2
 | 
						|
    option_nothing = 3
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class RandomizeHatOrder(Choice):
 | 
						|
    """Randomize the order that hats are stitched in.
 | 
						|
    Time Stop Last will force Time Stop to be the last hat in the sequence."""
 | 
						|
    display_name = "Randomize Hat Order"
 | 
						|
    option_false = 0
 | 
						|
    option_true = 1
 | 
						|
    option_time_stop_last = 2
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class YarnBalancePercent(Range):
 | 
						|
    """How much (in percentage) of the yarn in the pool that will be progression balanced."""
 | 
						|
    display_name = "Yarn Balance Percentage"
 | 
						|
    default = 20
 | 
						|
    range_start = 0
 | 
						|
    range_end = 100
 | 
						|
 | 
						|
 | 
						|
class TimePieceBalancePercent(Range):
 | 
						|
    """How much (in percentage) of time pieces in the pool that will be progression balanced."""
 | 
						|
    display_name = "Time Piece Balance Percentage"
 | 
						|
    default = 35
 | 
						|
    range_start = 0
 | 
						|
    range_end = 100
 | 
						|
 | 
						|
 | 
						|
class StartWithCompassBadge(DefaultOnToggle):
 | 
						|
    """If enabled, start with the Compass Badge. In Archipelago, the Compass Badge will track all items in the world
 | 
						|
    (instead of just Relics). Recommended if you're not familiar with where item locations are."""
 | 
						|
    display_name = "Start with Compass Badge"
 | 
						|
 | 
						|
 | 
						|
class CompassBadgeMode(Choice):
 | 
						|
    """closest - Compass Badge points to the closest item regardless of classification
 | 
						|
    important_only - Compass Badge points to progression/useful items only
 | 
						|
    important_first - Compass Badge points to progression/useful items first, then it will point to junk items"""
 | 
						|
    display_name = "Compass Badge Mode"
 | 
						|
    option_closest = 1
 | 
						|
    option_important_only = 2
 | 
						|
    option_important_first = 3
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class UmbrellaLogic(Toggle):
 | 
						|
    """Makes Hat Kid's default punch attack do absolutely nothing, making the Umbrella much more relevant and useful"""
 | 
						|
    display_name = "Umbrella Logic"
 | 
						|
 | 
						|
 | 
						|
class ShuffleStorybookPages(DefaultOnToggle):
 | 
						|
    """If enabled, each storybook page in the purple Time Rifts is an item check.
 | 
						|
    The Compass Badge can track these down for you."""
 | 
						|
    display_name = "Shuffle Storybook Pages"
 | 
						|
 | 
						|
 | 
						|
class ShuffleActContracts(DefaultOnToggle):
 | 
						|
    """If enabled, shuffle Snatcher's act contracts into the pool as items"""
 | 
						|
    display_name = "Shuffle Contracts"
 | 
						|
 | 
						|
 | 
						|
class ShuffleAlpineZiplines(Toggle):
 | 
						|
    """If enabled, Alpine's zipline paths leading to the peaks will be locked behind items."""
 | 
						|
    display_name = "Shuffle Alpine Ziplines"
 | 
						|
 | 
						|
 | 
						|
class ShuffleSubconPaintings(Toggle):
 | 
						|
    """If enabled, shuffle items into the pool that unlock Subcon Forest fire spirit paintings.
 | 
						|
    These items are progressive, with the order of Village-Swamp-Courtyard."""
 | 
						|
    display_name = "Shuffle Subcon Paintings"
 | 
						|
 | 
						|
 | 
						|
class NoPaintingSkips(Toggle):
 | 
						|
    """If enabled, prevent Subcon fire wall skips from being in logic on higher difficulty settings."""
 | 
						|
    display_name = "No Subcon Fire Wall Skips"
 | 
						|
 | 
						|
 | 
						|
class StartingChapter(Choice):
 | 
						|
    """Determines which chapter you will be guaranteed to be able to enter at the beginning of the game."""
 | 
						|
    display_name = "Starting Chapter"
 | 
						|
    option_1 = 1
 | 
						|
    option_2 = 2
 | 
						|
    option_3 = 3
 | 
						|
    option_4 = 4
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class ChapterCostIncrement(Range):
 | 
						|
    """Lower values mean chapter costs increase slower. Higher values make the cost differences more steep."""
 | 
						|
    display_name = "Chapter Cost Increment"
 | 
						|
    range_start = 1
 | 
						|
    range_end = 8
 | 
						|
    default = 4
 | 
						|
 | 
						|
 | 
						|
class ChapterCostMinDifference(Range):
 | 
						|
    """The minimum difference between chapter costs."""
 | 
						|
    display_name = "Minimum Chapter Cost Difference"
 | 
						|
    range_start = 1
 | 
						|
    range_end = 8
 | 
						|
    default = 4
 | 
						|
 | 
						|
 | 
						|
class LowestChapterCost(Range):
 | 
						|
    """Value determining the lowest possible cost for a chapter.
 | 
						|
    Chapter costs will, progressively, be calculated based on this value (except for the final chapter)."""
 | 
						|
    display_name = "Lowest Possible Chapter Cost"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 10
 | 
						|
    default = 5
 | 
						|
 | 
						|
 | 
						|
class HighestChapterCost(Range):
 | 
						|
    """Value determining the highest possible cost for a chapter.
 | 
						|
    Chapter costs will, progressively, be calculated based on this value (except for the final chapter)."""
 | 
						|
    display_name = "Highest Possible Chapter Cost"
 | 
						|
    range_start = 15
 | 
						|
    range_end = 45
 | 
						|
    default = 25
 | 
						|
 | 
						|
 | 
						|
class FinalChapterMinCost(Range):
 | 
						|
    """Minimum Time Pieces required to enter the final chapter. This is part of your goal."""
 | 
						|
    display_name = "Final Chapter Minimum Time Piece Cost"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 50
 | 
						|
    default = 30
 | 
						|
 | 
						|
 | 
						|
class FinalChapterMaxCost(Range):
 | 
						|
    """Maximum Time Pieces required to enter the final chapter. This is part of your goal."""
 | 
						|
    display_name = "Final Chapter Maximum Time Piece Cost"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 50
 | 
						|
    default = 35
 | 
						|
 | 
						|
 | 
						|
class MaxExtraTimePieces(Range):
 | 
						|
    """Maximum number of extra Time Pieces from the DLCs.
 | 
						|
    Arctic Cruise will add up to 6. Nyakuza Metro will add up to 10. The absolute maximum is 56."""
 | 
						|
    display_name = "Max Extra Time Pieces"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 16
 | 
						|
    default = 16
 | 
						|
 | 
						|
 | 
						|
class YarnCostMin(Range):
 | 
						|
    """The minimum possible yarn needed to stitch a hat."""
 | 
						|
    display_name = "Minimum Yarn Cost"
 | 
						|
    range_start = 1
 | 
						|
    range_end = 12
 | 
						|
    default = 4
 | 
						|
 | 
						|
 | 
						|
class YarnCostMax(Range):
 | 
						|
    """The maximum possible yarn needed to stitch a hat."""
 | 
						|
    display_name = "Maximum Yarn Cost"
 | 
						|
    range_start = 1
 | 
						|
    range_end = 12
 | 
						|
    default = 8
 | 
						|
 | 
						|
 | 
						|
class YarnAvailable(Range):
 | 
						|
    """How much yarn is available to collect in the item pool."""
 | 
						|
    display_name = "Yarn Available"
 | 
						|
    range_start = 30
 | 
						|
    range_end = 80
 | 
						|
    default = 50
 | 
						|
 | 
						|
 | 
						|
class MinExtraYarn(Range):
 | 
						|
    """The minimum number of extra yarn in the item pool.
 | 
						|
    There must be at least this much more yarn over the total number of yarn needed to craft all hats.
 | 
						|
    For example, if this option's value is 10, and the total yarn needed to craft all hats is 40,
 | 
						|
    there must be at least 50 yarn in the pool."""
 | 
						|
    display_name = "Max Extra Yarn"
 | 
						|
    range_start = 5
 | 
						|
    range_end = 15
 | 
						|
    default = 10
 | 
						|
 | 
						|
 | 
						|
class HatItems(Toggle):
 | 
						|
    """Removes all yarn from the pool and turns the hats into individual items instead."""
 | 
						|
    display_name = "Hat Items"
 | 
						|
 | 
						|
 | 
						|
class MinPonCost(Range):
 | 
						|
    """The minimum number of Pons that any item in the Badge Seller's shop can cost."""
 | 
						|
    display_name = "Minimum Shop Pon Cost"
 | 
						|
    range_start = 10
 | 
						|
    range_end = 800
 | 
						|
    default = 75
 | 
						|
 | 
						|
 | 
						|
class MaxPonCost(Range):
 | 
						|
    """The maximum number of Pons that any item in the Badge Seller's shop can cost."""
 | 
						|
    display_name = "Maximum Shop Pon Cost"
 | 
						|
    range_start = 10
 | 
						|
    range_end = 800
 | 
						|
    default = 300
 | 
						|
 | 
						|
 | 
						|
class BadgeSellerMinItems(Range):
 | 
						|
    """The smallest number of items that the Badge Seller can have for sale."""
 | 
						|
    display_name = "Badge Seller Minimum Items"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 10
 | 
						|
    default = 4
 | 
						|
 | 
						|
 | 
						|
class BadgeSellerMaxItems(Range):
 | 
						|
    """The largest number of items that the Badge Seller can have for sale."""
 | 
						|
    display_name = "Badge Seller Maximum Items"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 10
 | 
						|
    default = 8
 | 
						|
 | 
						|
 | 
						|
class EnableDLC1(Toggle):
 | 
						|
    """Shuffle content from The Arctic Cruise (Chapter 6) into the game. This also includes the Tour time rift.
 | 
						|
    DO NOT ENABLE THIS OPTION IF YOU DO NOT HAVE SEAL THE DEAL DLC INSTALLED!!!"""
 | 
						|
    display_name = "Shuffle Chapter 6"
 | 
						|
 | 
						|
 | 
						|
class Tasksanity(Toggle):
 | 
						|
    """If enabled, Ship Shape tasks will become checks. Requires DLC1 content to be enabled."""
 | 
						|
    display_name = "Tasksanity"
 | 
						|
 | 
						|
 | 
						|
class TasksanityTaskStep(Range):
 | 
						|
    """How many tasks the player must complete in Tasksanity to send a check."""
 | 
						|
    display_name = "Tasksanity Task Step"
 | 
						|
    range_start = 1
 | 
						|
    range_end = 3
 | 
						|
    default = 1
 | 
						|
 | 
						|
 | 
						|
class TasksanityCheckCount(Range):
 | 
						|
    """How many Tasksanity checks there will be in total."""
 | 
						|
    display_name = "Tasksanity Check Count"
 | 
						|
    range_start = 1
 | 
						|
    range_end = 30
 | 
						|
    default = 18
 | 
						|
 | 
						|
 | 
						|
class ExcludeTour(Toggle):
 | 
						|
    """Removes the Tour time rift from the game. This option is recommended if you don't want to deal with
 | 
						|
    important levels being shuffled onto the Tour time rift, or important items being shuffled onto Tour pages
 | 
						|
    when your goal is Time's End."""
 | 
						|
    display_name = "Exclude Tour Time Rift"
 | 
						|
 | 
						|
 | 
						|
class ShipShapeCustomTaskGoal(Range):
 | 
						|
    """Change the number of tasks required to complete Ship Shape. If this option's value is 0, the number of tasks
 | 
						|
    required will be TasksanityTaskStep x TasksanityCheckCount, if Tasksanity is enabled. If Tasksanity is disabled,
 | 
						|
    it will use the game's default of 18.
 | 
						|
    This option will not affect Cruisin' for a Bruisin'."""
 | 
						|
    display_name = "Ship Shape Custom Task Goal"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 90
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class EnableDLC2(Toggle):
 | 
						|
    """Shuffle content from Nyakuza Metro (Chapter 7) into the game.
 | 
						|
    DO NOT ENABLE THIS OPTION IF YOU DO NOT HAVE NYAKUZA METRO DLC INSTALLED!!!"""
 | 
						|
    display_name = "Shuffle Chapter 7"
 | 
						|
 | 
						|
 | 
						|
class MetroMinPonCost(Range):
 | 
						|
    """The cheapest an item can be in any Nyakuza Metro shop. Includes ticket booths."""
 | 
						|
    display_name = "Metro Shops Minimum Pon Cost"
 | 
						|
    range_start = 10
 | 
						|
    range_end = 800
 | 
						|
    default = 50
 | 
						|
 | 
						|
 | 
						|
class MetroMaxPonCost(Range):
 | 
						|
    """The most expensive an item can be in any Nyakuza Metro shop. Includes ticket booths."""
 | 
						|
    display_name = "Metro Shops Maximum Pon Cost"
 | 
						|
    range_start = 10
 | 
						|
    range_end = 800
 | 
						|
    default = 200
 | 
						|
 | 
						|
 | 
						|
class NyakuzaThugMinShopItems(Range):
 | 
						|
    """The smallest number of items that the thugs in Nyakuza Metro can have for sale."""
 | 
						|
    display_name = "Nyakuza Thug Minimum Shop Items"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 5
 | 
						|
    default = 2
 | 
						|
 | 
						|
 | 
						|
class NyakuzaThugMaxShopItems(Range):
 | 
						|
    """The largest number of items that the thugs in Nyakuza Metro can have for sale."""
 | 
						|
    display_name = "Nyakuza Thug Maximum Shop Items"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 5
 | 
						|
    default = 4
 | 
						|
 | 
						|
 | 
						|
class NoTicketSkips(Choice):
 | 
						|
    """Prevent metro gate skips from being in logic on higher difficulties.
 | 
						|
    Rush Hour option will only consider the ticket skips for Rush Hour in logic."""
 | 
						|
    display_name = "No Ticket Skips"
 | 
						|
    option_false = 0
 | 
						|
    option_true = 1
 | 
						|
    option_rush_hour = 2
 | 
						|
 | 
						|
 | 
						|
class BaseballBat(Toggle):
 | 
						|
    """Replace the Umbrella with the baseball bat from Nyakuza Metro.
 | 
						|
    DLC2 content does not have to be shuffled for this option but Nyakuza Metro still needs to be installed."""
 | 
						|
    display_name = "Baseball Bat"
 | 
						|
 | 
						|
 | 
						|
class EnableDeathWish(Toggle):
 | 
						|
    """Shuffle Death Wish contracts into the game. Each contract by default will have 1 check granted upon completion.
 | 
						|
    DO NOT ENABLE THIS OPTION IF YOU DO NOT HAVE SEAL THE DEAL DLC INSTALLED!!!"""
 | 
						|
    display_name = "Enable Death Wish"
 | 
						|
 | 
						|
 | 
						|
class DeathWishOnly(Toggle):
 | 
						|
    """An alternative gameplay mode that allows you to exclusively play Death Wish in a seed.
 | 
						|
    This has the following effects:
 | 
						|
    - Death Wish is instantly unlocked from the start
 | 
						|
    - All hats and other progression items are instantly given to you
 | 
						|
    - Useful items such as Fast Hatter Badge will still be in the item pool instead of in your inventory at the start
 | 
						|
    - All chapters and their levels are unlocked, act shuffle is forced off
 | 
						|
    - Any checks other than Death Wish contracts are completely removed
 | 
						|
    - All Pons in the item pool are replaced with Health Pons or random cosmetics
 | 
						|
    - The EndGoal option is forced to complete Seal the Deal"""
 | 
						|
    display_name = "Death Wish Only"
 | 
						|
 | 
						|
 | 
						|
class DWShuffle(Toggle):
 | 
						|
    """An alternative mode for Death Wish where each contract is unlocked one by one, in a random order.
 | 
						|
    Stamp requirements to unlock contracts is removed. Any excluded contracts will not be shuffled into the sequence.
 | 
						|
    If Seal the Deal is the end goal, it will always be the last Death Wish in the sequence.
 | 
						|
    Disabling candles is highly recommended."""
 | 
						|
    display_name = "Death Wish Shuffle"
 | 
						|
 | 
						|
 | 
						|
class DWShuffleCountMin(Range):
 | 
						|
    """The minimum number of Death Wishes that can be in the Death Wish shuffle sequence.
 | 
						|
    The final result is clamped at the number of non-excluded Death Wishes."""
 | 
						|
    display_name = "Death Wish Shuffle Minimum Count"
 | 
						|
    range_start = 5
 | 
						|
    range_end = 38
 | 
						|
    default = 18
 | 
						|
 | 
						|
 | 
						|
class DWShuffleCountMax(Range):
 | 
						|
    """The maximum number of Death Wishes that can be in the Death Wish shuffle sequence.
 | 
						|
    The final result is clamped at the number of non-excluded Death Wishes."""
 | 
						|
    display_name = "Death Wish Shuffle Maximum Count"
 | 
						|
    range_start = 5
 | 
						|
    range_end = 38
 | 
						|
    default = 25
 | 
						|
 | 
						|
 | 
						|
class DWEnableBonus(Toggle):
 | 
						|
    """In Death Wish, add a location for completing all of a DW contract's bonuses,
 | 
						|
    in addition to the location for completing the DW contract normally.
 | 
						|
    WARNING!! Only for the brave! This option can create VERY DIFFICULT SEEDS!
 | 
						|
    ONLY turn this on if you know what you are doing to yourself and everyone else in the multiworld!
 | 
						|
    Using Peace and Tranquility to auto-complete the bonuses will NOT count!"""
 | 
						|
    display_name = "Shuffle Death Wish Full Completions"
 | 
						|
 | 
						|
 | 
						|
class DWAutoCompleteBonuses(DefaultOnToggle):
 | 
						|
    """If enabled, auto complete all bonus stamps after completing the main objective in a Death Wish.
 | 
						|
    This option will have no effect if bonus checks (DWEnableBonus) are turned on."""
 | 
						|
    display_name = "Auto Complete Bonus Stamps"
 | 
						|
 | 
						|
 | 
						|
class DWExcludeAnnoyingContracts(DefaultOnToggle):
 | 
						|
    """Exclude Death Wish contracts from the pool that are particularly tedious or take a long time to reach/clear.
 | 
						|
    Excluded Death Wishes are automatically completed as soon as they are unlocked.
 | 
						|
    This option currently excludes the following contracts:
 | 
						|
    - Vault Codes in the Wind
 | 
						|
    - Boss Rush
 | 
						|
    - Camera Tourist
 | 
						|
    - The Mustache Gauntlet
 | 
						|
    - Rift Collapse: Deep Sea
 | 
						|
    - Cruisin' for a Bruisin'
 | 
						|
    - Seal the Deal (non-excluded if goal, but the checks are still excluded)"""
 | 
						|
    display_name = "Exclude Annoying Death Wish Contracts"
 | 
						|
 | 
						|
 | 
						|
class DWExcludeAnnoyingBonuses(DefaultOnToggle):
 | 
						|
    """If Death Wish full completions are shuffled in, exclude tedious Death Wish full completions from the pool.
 | 
						|
    Excluded bonus Death Wishes automatically reward their bonus stamps upon completion of the main objective.
 | 
						|
    This option currently excludes the following bonuses:
 | 
						|
    - So You're Back From Outer Space
 | 
						|
    - Encore! Encore!
 | 
						|
    - Snatcher's Hit List
 | 
						|
    - 10 Seconds until Self-Destruct
 | 
						|
    - Killing Two Birds
 | 
						|
    - Zero Jumps
 | 
						|
    - Bird Sanctuary
 | 
						|
    - Wound-Up Windmill
 | 
						|
    - Vault Codes in the Wind
 | 
						|
    - Boss Rush
 | 
						|
    - Camera Tourist
 | 
						|
    - The Mustache Gauntlet
 | 
						|
    - Rift Collapse: Deep Sea
 | 
						|
    - Cruisin' for a Bruisin'
 | 
						|
    - Seal the Deal"""
 | 
						|
    display_name = "Exclude Annoying Death Wish Full Completions"
 | 
						|
 | 
						|
 | 
						|
class DWExcludeCandles(DefaultOnToggle):
 | 
						|
    """If enabled, exclude all candle Death Wishes."""
 | 
						|
    display_name = "Exclude Candle Death Wishes"
 | 
						|
 | 
						|
 | 
						|
class DWTimePieceRequirement(Range):
 | 
						|
    """How many Time Pieces that will be required to unlock Death Wish."""
 | 
						|
    display_name = "Death Wish Time Piece Requirement"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 35
 | 
						|
    default = 15
 | 
						|
 | 
						|
 | 
						|
class TrapChance(Range):
 | 
						|
    """The chance for any junk item in the pool to be replaced by a trap."""
 | 
						|
    display_name = "Trap Chance"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 100
 | 
						|
    default = 0
 | 
						|
 | 
						|
 | 
						|
class BabyTrapWeight(Range):
 | 
						|
    """The weight of Baby Traps in the trap pool.
 | 
						|
    Baby Traps place a multitude of the Conductor's grandkids into Hat Kid's hands, causing her to lose her balance."""
 | 
						|
    display_name = "Baby Trap Weight"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 100
 | 
						|
    default = 40
 | 
						|
 | 
						|
 | 
						|
class LaserTrapWeight(Range):
 | 
						|
    """The weight of Laser Traps in the trap pool.
 | 
						|
    Laser Traps will spawn multiple giant lasers (from Snatcher's boss fight) at Hat Kid's location."""
 | 
						|
    display_name = "Laser Trap Weight"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 100
 | 
						|
    default = 40
 | 
						|
 | 
						|
 | 
						|
class ParadeTrapWeight(Range):
 | 
						|
    """The weight of Parade Traps in the trap pool.
 | 
						|
    Parade Traps will summon multiple Express Band owls with knives that chase Hat Kid by mimicking her movement."""
 | 
						|
    display_name = "Parade Trap Weight"
 | 
						|
    range_start = 0
 | 
						|
    range_end = 100
 | 
						|
    default = 20
 | 
						|
 | 
						|
 | 
						|
@dataclass
 | 
						|
class AHITOptions(PerGameCommonOptions):
 | 
						|
    EndGoal:                  EndGoal
 | 
						|
    ActRandomizer:            ActRandomizer
 | 
						|
    ActPlando:                ActPlando
 | 
						|
    ActBlacklist:             ActBlacklist
 | 
						|
    ShuffleAlpineZiplines:    ShuffleAlpineZiplines
 | 
						|
    FinaleShuffle:            FinaleShuffle
 | 
						|
    LogicDifficulty:          LogicDifficulty
 | 
						|
    YarnBalancePercent:       YarnBalancePercent
 | 
						|
    TimePieceBalancePercent:  TimePieceBalancePercent
 | 
						|
    RandomizeHatOrder:        RandomizeHatOrder
 | 
						|
    UmbrellaLogic:            UmbrellaLogic
 | 
						|
    StartWithCompassBadge:    StartWithCompassBadge
 | 
						|
    CompassBadgeMode:         CompassBadgeMode
 | 
						|
    ShuffleStorybookPages:    ShuffleStorybookPages
 | 
						|
    ShuffleActContracts:      ShuffleActContracts
 | 
						|
    ShuffleSubconPaintings:   ShuffleSubconPaintings
 | 
						|
    NoPaintingSkips:          NoPaintingSkips
 | 
						|
    StartingChapter:          StartingChapter
 | 
						|
    CTRLogic:                 CTRLogic
 | 
						|
 | 
						|
    EnableDLC1:               EnableDLC1
 | 
						|
    Tasksanity:               Tasksanity
 | 
						|
    TasksanityTaskStep:       TasksanityTaskStep
 | 
						|
    TasksanityCheckCount:     TasksanityCheckCount
 | 
						|
    ExcludeTour:              ExcludeTour
 | 
						|
    ShipShapeCustomTaskGoal:  ShipShapeCustomTaskGoal
 | 
						|
 | 
						|
    EnableDeathWish:              EnableDeathWish
 | 
						|
    DWShuffle:                    DWShuffle
 | 
						|
    DWShuffleCountMin:            DWShuffleCountMin
 | 
						|
    DWShuffleCountMax:            DWShuffleCountMax
 | 
						|
    DeathWishOnly:                DeathWishOnly
 | 
						|
    DWEnableBonus:                DWEnableBonus
 | 
						|
    DWAutoCompleteBonuses:        DWAutoCompleteBonuses
 | 
						|
    DWExcludeAnnoyingContracts:   DWExcludeAnnoyingContracts
 | 
						|
    DWExcludeAnnoyingBonuses:     DWExcludeAnnoyingBonuses
 | 
						|
    DWExcludeCandles:             DWExcludeCandles
 | 
						|
    DWTimePieceRequirement:       DWTimePieceRequirement
 | 
						|
 | 
						|
    EnableDLC2:               EnableDLC2
 | 
						|
    BaseballBat:              BaseballBat
 | 
						|
    MetroMinPonCost:          MetroMinPonCost
 | 
						|
    MetroMaxPonCost:          MetroMaxPonCost
 | 
						|
    NyakuzaThugMinShopItems:  NyakuzaThugMinShopItems
 | 
						|
    NyakuzaThugMaxShopItems:  NyakuzaThugMaxShopItems
 | 
						|
    NoTicketSkips:            NoTicketSkips
 | 
						|
 | 
						|
    LowestChapterCost:        LowestChapterCost
 | 
						|
    HighestChapterCost:       HighestChapterCost
 | 
						|
    ChapterCostIncrement:     ChapterCostIncrement
 | 
						|
    ChapterCostMinDifference: ChapterCostMinDifference
 | 
						|
    MaxExtraTimePieces:       MaxExtraTimePieces
 | 
						|
 | 
						|
    FinalChapterMinCost:          FinalChapterMinCost
 | 
						|
    FinalChapterMaxCost:          FinalChapterMaxCost
 | 
						|
 | 
						|
    YarnCostMin:              YarnCostMin
 | 
						|
    YarnCostMax:              YarnCostMax
 | 
						|
    YarnAvailable:            YarnAvailable
 | 
						|
    MinExtraYarn:             MinExtraYarn
 | 
						|
    HatItems:                 HatItems
 | 
						|
 | 
						|
    MinPonCost:               MinPonCost
 | 
						|
    MaxPonCost:               MaxPonCost
 | 
						|
    BadgeSellerMinItems:      BadgeSellerMinItems
 | 
						|
    BadgeSellerMaxItems:      BadgeSellerMaxItems
 | 
						|
 | 
						|
    TrapChance:               TrapChance
 | 
						|
    BabyTrapWeight:           BabyTrapWeight
 | 
						|
    LaserTrapWeight:          LaserTrapWeight
 | 
						|
    ParadeTrapWeight:         ParadeTrapWeight
 | 
						|
 | 
						|
    death_link:               DeathLink
 | 
						|
 | 
						|
 | 
						|
ahit_option_groups: Dict[str, List[Any]] = {
 | 
						|
    "General Options": [EndGoal, ShuffleStorybookPages, ShuffleAlpineZiplines, ShuffleSubconPaintings,
 | 
						|
                        ShuffleActContracts, MinPonCost, MaxPonCost, BadgeSellerMinItems, BadgeSellerMaxItems,
 | 
						|
                        LogicDifficulty, NoPaintingSkips, CTRLogic],
 | 
						|
 | 
						|
    "Act Options": [ActRandomizer, StartingChapter, LowestChapterCost, HighestChapterCost,
 | 
						|
                    ChapterCostIncrement, ChapterCostMinDifference, FinalChapterMinCost, FinalChapterMaxCost,
 | 
						|
                    FinaleShuffle, ActPlando, ActBlacklist],
 | 
						|
 | 
						|
    "Item Options": [StartWithCompassBadge, CompassBadgeMode, RandomizeHatOrder, YarnAvailable, YarnCostMin,
 | 
						|
                     YarnCostMax, MinExtraYarn, HatItems, UmbrellaLogic, MaxExtraTimePieces, YarnBalancePercent,
 | 
						|
                     TimePieceBalancePercent],
 | 
						|
 | 
						|
    "Arctic Cruise Options": [EnableDLC1, Tasksanity, TasksanityTaskStep, TasksanityCheckCount,
 | 
						|
                              ShipShapeCustomTaskGoal, ExcludeTour],
 | 
						|
 | 
						|
    "Nyakuza Metro Options": [EnableDLC2, MetroMinPonCost, MetroMaxPonCost, NyakuzaThugMinShopItems,
 | 
						|
                              NyakuzaThugMaxShopItems, BaseballBat, NoTicketSkips],
 | 
						|
 | 
						|
    "Death Wish Options": [EnableDeathWish, DWTimePieceRequirement, DWShuffle, DWShuffleCountMin, DWShuffleCountMax,
 | 
						|
                           DWEnableBonus, DWAutoCompleteBonuses, DWExcludeAnnoyingContracts, DWExcludeAnnoyingBonuses,
 | 
						|
                           DWExcludeCandles, DeathWishOnly],
 | 
						|
 | 
						|
    "Trap Options": [TrapChance, BabyTrapWeight, LaserTrapWeight, ParadeTrapWeight]
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
slot_data_options: List[str] = [
 | 
						|
    "EndGoal",
 | 
						|
    "ActRandomizer",
 | 
						|
    "ShuffleAlpineZiplines",
 | 
						|
    "LogicDifficulty",
 | 
						|
    "CTRLogic",
 | 
						|
    "RandomizeHatOrder",
 | 
						|
    "UmbrellaLogic",
 | 
						|
    "StartWithCompassBadge",
 | 
						|
    "CompassBadgeMode",
 | 
						|
    "ShuffleStorybookPages",
 | 
						|
    "ShuffleActContracts",
 | 
						|
    "ShuffleSubconPaintings",
 | 
						|
    "NoPaintingSkips",
 | 
						|
    "HatItems",
 | 
						|
 | 
						|
    "EnableDLC1",
 | 
						|
    "Tasksanity",
 | 
						|
    "TasksanityTaskStep",
 | 
						|
    "TasksanityCheckCount",
 | 
						|
    "ShipShapeCustomTaskGoal",
 | 
						|
    "ExcludeTour",
 | 
						|
 | 
						|
    "EnableDeathWish",
 | 
						|
    "DWShuffle",
 | 
						|
    "DeathWishOnly",
 | 
						|
    "DWEnableBonus",
 | 
						|
    "DWAutoCompleteBonuses",
 | 
						|
    "DWTimePieceRequirement",
 | 
						|
 | 
						|
    "EnableDLC2",
 | 
						|
    "MetroMinPonCost",
 | 
						|
    "MetroMaxPonCost",
 | 
						|
    "BaseballBat",
 | 
						|
    "NoTicketSkips",
 | 
						|
 | 
						|
    "MinPonCost",
 | 
						|
    "MaxPonCost",
 | 
						|
 | 
						|
    "death_link",
 | 
						|
]
 |