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