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",
 | |
| ]
 | 
