From 13acb67bd02420b4734f3208824cbbbc0f7319f4 Mon Sep 17 00:00:00 2001 From: CookieCat Date: Fri, 13 Oct 2023 16:49:09 -0400 Subject: [PATCH] a --- worlds/ahit/DeathWishLocations.py | 7 +- worlds/ahit/DeathWishRules.py | 164 ++--- worlds/ahit/Items.py | 130 ++-- worlds/ahit/Locations.py | 1073 ++++++++++++++++------------- worlds/ahit/Options.py | 3 +- worlds/ahit/Regions.py | 19 +- worlds/ahit/Rules.py | 68 +- worlds/ahit/Types.py | 35 + worlds/ahit/__init__.py | 6 +- 9 files changed, 840 insertions(+), 665 deletions(-) diff --git a/worlds/ahit/DeathWishLocations.py b/worlds/ahit/DeathWishLocations.py index 951b85f49a..f51d4948ee 100644 --- a/worlds/ahit/DeathWishLocations.py +++ b/worlds/ahit/DeathWishLocations.py @@ -1,10 +1,11 @@ -from .Locations import HatInTimeLocation, death_wishes -from .Items import HatInTimeItem +from .Types import HatInTimeLocation, HatInTimeItem from .Regions import connect_regions, create_region from BaseClasses import Region, LocationProgressType, ItemClassification from worlds.generic.Rules import add_rule from worlds.AutoWorld import World from typing import List +from .Locations import death_wishes + dw_prereqs = { "So You're Back From Outer Space": ["Beat the Heat"], @@ -82,11 +83,9 @@ annoying_bonuses = [ "Snatcher's Hit List", "10 Seconds until Self-Destruct", "Killing Two Birds", - "Snatcher Coins in Battle of the Birds", "Zero Jumps", "Bird Sanctuary", "Wound-Up Windmill", - "Snatcher Coins in Alpine Skyline", "Seal the Deal", ] diff --git a/worlds/ahit/DeathWishRules.py b/worlds/ahit/DeathWishRules.py index d547d19ba2..7f6211f417 100644 --- a/worlds/ahit/DeathWishRules.py +++ b/worlds/ahit/DeathWishRules.py @@ -1,12 +1,12 @@ from worlds.AutoWorld import World, CollectionState -from .Locations import LocData, death_wishes, HatInTimeLocation -from .Rules import can_use_hat, can_use_hookshot, can_hit, zipline_logic, has_paintings, get_difficulty -from .Types import HatType, Difficulty +from .Rules import can_use_hat, can_use_hookshot, can_hit, zipline_logic, get_difficulty +from .Types import HatType, Difficulty, HatInTimeLocation, HatInTimeItem, LocData, HatDLC from .DeathWishLocations import dw_prereqs, dw_candles -from .Items import HatInTimeItem from BaseClasses import Entrance, Location, ItemClassification from worlds.generic.Rules import add_rule, set_rule from typing import List, Callable +from .Regions import act_chapters +from .Locations import zero_jumps, zero_jumps_expert, zero_jumps_hard, death_wishes # Any speedruns expect the player to have Sprint Hat dw_requirements = { @@ -81,6 +81,23 @@ dw_stamp_costs = { "Seal the Deal": 70, } +required_snatcher_coins = { + "Snatcher Coins in Mafia Town": ["Snatcher Coin - Top of HQ", "Snatcher Coin - Top of Tower", + "Snatcher Coin - Under Ruined Tower"], + + "Snatcher Coins in Battle of the Birds": ["Snatcher Coin - Top of Red House", "Snatcher Coin - Train Rush", + "Snatcher Coin - Picture Perfect"], + + "Snatcher Coins in Subcon Forest": ["Snatcher Coin - Swamp Tree", "Snatcher Coin - Manor Roof", + "Snatcher Coin - Giant Time Piece"], + + "Snatcher Coins in Alpine Skyline": ["Snatcher Coin - Goat Village Top", "Snatcher Coin - Lava Cake", + "Snatcher Coin - Windmill"], + + "Snatcher Coins in Nyakuza Metro": ["Snatcher Coin - Green Clean Tower", "Snatcher Coin - Bluefin Cat Train", + "Snatcher Coin - Pink Paw Fence"], +} + def set_dw_rules(world: World): if "Snatcher's Hit List" not in world.get_excluded_dws() \ @@ -219,11 +236,8 @@ def modify_dw_rules(world: World, name: str): add_rule(main_objective, lambda state: state.has("Umbrella", world.player)) elif name == "The Mustache Gauntlet": - # Need a way to kill fire crows without being burned. add_rule(main_objective, lambda state: state.has("Umbrella", world.player) or can_use_hat(state, world, HatType.ICE) or can_use_hat(state, world, HatType.BREWING)) - add_rule(full_clear, lambda state: state.has("Umbrella", world.player) - or can_use_hat(state, world, HatType.ICE)) elif name == "Vault Codes in the Wind": # Sprint is normally expected here @@ -236,16 +250,21 @@ def modify_dw_rules(world: World, name: str): set_rule(main_objective, lambda state: True) elif name == "Mafia's Jumps": - # Main objective without Ice, still expected for bonuses if difficulty >= Difficulty.HARD: set_rule(main_objective, lambda state: True) - set_rule(full_clear, lambda state: can_use_hat(state, world, HatType.ICE)) + set_rule(full_clear, lambda state: True) elif name == "So You're Back from Outer Space": # Without Hookshot if difficulty >= Difficulty.HARD: set_rule(main_objective, lambda state: True) + elif name == "Wound-Up Windmill": + # No badge pin required. Player can switch to One Hit Hero after the checkpoint and do level without it. + if difficulty >= Difficulty.MODERATE: + set_rule(full_clear, lambda state: can_use_hookshot(state, world) + and state.has("One-Hit Hero Badge", world.player)) + if name in dw_candles: set_candle_dw_rules(name, world) @@ -268,7 +287,7 @@ def get_total_dw_stamps(state: CollectionState, world: World) -> int: if state.has(f"2 Stamps - {name}", world.player): count += 2 elif name not in dw_candles: - # all non-candle bonus requirements allow the player to get the other stamp (like not having One Hit Hero) + # most non-candle bonus requirements allow the player to get the other stamp (like not having One Hit Hero) count += 1 return count @@ -281,7 +300,13 @@ def set_candle_dw_rules(name: str, world: World): if name == "Zero Jumps": add_rule(main_objective, lambda state: get_zero_jump_clear_count(state, world) >= 1) add_rule(full_clear, lambda state: get_zero_jump_clear_count(state, world) >= 4 - and state.has("Train Rush Cleared", world.player) and can_use_hat(state, world, HatType.ICE)) + and state.has("Train Rush (Zero Jumps)", world.player) and can_use_hat(state, world, HatType.ICE)) + + # No Ice Hat/painting required in Expert for Toilet Zero Jumps + if get_difficulty(world) >= Difficulty.EXPERT: + set_rule(world.multiworld.get_location("Toilet of Doom (Zero Jumps)", world.player), + lambda state: can_use_hookshot(state, world) + and can_hit(state, world)) elif name == "Snatcher's Hit List": add_rule(main_objective, lambda state: state.has("Mafia Goon", world.player)) @@ -289,74 +314,33 @@ def set_candle_dw_rules(name: str, world: World): elif name == "Camera Tourist": add_rule(main_objective, lambda state: get_reachable_enemy_count(state, world) >= 8) - add_rule(full_clear, lambda state: can_reach_all_bosses(state, world)) + add_rule(full_clear, lambda state: can_reach_all_bosses(state, world) + and state.has("Triple Enemy Picture", world.player)) - elif name == "Snatcher Coins in Mafia Town": - add_rule(main_objective, lambda state: state.has("MT Access", world.player) - or state.has("HUMT Access", world.player)) - - add_rule(full_clear, lambda state: state.has("CTR Access", world.player) - or state.has("HUMT Access", world.player) - and can_hit(state, world, True) - or state.has("DWTM Access", world.player) - or state.has("TGV Access", world.player)) - - elif name == "Snatcher Coins in Battle of the Birds": - add_rule(main_objective, lambda state: state.has("PP Access", world.player) - or state.has("DBS Access", world.player) - or state.has("Train Rush Cleared", world.player)) - - add_rule(full_clear, lambda state: state.has("PP Access", world.player) - and state.has("DBS Access", world.player) - and state.has("Train Rush Cleared", world.player)) - - elif name == "Snatcher Coins in Subcon Forest": - add_rule(main_objective, lambda state: state.has("SF Access", world.player)) - - add_rule(main_objective, lambda state: has_paintings(state, world, 1) and (can_use_hookshot(state, world) - or can_hit(state, world) or can_use_hat(state, world, HatType.DWELLER)) - or has_paintings(state, world, 3)) - - add_rule(full_clear, lambda state: has_paintings(state, world, 3) and can_use_hookshot(state, world) - and (can_hit(state, world) or can_use_hat(state, world, HatType.DWELLER))) - - elif name == "Snatcher Coins in Alpine Skyline": - add_rule(main_objective, lambda state: state.has("LC Access", world.player) - or state.has("WM Access", world.player)) - - add_rule(full_clear, lambda state: state.has("LC Access", world.player) - and state.has("WM Access", world.player)) - - elif name == "Snatcher Coins in Nyakuza Metro": - add_rule(main_objective, lambda state: state.has("Bluefin Tunnel Cleared", world.player) - or (state.has("Nyakuza Intro Cleared", world.player) - and (state.has("Metro Ticket - Pink", world.player) - or state.has("Metro Ticket - Yellow", world.player) - and state.has("Metro Ticket - Blue", world.player)))) - - add_rule(full_clear, lambda state: state.has("Bluefin Tunnel Cleared", world.player) - and (state.has("Nyakuza Intro Cleared", world.player) - and (state.has("Metro Ticket - Pink", world.player) - or state.has("Metro Ticket - Yellow", world.player) - and state.has("Metro Ticket - Blue", world.player)))) + elif "Snatcher Coins" in name: + for coin in required_snatcher_coins[name]: + add_rule(main_objective, lambda state: state.has(coin, world.player), "or") + add_rule(full_clear, lambda state: state.has(coin, world.player)) def get_zero_jump_clear_count(state: CollectionState, world: World) -> int: total: int = 0 - for name, hats in zero_jumps.items(): - if not state.has(f"{name} Cleared", world.player): + for name in act_chapters.keys(): + n = f"{name} (Zero Jumps)" + if n not in zero_jumps: continue - valid: bool = True + if get_difficulty(world) < Difficulty.HARD and n in zero_jumps_hard: + continue - for hat in hats: - if not can_use_hat(state, world, hat): - valid = False - break + if get_difficulty(world) < Difficulty.EXPERT and n in zero_jumps_expert: + continue - if valid: - total += 1 + if not state.has(n, world.player): + continue + + total += 1 return total @@ -399,7 +383,7 @@ def create_enemy_events(world: World): if area == "Bluefin Tunnel" and not world.is_dlc2(): continue - if world.multiworld.DWShuffle[world.player].value > 0 and area in death_wishes \ + if world.multiworld.DWShuffle[world.player].value > 0 and area in death_wishes.keys() \ and area not in world.get_dw_shuffle(): continue @@ -409,6 +393,22 @@ def create_enemy_events(world: World): region.locations.append(event) event.show_in_spoiler = False + for name in triple_enemy_locations: + if name == "Time Rift - Tour" and (not world.is_dlc1() or world.multiworld.ExcludeTour[world.player].value > 0): + continue + + if world.multiworld.DWShuffle[world.player].value > 0 and name in death_wishes.keys() \ + and name not in world.get_dw_shuffle(): + continue + + region = world.multiworld.get_region(name, world.player) + event = HatInTimeLocation(world.player, f"Triple Enemy Picture - {name}", None, region) + event.place_locked_item(HatInTimeItem("Triple Enemy Picture", ItemClassification.progression, None, world.player)) + region.locations.append(event) + event.show_in_spoiler = False + if name == "The Mustache Gauntlet": + add_rule(event, lambda state: can_use_hookshot(state, world) and can_use_hat(state, world, HatType.DWELLER)) + def set_enemy_rules(world: World): no_tourist = "Camera Tourist" in world.get_excluded_dws() or "Camera Tourist" in world.get_excluded_bonuses() @@ -422,7 +422,7 @@ def set_enemy_rules(world: World): continue if area == "Time Rift - Tour" and (not world.is_dlc1() - or world.multiworld.ExcludeTour[world.player].value > 0): + or world.multiworld.ExcludeTour[world.player].value > 0): continue if area == "Bluefin Tunnel" and not world.is_dlc2(): @@ -463,17 +463,6 @@ def set_enemy_rules(world: World): add_rule(event, lambda state: can_use_hookshot(state, world)) -# Zero Jumps completable levels, with required hats if any -zero_jumps = { - "Welcome to Mafia Town": [], - "Cheating the Race": [HatType.TIME_STOP], - "Picture Perfect": [], - "Train Rush": [HatType.ICE], - "Contractual Obligations": [], - "Your Contract has Expired": [], - "Mail Delivery Service": [], # rule for needing sprint is already on act completion -} - # Enemies for Snatcher's Hit List/Camera Tourist, and where to find them hit_list = { "Mafia Goon": ["Mafia Town Area", "Time Rift - Mafia of Cooks", "Time Rift - Tour", @@ -523,6 +512,17 @@ hit_list = { "Mustache Girl": ["The Finale", "Boss Rush", "No More Bad Guys"], } +# Camera Tourist has a bonus that requires getting three different types of enemies in one picture. +triple_enemy_locations = [ + "She Came from Outer Space", + "She Speedran from Outer Space", + "Mafia's Jumps", + "The Mustache Gauntlet", + "The Birdhouse", + "Bird Sanctuary", + "Time Rift - Tour", +] + bosses = [ "Mafia Boss", "Conductor", diff --git a/worlds/ahit/Items.py b/worlds/ahit/Items.py index bd9150d98c..c9bb76739c 100644 --- a/worlds/ahit/Items.py +++ b/worlds/ahit/Items.py @@ -1,19 +1,9 @@ from BaseClasses import Item, ItemClassification from worlds.AutoWorld import World -from .Types import HatDLC, HatType, hat_type_to_item, Difficulty +from .Types import HatDLC, HatType, hat_type_to_item, Difficulty, ItemData, HatInTimeItem from .Locations import get_total_locations from .Rules import get_difficulty -from typing import Optional, NamedTuple, List, Dict - - -class ItemData(NamedTuple): - code: Optional[int] - classification: ItemClassification - dlc_flags: Optional[HatDLC] = HatDLC.none - - -class HatInTimeItem(Item): - game: str = "A Hat in Time" +from typing import Optional, List, Dict def create_itempool(world: World) -> List[Item]: @@ -185,86 +175,86 @@ def create_junk_items(world: World, count: int) -> List[Item]: ahit_items = { - "Yarn": ItemData(300001, ItemClassification.progression_skip_balancing), - "Time Piece": ItemData(300002, ItemClassification.progression_skip_balancing), + "Yarn": ItemData(2000300001, ItemClassification.progression_skip_balancing), + "Time Piece": ItemData(2000300002, ItemClassification.progression_skip_balancing), # for HatItems option - "Sprint Hat": ItemData(300049, ItemClassification.progression), - "Brewing Hat": ItemData(300050, ItemClassification.progression), - "Ice Hat": ItemData(300051, ItemClassification.progression), - "Dweller Mask": ItemData(300052, ItemClassification.progression), - "Time Stop Hat": ItemData(300053, ItemClassification.progression), + "Sprint Hat": ItemData(2000300049, ItemClassification.progression), + "Brewing Hat": ItemData(2000300050, ItemClassification.progression), + "Ice Hat": ItemData(2000300051, ItemClassification.progression), + "Dweller Mask": ItemData(2000300052, ItemClassification.progression), + "Time Stop Hat": ItemData(2000300053, ItemClassification.progression), # Relics - "Relic (Burger Patty)": ItemData(300006, ItemClassification.progression), - "Relic (Burger Cushion)": ItemData(300007, ItemClassification.progression), - "Relic (Mountain Set)": ItemData(300008, ItemClassification.progression), - "Relic (Train)": ItemData(300009, ItemClassification.progression), - "Relic (UFO)": ItemData(300010, ItemClassification.progression), - "Relic (Cow)": ItemData(300011, ItemClassification.progression), - "Relic (Cool Cow)": ItemData(300012, ItemClassification.progression), - "Relic (Tin-foil Hat Cow)": ItemData(300013, ItemClassification.progression), - "Relic (Crayon Box)": ItemData(300014, ItemClassification.progression), - "Relic (Red Crayon)": ItemData(300015, ItemClassification.progression), - "Relic (Blue Crayon)": ItemData(300016, ItemClassification.progression), - "Relic (Green Crayon)": ItemData(300017, ItemClassification.progression), + "Relic (Burger Patty)": ItemData(2000300006, ItemClassification.progression), + "Relic (Burger Cushion)": ItemData(2000300007, ItemClassification.progression), + "Relic (Mountain Set)": ItemData(2000300008, ItemClassification.progression), + "Relic (Train)": ItemData(2000300009, ItemClassification.progression), + "Relic (UFO)": ItemData(2000300010, ItemClassification.progression), + "Relic (Cow)": ItemData(2000300011, ItemClassification.progression), + "Relic (Cool Cow)": ItemData(2000300012, ItemClassification.progression), + "Relic (Tin-foil Hat Cow)": ItemData(2000300013, ItemClassification.progression), + "Relic (Crayon Box)": ItemData(2000300014, ItemClassification.progression), + "Relic (Red Crayon)": ItemData(2000300015, ItemClassification.progression), + "Relic (Blue Crayon)": ItemData(2000300016, ItemClassification.progression), + "Relic (Green Crayon)": ItemData(2000300017, ItemClassification.progression), # Badges - "Projectile Badge": ItemData(300024, ItemClassification.useful), - "Fast Hatter Badge": ItemData(300025, ItemClassification.useful), - "Hover Badge": ItemData(300026, ItemClassification.useful), - "Hookshot Badge": ItemData(300027, ItemClassification.progression), - "Item Magnet Badge": ItemData(300028, ItemClassification.useful), - "No Bonk Badge": ItemData(300029, ItemClassification.useful), - "Compass Badge": ItemData(300030, ItemClassification.useful), - "Scooter Badge": ItemData(300031, ItemClassification.useful), - "One-Hit Hero Badge": ItemData(300038, ItemClassification.progression, HatDLC.death_wish), - "Camera Badge": ItemData(300042, ItemClassification.progression, HatDLC.death_wish), + "Projectile Badge": ItemData(2000300024, ItemClassification.useful), + "Fast Hatter Badge": ItemData(2000300025, ItemClassification.useful), + "Hover Badge": ItemData(2000300026, ItemClassification.useful), + "Hookshot Badge": ItemData(2000300027, ItemClassification.progression), + "Item Magnet Badge": ItemData(2000300028, ItemClassification.useful), + "No Bonk Badge": ItemData(2000300029, ItemClassification.useful), + "Compass Badge": ItemData(2000300030, ItemClassification.useful), + "Scooter Badge": ItemData(2000300031, ItemClassification.useful), + "One-Hit Hero Badge": ItemData(2000300038, ItemClassification.progression, HatDLC.death_wish), + "Camera Badge": ItemData(2000300042, ItemClassification.progression, HatDLC.death_wish), # Other - "Badge Pin": ItemData(300043, ItemClassification.useful), - "Umbrella": ItemData(300033, ItemClassification.progression), - "Progressive Painting Unlock": ItemData(300003, ItemClassification.progression), + "Badge Pin": ItemData(2000300043, ItemClassification.useful), + "Umbrella": ItemData(2000300033, ItemClassification.progression), + "Progressive Painting Unlock": ItemData(2000300003, ItemClassification.progression), # Garbage items - "25 Pons": ItemData(300034, ItemClassification.filler), - "50 Pons": ItemData(300035, ItemClassification.filler), - "100 Pons": ItemData(300036, ItemClassification.filler), - "Health Pon": ItemData(300037, ItemClassification.filler), - "Random Cosmetic": ItemData(300044, ItemClassification.filler), + "25 Pons": ItemData(2000300034, ItemClassification.filler), + "50 Pons": ItemData(2000300035, ItemClassification.filler), + "100 Pons": ItemData(2000300036, ItemClassification.filler), + "Health Pon": ItemData(2000300037, ItemClassification.filler), + "Random Cosmetic": ItemData(2000300044, ItemClassification.filler), # Traps - "Baby Trap": ItemData(300039, ItemClassification.trap), - "Laser Trap": ItemData(300040, ItemClassification.trap), - "Parade Trap": ItemData(300041, ItemClassification.trap), + "Baby Trap": ItemData(2000300039, ItemClassification.trap), + "Laser Trap": ItemData(2000300040, ItemClassification.trap), + "Parade Trap": ItemData(2000300041, ItemClassification.trap), # DLC1 items - "Relic (Cake Stand)": ItemData(300018, ItemClassification.progression, HatDLC.dlc1), - "Relic (Cake)": ItemData(300019, ItemClassification.progression, HatDLC.dlc1), - "Relic (Cake Slice)": ItemData(300020, ItemClassification.progression, HatDLC.dlc1), - "Relic (Shortcake)": ItemData(300021, ItemClassification.progression, HatDLC.dlc1), + "Relic (Cake Stand)": ItemData(2000300018, ItemClassification.progression, HatDLC.dlc1), + "Relic (Cake)": ItemData(2000300019, ItemClassification.progression, HatDLC.dlc1), + "Relic (Cake Slice)": ItemData(2000300020, ItemClassification.progression, HatDLC.dlc1), + "Relic (Shortcake)": ItemData(2000300021, ItemClassification.progression, HatDLC.dlc1), # DLC2 items - "Relic (Necklace Bust)": ItemData(300022, ItemClassification.progression, HatDLC.dlc2), - "Relic (Necklace)": ItemData(300023, ItemClassification.progression, HatDLC.dlc2), - "Metro Ticket - Yellow": ItemData(300045, ItemClassification.progression, HatDLC.dlc2), - "Metro Ticket - Green": ItemData(300046, ItemClassification.progression, HatDLC.dlc2), - "Metro Ticket - Blue": ItemData(300047, ItemClassification.progression, HatDLC.dlc2), - "Metro Ticket - Pink": ItemData(300048, ItemClassification.progression, HatDLC.dlc2), + "Relic (Necklace Bust)": ItemData(2000300022, ItemClassification.progression, HatDLC.dlc2), + "Relic (Necklace)": ItemData(2000300023, ItemClassification.progression, HatDLC.dlc2), + "Metro Ticket - Yellow": ItemData(2000300045, ItemClassification.progression, HatDLC.dlc2), + "Metro Ticket - Green": ItemData(2000300046, ItemClassification.progression, HatDLC.dlc2), + "Metro Ticket - Blue": ItemData(2000300047, ItemClassification.progression, HatDLC.dlc2), + "Metro Ticket - Pink": ItemData(2000300048, ItemClassification.progression, HatDLC.dlc2), } act_contracts = { - "Snatcher's Contract - The Subcon Well": ItemData(300200, ItemClassification.progression), - "Snatcher's Contract - Toilet of Doom": ItemData(300201, ItemClassification.progression), - "Snatcher's Contract - Queen Vanessa's Manor": ItemData(300202, ItemClassification.progression), - "Snatcher's Contract - Mail Delivery Service": ItemData(300203, ItemClassification.progression), + "Snatcher's Contract - The Subcon Well": ItemData(2000300200, ItemClassification.progression), + "Snatcher's Contract - Toilet of Doom": ItemData(2000300201, ItemClassification.progression), + "Snatcher's Contract - Queen Vanessa's Manor": ItemData(2000300202, ItemClassification.progression), + "Snatcher's Contract - Mail Delivery Service": ItemData(2000300203, ItemClassification.progression), } alps_hooks = { - "Zipline Unlock - The Birdhouse Path": ItemData(300204, ItemClassification.progression), - "Zipline Unlock - The Lava Cake Path": ItemData(300205, ItemClassification.progression), - "Zipline Unlock - The Windmill Path": ItemData(300206, ItemClassification.progression), - "Zipline Unlock - The Twilight Bell Path": ItemData(300207, ItemClassification.progression), + "Zipline Unlock - The Birdhouse Path": ItemData(2000300204, ItemClassification.progression), + "Zipline Unlock - The Lava Cake Path": ItemData(2000300205, ItemClassification.progression), + "Zipline Unlock - The Windmill Path": ItemData(2000300206, ItemClassification.progression), + "Zipline Unlock - The Twilight Bell Path": ItemData(2000300207, ItemClassification.progression), } relic_groups = { diff --git a/worlds/ahit/Locations.py b/worlds/ahit/Locations.py index 954c54818f..64f1074d7f 100644 --- a/worlds/ahit/Locations.py +++ b/worlds/ahit/Locations.py @@ -1,32 +1,9 @@ -from BaseClasses import Location from worlds.AutoWorld import World -from .Types import HatDLC, HatType -from typing import Optional, NamedTuple, List, Dict +from .Types import HatDLC, HatType, LocData, Difficulty +from typing import Dict from .Options import TasksanityCheckCount -class LocData(NamedTuple): - id: Optional[int] = 0 - region: Optional[str] = "" - required_hats: Optional[List[HatType]] = [HatType.NONE] - hookshot: Optional[bool] = False - dlc_flags: Optional[HatDLC] = HatDLC.none - paintings: Optional[int] = 0 # Paintings required for Subcon painting shuffle - misc_required: Optional[List[str]] = [] - - # For UmbrellaLogic setting - umbrella: Optional[bool] = False # Umbrella required for this check - hit_requirement: Optional[int] = 0 # Hit required. 1 = Umbrella/Brewing only, 2 = bypass w/Dweller Mask (bells) - - # Other - act_complete_event: Optional[bool] = True # Only used for event locations. Copy access rule from act completion - nyakuza_thug: Optional[str] = "" # Name of Nyakuza thug NPC (for metro shops) - - -class HatInTimeLocation(Location): - game: str = "A Hat in Time" - - def get_total_locations(world: World) -> int: total: int = 0 @@ -67,6 +44,8 @@ def location_dlc_enabled(world: World, location: str) -> bool: return True elif data.dlc_flags == HatDLC.death_wish and world.is_dw(): return True + elif data.dlc_flags == HatDLC.dlc2_dw and world.is_dlc2() and world.is_dw(): + return True return False @@ -91,9 +70,23 @@ def is_location_valid(world: World, location: str) -> bool: return False # No need for all those event items if we're not doing candles - if data.dlc_flags is HatDLC.death_wish and world.multiworld.DWExcludeCandles[world.player].value > 0 \ - and location in event_locs.keys(): - return False + if data.dlc_flags is HatDLC.death_wish or data.dlc_flags is HatDLC.dlc2_dw: + if world.multiworld.DWExcludeCandles[world.player].value > 0 and location in event_locs.keys(): + return False + + if world.multiworld.DWShuffle[world.player].value > 0 and data.region not in world.get_dw_shuffle(): + return False + + if location in zero_jumps: + if world.multiworld.DWShuffle[world.player].value > 0 and "Zero Jumps" not in world.get_dw_shuffle(): + return False + + difficulty: int = world.multiworld.LogicDifficulty[world.player].value + if location in zero_jumps_hard and difficulty < int(Difficulty.HARD): + return False + + if location in zero_jumps_expert and difficulty < int(Difficulty.EXPERT): + return False return True @@ -112,546 +105,546 @@ def get_location_names() -> Dict[str, int]: def get_tasksanity_start_id() -> int: - return 300204 + return 2000300204 ahit_locations = { - "Spaceship - Rumbi Abuse": LocData(301000, "Spaceship", hit_requirement=1), + "Spaceship - Rumbi Abuse": LocData(2000301000, "Spaceship", hit_requirement=1), # 300000 range - Mafia Town/Batle of the Birds - "Welcome to Mafia Town - Umbrella": LocData(301002, "Welcome to Mafia Town"), - "Mafia Town - Old Man (Seaside Spaghetti)": LocData(303833, "Mafia Town Area"), - "Mafia Town - Old Man (Steel Beams)": LocData(303832, "Mafia Town Area"), - "Mafia Town - Blue Vault": LocData(302850, "Mafia Town Area"), - "Mafia Town - Green Vault": LocData(302851, "Mafia Town Area"), - "Mafia Town - Red Vault": LocData(302848, "Mafia Town Area"), - "Mafia Town - Blue Vault Brewing Crate": LocData(305572, "Mafia Town Area", required_hats=[HatType.BREWING]), - "Mafia Town - Plaza Under Boxes": LocData(304458, "Mafia Town Area"), - "Mafia Town - Small Boat": LocData(304460, "Mafia Town Area"), - "Mafia Town - Staircase Pon Cluster": LocData(304611, "Mafia Town Area"), - "Mafia Town - Palm Tree": LocData(304609, "Mafia Town Area"), - "Mafia Town - Port": LocData(305219, "Mafia Town Area"), - "Mafia Town - Docks Chest": LocData(303534, "Mafia Town Area"), - "Mafia Town - Ice Hat Cage": LocData(304831, "Mafia Town Area", required_hats=[HatType.ICE]), - "Mafia Town - Hidden Buttons Chest": LocData(303483, "Mafia Town Area"), + "Welcome to Mafia Town - Umbrella": LocData(2000301002, "Welcome to Mafia Town"), + "Mafia Town - Old Man (Seaside Spaghetti)": LocData(2000303833, "Mafia Town Area"), + "Mafia Town - Old Man (Steel Beams)": LocData(2000303832, "Mafia Town Area"), + "Mafia Town - Blue Vault": LocData(2000302850, "Mafia Town Area"), + "Mafia Town - Green Vault": LocData(2000302851, "Mafia Town Area"), + "Mafia Town - Red Vault": LocData(2000302848, "Mafia Town Area"), + "Mafia Town - Blue Vault Brewing Crate": LocData(2000305572, "Mafia Town Area", required_hats=[HatType.BREWING]), + "Mafia Town - Plaza Under Boxes": LocData(2000304458, "Mafia Town Area"), + "Mafia Town - Small Boat": LocData(2000304460, "Mafia Town Area"), + "Mafia Town - Staircase Pon Cluster": LocData(2000304611, "Mafia Town Area"), + "Mafia Town - Palm Tree": LocData(2000304609, "Mafia Town Area"), + "Mafia Town - Port": LocData(2000305219, "Mafia Town Area"), + "Mafia Town - Docks Chest": LocData(2000303534, "Mafia Town Area"), + "Mafia Town - Ice Hat Cage": LocData(2000304831, "Mafia Town Area", required_hats=[HatType.ICE]), + "Mafia Town - Hidden Buttons Chest": LocData(2000303483, "Mafia Town Area"), # These can be accessed from HUMT, the above locations can't be - "Mafia Town - Dweller Boxes": LocData(304462, "Mafia Town Area (HUMT)"), - "Mafia Town - Ledge Chest": LocData(303530, "Mafia Town Area (HUMT)"), - "Mafia Town - Yellow Sphere Building Chest": LocData(303535, "Mafia Town Area (HUMT)"), - "Mafia Town - Beneath Scaffolding": LocData(304456, "Mafia Town Area (HUMT)"), - "Mafia Town - On Scaffolding": LocData(304457, "Mafia Town Area (HUMT)"), - "Mafia Town - Cargo Ship": LocData(304459, "Mafia Town Area (HUMT)"), - "Mafia Town - Beach Alcove": LocData(304463, "Mafia Town Area (HUMT)"), - "Mafia Town - Wood Cage": LocData(304606, "Mafia Town Area (HUMT)"), - "Mafia Town - Beach Patio": LocData(304610, "Mafia Town Area (HUMT)"), - "Mafia Town - Steel Beam Nest": LocData(304608, "Mafia Town Area (HUMT)"), - "Mafia Town - Top of Ruined Tower": LocData(304607, "Mafia Town Area (HUMT)", required_hats=[HatType.ICE]), - "Mafia Town - Hot Air Balloon": LocData(304829, "Mafia Town Area (HUMT)", required_hats=[HatType.ICE]), - "Mafia Town - Camera Badge 1": LocData(302003, "Mafia Town Area (HUMT)"), - "Mafia Town - Camera Badge 2": LocData(302004, "Mafia Town Area (HUMT)"), - "Mafia Town - Chest Beneath Aqueduct": LocData(303489, "Mafia Town Area (HUMT)"), - "Mafia Town - Secret Cave": LocData(305220, "Mafia Town Area (HUMT)", required_hats=[HatType.BREWING]), - "Mafia Town - Crow Chest": LocData(303532, "Mafia Town Area (HUMT)"), - "Mafia Town - Above Boats": LocData(305218, "Mafia Town Area (HUMT)", hookshot=True), - "Mafia Town - Slip Slide Chest": LocData(303529, "Mafia Town Area (HUMT)"), - "Mafia Town - Behind Faucet": LocData(304214, "Mafia Town Area (HUMT)"), - "Mafia Town - Clock Tower Chest": LocData(303481, "Mafia Town Area (HUMT)", hookshot=True), - "Mafia Town - Top of Lighthouse": LocData(304213, "Mafia Town Area (HUMT)", hookshot=True), - "Mafia Town - Mafia Geek Platform": LocData(304212, "Mafia Town Area (HUMT)"), - "Mafia Town - Behind HQ Chest": LocData(303486, "Mafia Town Area (HUMT)"), + "Mafia Town - Dweller Boxes": LocData(2000304462, "Mafia Town Area (HUMT)"), + "Mafia Town - Ledge Chest": LocData(2000303530, "Mafia Town Area (HUMT)"), + "Mafia Town - Yellow Sphere Building Chest": LocData(2000303535, "Mafia Town Area (HUMT)"), + "Mafia Town - Beneath Scaffolding": LocData(2000304456, "Mafia Town Area (HUMT)"), + "Mafia Town - On Scaffolding": LocData(2000304457, "Mafia Town Area (HUMT)"), + "Mafia Town - Cargo Ship": LocData(2000304459, "Mafia Town Area (HUMT)"), + "Mafia Town - Beach Alcove": LocData(2000304463, "Mafia Town Area (HUMT)"), + "Mafia Town - Wood Cage": LocData(2000304606, "Mafia Town Area (HUMT)"), + "Mafia Town - Beach Patio": LocData(2000304610, "Mafia Town Area (HUMT)"), + "Mafia Town - Steel Beam Nest": LocData(2000304608, "Mafia Town Area (HUMT)"), + "Mafia Town - Top of Ruined Tower": LocData(2000304607, "Mafia Town Area (HUMT)", required_hats=[HatType.ICE]), + "Mafia Town - Hot Air Balloon": LocData(2000304829, "Mafia Town Area (HUMT)", required_hats=[HatType.ICE]), + "Mafia Town - Camera Badge 1": LocData(2000302003, "Mafia Town Area (HUMT)"), + "Mafia Town - Camera Badge 2": LocData(2000302004, "Mafia Town Area (HUMT)"), + "Mafia Town - Chest Beneath Aqueduct": LocData(2000303489, "Mafia Town Area (HUMT)"), + "Mafia Town - Secret Cave": LocData(2000305220, "Mafia Town Area (HUMT)", required_hats=[HatType.BREWING]), + "Mafia Town - Crow Chest": LocData(2000303532, "Mafia Town Area (HUMT)"), + "Mafia Town - Above Boats": LocData(2000305218, "Mafia Town Area (HUMT)", hookshot=True), + "Mafia Town - Slip Slide Chest": LocData(2000303529, "Mafia Town Area (HUMT)"), + "Mafia Town - Behind Faucet": LocData(2000304214, "Mafia Town Area (HUMT)"), + "Mafia Town - Clock Tower Chest": LocData(2000303481, "Mafia Town Area (HUMT)", hookshot=True), + "Mafia Town - Top of Lighthouse": LocData(2000304213, "Mafia Town Area (HUMT)", hookshot=True), + "Mafia Town - Mafia Geek Platform": LocData(2000304212, "Mafia Town Area (HUMT)"), + "Mafia Town - Behind HQ Chest": LocData(2000303486, "Mafia Town Area (HUMT)"), - "Mafia HQ - Hallway Brewing Crate": LocData(305387, "Down with the Mafia!", required_hats=[HatType.BREWING]), - "Mafia HQ - Freezer Chest": LocData(303241, "Down with the Mafia!"), - "Mafia HQ - Secret Room": LocData(304979, "Down with the Mafia!", required_hats=[HatType.ICE]), - "Mafia HQ - Bathroom Stall Chest": LocData(303243, "Down with the Mafia!"), + "Mafia HQ - Hallway Brewing Crate": LocData(2000305387, "Down with the Mafia!", required_hats=[HatType.BREWING]), + "Mafia HQ - Freezer Chest": LocData(2000303241, "Down with the Mafia!"), + "Mafia HQ - Secret Room": LocData(2000304979, "Down with the Mafia!", required_hats=[HatType.ICE]), + "Mafia HQ - Bathroom Stall Chest": LocData(2000303243, "Down with the Mafia!"), - "Dead Bird Studio - Up the Ladder": LocData(304874, "Dead Bird Studio - Elevator Area"), - "Dead Bird Studio - Red Building Top": LocData(305024, "Dead Bird Studio - Elevator Area"), - "Dead Bird Studio - Behind Water Tower": LocData(305248, "Dead Bird Studio - Elevator Area"), - "Dead Bird Studio - Side of House": LocData(305247, "Dead Bird Studio - Elevator Area"), - "Dead Bird Studio - DJ Grooves Sign Chest": LocData(303901, "Dead Bird Studio - Post Elevator Area", hit_requirement=1), - "Dead Bird Studio - Tightrope Chest": LocData(303898, "Dead Bird Studio - Post Elevator Area", hit_requirement=1), - "Dead Bird Studio - Tepee Chest": LocData(303899, "Dead Bird Studio - Post Elevator Area", hit_requirement=1), - "Dead Bird Studio - Conductor Chest": LocData(303900, "Dead Bird Studio - Post Elevator Area", hit_requirement=1), + "Dead Bird Studio - Up the Ladder": LocData(2000304874, "Dead Bird Studio - Elevator Area"), + "Dead Bird Studio - Red Building Top": LocData(2000305024, "Dead Bird Studio - Elevator Area"), + "Dead Bird Studio - Behind Water Tower": LocData(2000305248, "Dead Bird Studio - Elevator Area"), + "Dead Bird Studio - Side of House": LocData(2000305247, "Dead Bird Studio - Elevator Area"), + "Dead Bird Studio - DJ Grooves Sign Chest": LocData(2000303901, "Dead Bird Studio - Post Elevator Area", hit_requirement=1), + "Dead Bird Studio - Tightrope Chest": LocData(2000303898, "Dead Bird Studio - Post Elevator Area", hit_requirement=1), + "Dead Bird Studio - Tepee Chest": LocData(2000303899, "Dead Bird Studio - Post Elevator Area", hit_requirement=1), + "Dead Bird Studio - Conductor Chest": LocData(2000303900, "Dead Bird Studio - Post Elevator Area", hit_requirement=1), - "Murder on the Owl Express - Cafeteria": LocData(305313, "Murder on the Owl Express"), - "Murder on the Owl Express - Luggage Room Top": LocData(305090, "Murder on the Owl Express"), - "Murder on the Owl Express - Luggage Room Bottom": LocData(305091, "Murder on the Owl Express"), + "Murder on the Owl Express - Cafeteria": LocData(2000305313, "Murder on the Owl Express"), + "Murder on the Owl Express - Luggage Room Top": LocData(2000305090, "Murder on the Owl Express"), + "Murder on the Owl Express - Luggage Room Bottom": LocData(2000305091, "Murder on the Owl Express"), - "Murder on the Owl Express - Raven Suite Room": LocData(305701, "Murder on the Owl Express", + "Murder on the Owl Express - Raven Suite Room": LocData(2000305701, "Murder on the Owl Express", required_hats=[HatType.BREWING]), - "Murder on the Owl Express - Raven Suite Top": LocData(305312, "Murder on the Owl Express"), - "Murder on the Owl Express - Lounge Chest": LocData(303963, "Murder on the Owl Express"), + "Murder on the Owl Express - Raven Suite Top": LocData(2000305312, "Murder on the Owl Express"), + "Murder on the Owl Express - Lounge Chest": LocData(2000303963, "Murder on the Owl Express"), - "Picture Perfect - Behind Badge Seller": LocData(304307, "Picture Perfect"), - "Picture Perfect - Hats Buy Building": LocData(304530, "Picture Perfect"), + "Picture Perfect - Behind Badge Seller": LocData(2000304307, "Picture Perfect"), + "Picture Perfect - Hats Buy Building": LocData(2000304530, "Picture Perfect"), - "Dead Bird Studio Basement - Window Platform": LocData(305432, "Dead Bird Studio Basement", hookshot=True), - "Dead Bird Studio Basement - Cardboard Conductor": LocData(305059, "Dead Bird Studio Basement", hookshot=True), - "Dead Bird Studio Basement - Above Conductor Sign": LocData(305057, "Dead Bird Studio Basement", hookshot=True), - "Dead Bird Studio Basement - Logo Wall": LocData(305207, "Dead Bird Studio Basement"), - "Dead Bird Studio Basement - Disco Room": LocData(305061, "Dead Bird Studio Basement", hookshot=True), - "Dead Bird Studio Basement - Small Room": LocData(304813, "Dead Bird Studio Basement"), - "Dead Bird Studio Basement - Vent Pipe": LocData(305430, "Dead Bird Studio Basement"), - "Dead Bird Studio Basement - Tightrope": LocData(305058, "Dead Bird Studio Basement", hookshot=True), - "Dead Bird Studio Basement - Cameras": LocData(305431, "Dead Bird Studio Basement", hookshot=True), - "Dead Bird Studio Basement - Locked Room": LocData(305819, "Dead Bird Studio Basement", hookshot=True), + "Dead Bird Studio Basement - Window Platform": LocData(2000305432, "Dead Bird Studio Basement", hookshot=True), + "Dead Bird Studio Basement - Cardboard Conductor": LocData(2000305059, "Dead Bird Studio Basement", hookshot=True), + "Dead Bird Studio Basement - Above Conductor Sign": LocData(2000305057, "Dead Bird Studio Basement", hookshot=True), + "Dead Bird Studio Basement - Logo Wall": LocData(2000305207, "Dead Bird Studio Basement"), + "Dead Bird Studio Basement - Disco Room": LocData(2000305061, "Dead Bird Studio Basement", hookshot=True), + "Dead Bird Studio Basement - Small Room": LocData(2000304813, "Dead Bird Studio Basement"), + "Dead Bird Studio Basement - Vent Pipe": LocData(2000305430, "Dead Bird Studio Basement"), + "Dead Bird Studio Basement - Tightrope": LocData(2000305058, "Dead Bird Studio Basement", hookshot=True), + "Dead Bird Studio Basement - Cameras": LocData(2000305431, "Dead Bird Studio Basement", hookshot=True), + "Dead Bird Studio Basement - Locked Room": LocData(2000305819, "Dead Bird Studio Basement", hookshot=True), # Subcon Forest - "Contractual Obligations - Cherry Bomb Bone Cage": LocData(324761, "Contractual Obligations"), - "Subcon Village - Tree Top Ice Cube": LocData(325078, "Subcon Forest Area"), - "Subcon Village - Graveyard Ice Cube": LocData(325077, "Subcon Forest Area"), - "Subcon Village - House Top": LocData(325471, "Subcon Forest Area"), - "Subcon Village - Ice Cube House": LocData(325469, "Subcon Forest Area"), - "Subcon Village - Snatcher Statue Chest": LocData(323730, "Subcon Forest Area", paintings=1), - "Subcon Village - Stump Platform Chest": LocData(323729, "Subcon Forest Area"), - "Subcon Forest - Giant Tree Climb": LocData(325470, "Subcon Forest Area"), + "Contractual Obligations - Cherry Bomb Bone Cage": LocData(2000324761, "Contractual Obligations"), + "Subcon Village - Tree Top Ice Cube": LocData(2000325078, "Subcon Forest Area"), + "Subcon Village - Graveyard Ice Cube": LocData(2000325077, "Subcon Forest Area"), + "Subcon Village - House Top": LocData(2000325471, "Subcon Forest Area"), + "Subcon Village - Ice Cube House": LocData(2000325469, "Subcon Forest Area"), + "Subcon Village - Snatcher Statue Chest": LocData(2000323730, "Subcon Forest Area", paintings=1), + "Subcon Village - Stump Platform Chest": LocData(2000323729, "Subcon Forest Area"), + "Subcon Forest - Giant Tree Climb": LocData(2000325470, "Subcon Forest Area"), - "Subcon Forest - Ice Cube Shack": LocData(324465, "Subcon Forest Area", paintings=1), - "Subcon Forest - Swamp Gravestone": LocData(326296, "Subcon Forest Area", + "Subcon Forest - Ice Cube Shack": LocData(2000324465, "Subcon Forest Area", paintings=1), + "Subcon Forest - Swamp Gravestone": LocData(2000326296, "Subcon Forest Area", required_hats=[HatType.BREWING], paintings=1), - "Subcon Forest - Swamp Near Well": LocData(324762, "Subcon Forest Area", paintings=1), - "Subcon Forest - Swamp Tree A": LocData(324763, "Subcon Forest Area", paintings=1), - "Subcon Forest - Swamp Tree B": LocData(324764, "Subcon Forest Area", paintings=1), - "Subcon Forest - Swamp Ice Wall": LocData(324706, "Subcon Forest Area", paintings=1), - "Subcon Forest - Swamp Treehouse": LocData(325468, "Subcon Forest Area", paintings=1), - "Subcon Forest - Swamp Tree Chest": LocData(323728, "Subcon Forest Area", paintings=1), + "Subcon Forest - Swamp Near Well": LocData(2000324762, "Subcon Forest Area", paintings=1), + "Subcon Forest - Swamp Tree A": LocData(2000324763, "Subcon Forest Area", paintings=1), + "Subcon Forest - Swamp Tree B": LocData(2000324764, "Subcon Forest Area", paintings=1), + "Subcon Forest - Swamp Ice Wall": LocData(2000324706, "Subcon Forest Area", paintings=1), + "Subcon Forest - Swamp Treehouse": LocData(2000325468, "Subcon Forest Area", paintings=1), + "Subcon Forest - Swamp Tree Chest": LocData(2000323728, "Subcon Forest Area", paintings=1), - "Subcon Forest - Burning House": LocData(324710, "Subcon Forest Area", paintings=2), - "Subcon Forest - Burning Tree Climb": LocData(325079, "Subcon Forest Area", paintings=2), - "Subcon Forest - Burning Stump Chest": LocData(323731, "Subcon Forest Area", paintings=2), - "Subcon Forest - Burning Forest Treehouse": LocData(325467, "Subcon Forest Area", paintings=2), - "Subcon Forest - Spider Bone Cage A": LocData(324462, "Subcon Forest Area", paintings=2), - "Subcon Forest - Spider Bone Cage B": LocData(325080, "Subcon Forest Area", paintings=2), - "Subcon Forest - Triple Spider Bounce": LocData(324765, "Subcon Forest Area", paintings=2), - "Subcon Forest - Noose Treehouse": LocData(324856, "Subcon Forest Area", hookshot=True, paintings=2), + "Subcon Forest - Burning House": LocData(2000324710, "Subcon Forest Area", paintings=2), + "Subcon Forest - Burning Tree Climb": LocData(2000325079, "Subcon Forest Area", paintings=2), + "Subcon Forest - Burning Stump Chest": LocData(2000323731, "Subcon Forest Area", paintings=2), + "Subcon Forest - Burning Forest Treehouse": LocData(2000325467, "Subcon Forest Area", paintings=2), + "Subcon Forest - Spider Bone Cage A": LocData(2000324462, "Subcon Forest Area", paintings=2), + "Subcon Forest - Spider Bone Cage B": LocData(2000325080, "Subcon Forest Area", paintings=2), + "Subcon Forest - Triple Spider Bounce": LocData(2000324765, "Subcon Forest Area", paintings=2), + "Subcon Forest - Noose Treehouse": LocData(2000324856, "Subcon Forest Area", hookshot=True, paintings=2), - "Subcon Forest - Long Tree Climb Chest": LocData(323734, "Subcon Forest Area", + "Subcon Forest - Long Tree Climb Chest": LocData(2000323734, "Subcon Forest Area", required_hats=[HatType.DWELLER], paintings=2), - "Subcon Forest - Boss Arena Chest": LocData(323735, "Subcon Forest Area"), - "Subcon Forest - Manor Rooftop": LocData(325466, "Subcon Forest Area", hit_requirement=2, paintings=1), + "Subcon Forest - Boss Arena Chest": LocData(2000323735, "Subcon Forest Area"), + "Subcon Forest - Manor Rooftop": LocData(2000325466, "Subcon Forest Area", hit_requirement=2, paintings=1), - "Subcon Forest - Infinite Yarn Bush": LocData(325478, "Subcon Forest Area", + "Subcon Forest - Infinite Yarn Bush": LocData(2000325478, "Subcon Forest Area", required_hats=[HatType.BREWING], paintings=2), - "Subcon Forest - Magnet Badge Bush": LocData(325479, "Subcon Forest Area", + "Subcon Forest - Magnet Badge Bush": LocData(2000325479, "Subcon Forest Area", required_hats=[HatType.BREWING], paintings=3), - "Subcon Forest - Dweller Stump": LocData(324767, "Subcon Forest Area", + "Subcon Forest - Dweller Stump": LocData(2000324767, "Subcon Forest Area", required_hats=[HatType.DWELLER], paintings=3), - "Subcon Forest - Dweller Floating Rocks": LocData(324464, "Subcon Forest Area", + "Subcon Forest - Dweller Floating Rocks": LocData(2000324464, "Subcon Forest Area", required_hats=[HatType.DWELLER], paintings=3), - "Subcon Forest - Dweller Platforming Tree A": LocData(324709, "Subcon Forest Area", paintings=3), + "Subcon Forest - Dweller Platforming Tree A": LocData(2000324709, "Subcon Forest Area", paintings=3), - "Subcon Forest - Dweller Platforming Tree B": LocData(324855, "Subcon Forest Area", + "Subcon Forest - Dweller Platforming Tree B": LocData(2000324855, "Subcon Forest Area", required_hats=[HatType.DWELLER], paintings=3), - "Subcon Forest - Giant Time Piece": LocData(325473, "Subcon Forest Area", paintings=3), - "Subcon Forest - Gallows": LocData(325472, "Subcon Forest Area", paintings=3), + "Subcon Forest - Giant Time Piece": LocData(2000325473, "Subcon Forest Area", paintings=3), + "Subcon Forest - Gallows": LocData(2000325472, "Subcon Forest Area", paintings=3), - "Subcon Forest - Green and Purple Dweller Rocks": LocData(325082, "Subcon Forest Area", paintings=3), + "Subcon Forest - Green and Purple Dweller Rocks": LocData(2000325082, "Subcon Forest Area", paintings=3), - "Subcon Forest - Dweller Shack": LocData(324463, "Subcon Forest Area", + "Subcon Forest - Dweller Shack": LocData(2000324463, "Subcon Forest Area", required_hats=[HatType.DWELLER], paintings=3), - "Subcon Forest - Tall Tree Hookshot Swing": LocData(324766, "Subcon Forest Area", + "Subcon Forest - Tall Tree Hookshot Swing": LocData(2000324766, "Subcon Forest Area", required_hats=[HatType.DWELLER], hookshot=True, paintings=3), - "Subcon Well - Hookshot Badge Chest": LocData(324114, "The Subcon Well", hit_requirement=1, paintings=1), - "Subcon Well - Above Chest": LocData(324612, "The Subcon Well", hit_requirement=1, paintings=1), - "Subcon Well - On Pipe": LocData(324311, "The Subcon Well", hookshot=True, hit_requirement=1, paintings=1), - "Subcon Well - Mushroom": LocData(325318, "The Subcon Well", hit_requirement=1, paintings=1), + "Subcon Well - Hookshot Badge Chest": LocData(2000324114, "The Subcon Well", hit_requirement=1, paintings=1), + "Subcon Well - Above Chest": LocData(2000324612, "The Subcon Well", hit_requirement=1, paintings=1), + "Subcon Well - On Pipe": LocData(2000324311, "The Subcon Well", hookshot=True, hit_requirement=1, paintings=1), + "Subcon Well - Mushroom": LocData(2000325318, "The Subcon Well", hit_requirement=1, paintings=1), - "Queen Vanessa's Manor - Cellar": LocData(324841, "Queen Vanessa's Manor", hit_requirement=2, paintings=1), - "Queen Vanessa's Manor - Bedroom Chest": LocData(323808, "Queen Vanessa's Manor", hit_requirement=2, paintings=1), - "Queen Vanessa's Manor - Hall Chest": LocData(323896, "Queen Vanessa's Manor", hit_requirement=2, paintings=1), - "Queen Vanessa's Manor - Chandelier": LocData(325546, "Queen Vanessa's Manor", hit_requirement=2, paintings=1), + "Queen Vanessa's Manor - Cellar": LocData(2000324841, "Queen Vanessa's Manor", hit_requirement=2, paintings=1), + "Queen Vanessa's Manor - Bedroom Chest": LocData(2000323808, "Queen Vanessa's Manor", hit_requirement=2, paintings=1), + "Queen Vanessa's Manor - Hall Chest": LocData(2000323896, "Queen Vanessa's Manor", hit_requirement=2, paintings=1), + "Queen Vanessa's Manor - Chandelier": LocData(2000325546, "Queen Vanessa's Manor", hit_requirement=2, paintings=1), # Alpine Skyline - "Alpine Skyline - Goat Village: Below Hookpoint": LocData(334856, "Alpine Skyline Area (TIHS)"), - "Alpine Skyline - Goat Village: Hidden Branch": LocData(334855, "Alpine Skyline Area (TIHS)"), - "Alpine Skyline - Goat Refinery": LocData(333635, "Alpine Skyline Area"), - "Alpine Skyline - Bird Pass Fork": LocData(335911, "Alpine Skyline Area (TIHS)"), - "Alpine Skyline - Yellow Band Hills": LocData(335756, "Alpine Skyline Area (TIHS)", required_hats=[HatType.BREWING]), - "Alpine Skyline - The Purrloined Village: Horned Stone": LocData(335561, "Alpine Skyline Area"), - "Alpine Skyline - The Purrloined Village: Chest Reward": LocData(334831, "Alpine Skyline Area"), - "Alpine Skyline - The Birdhouse: Triple Crow Chest": LocData(334758, "The Birdhouse"), + "Alpine Skyline - Goat Village: Below Hookpoint": LocData(2000334856, "Alpine Skyline Area (TIHS)"), + "Alpine Skyline - Goat Village: Hidden Branch": LocData(2000334855, "Alpine Skyline Area (TIHS)"), + "Alpine Skyline - Goat Refinery": LocData(2000333635, "Alpine Skyline Area"), + "Alpine Skyline - Bird Pass Fork": LocData(2000335911, "Alpine Skyline Area (TIHS)"), + "Alpine Skyline - Yellow Band Hills": LocData(2000335756, "Alpine Skyline Area (TIHS)", required_hats=[HatType.BREWING]), + "Alpine Skyline - The Purrloined Village: Horned Stone": LocData(2000335561, "Alpine Skyline Area"), + "Alpine Skyline - The Purrloined Village: Chest Reward": LocData(2000334831, "Alpine Skyline Area"), + "Alpine Skyline - The Birdhouse: Triple Crow Chest": LocData(2000334758, "The Birdhouse"), - "Alpine Skyline - The Birdhouse: Dweller Platforms Relic": LocData(336497, "The Birdhouse", + "Alpine Skyline - The Birdhouse: Dweller Platforms Relic": LocData(2000336497, "The Birdhouse", required_hats=[HatType.DWELLER]), - "Alpine Skyline - The Birdhouse: Brewing Crate House": LocData(336496, "The Birdhouse"), - "Alpine Skyline - The Birdhouse: Hay Bale": LocData(335885, "The Birdhouse"), - "Alpine Skyline - The Birdhouse: Alpine Crow Mini-Gauntlet": LocData(335886, "The Birdhouse"), - "Alpine Skyline - The Birdhouse: Outer Edge": LocData(335492, "The Birdhouse"), + "Alpine Skyline - The Birdhouse: Brewing Crate House": LocData(2000336496, "The Birdhouse"), + "Alpine Skyline - The Birdhouse: Hay Bale": LocData(2000335885, "The Birdhouse"), + "Alpine Skyline - The Birdhouse: Alpine Crow Mini-Gauntlet": LocData(2000335886, "The Birdhouse"), + "Alpine Skyline - The Birdhouse: Outer Edge": LocData(2000335492, "The Birdhouse"), - "Alpine Skyline - Mystifying Time Mesa: Zipline": LocData(337058, "Alpine Skyline Area"), - "Alpine Skyline - Mystifying Time Mesa: Gate Puzzle": LocData(336052, "Alpine Skyline Area"), - "Alpine Skyline - Ember Summit": LocData(336311, "Alpine Skyline Area (TIHS)"), - "Alpine Skyline - The Lava Cake: Center Fence Cage": LocData(335448, "The Lava Cake"), - "Alpine Skyline - The Lava Cake: Outer Island Chest": LocData(334291, "The Lava Cake"), - "Alpine Skyline - The Lava Cake: Dweller Pillars": LocData(335417, "The Lava Cake"), - "Alpine Skyline - The Lava Cake: Top Cake": LocData(335418, "The Lava Cake"), - "Alpine Skyline - The Twilight Path": LocData(334434, "Alpine Skyline Area", required_hats=[HatType.DWELLER]), - "Alpine Skyline - The Twilight Bell: Wide Purple Platform": LocData(336478, "The Twilight Bell"), - "Alpine Skyline - The Twilight Bell: Ice Platform": LocData(335826, "The Twilight Bell"), - "Alpine Skyline - Goat Outpost Horn": LocData(334760, "Alpine Skyline Area"), - "Alpine Skyline - Windy Passage": LocData(334776, "Alpine Skyline Area (TIHS)"), - "Alpine Skyline - The Windmill: Inside Pon Cluster": LocData(336395, "The Windmill"), - "Alpine Skyline - The Windmill: Entrance": LocData(335783, "The Windmill"), - "Alpine Skyline - The Windmill: Dropdown": LocData(335815, "The Windmill"), - "Alpine Skyline - The Windmill: House Window": LocData(335389, "The Windmill"), + "Alpine Skyline - Mystifying Time Mesa: Zipline": LocData(2000337058, "Alpine Skyline Area"), + "Alpine Skyline - Mystifying Time Mesa: Gate Puzzle": LocData(2000336052, "Alpine Skyline Area"), + "Alpine Skyline - Ember Summit": LocData(2000336311, "Alpine Skyline Area (TIHS)"), + "Alpine Skyline - The Lava Cake: Center Fence Cage": LocData(2000335448, "The Lava Cake"), + "Alpine Skyline - The Lava Cake: Outer Island Chest": LocData(2000334291, "The Lava Cake"), + "Alpine Skyline - The Lava Cake: Dweller Pillars": LocData(2000335417, "The Lava Cake"), + "Alpine Skyline - The Lava Cake: Top Cake": LocData(2000335418, "The Lava Cake"), + "Alpine Skyline - The Twilight Path": LocData(2000334434, "Alpine Skyline Area", required_hats=[HatType.DWELLER]), + "Alpine Skyline - The Twilight Bell: Wide Purple Platform": LocData(2000336478, "The Twilight Bell"), + "Alpine Skyline - The Twilight Bell: Ice Platform": LocData(2000335826, "The Twilight Bell"), + "Alpine Skyline - Goat Outpost Horn": LocData(2000334760, "Alpine Skyline Area"), + "Alpine Skyline - Windy Passage": LocData(2000334776, "Alpine Skyline Area (TIHS)"), + "Alpine Skyline - The Windmill: Inside Pon Cluster": LocData(2000336395, "The Windmill"), + "Alpine Skyline - The Windmill: Entrance": LocData(2000335783, "The Windmill"), + "Alpine Skyline - The Windmill: Dropdown": LocData(2000335815, "The Windmill"), + "Alpine Skyline - The Windmill: House Window": LocData(2000335389, "The Windmill"), - "The Finale - Frozen Item": LocData(304108, "The Finale"), + "The Finale - Frozen Item": LocData(2000304108, "The Finale"), - "Bon Voyage! - Lamp Post Top": LocData(305321, "Bon Voyage!", dlc_flags=HatDLC.dlc1), - "Bon Voyage! - Mafia Cargo Ship": LocData(304313, "Bon Voyage!", dlc_flags=HatDLC.dlc1), - "The Arctic Cruise - Toilet": LocData(305109, "Cruise Ship", dlc_flags=HatDLC.dlc1), - "The Arctic Cruise - Bar": LocData(304251, "Cruise Ship", dlc_flags=HatDLC.dlc1), - "The Arctic Cruise - Dive Board Ledge": LocData(304254, "Cruise Ship", dlc_flags=HatDLC.dlc1), - "The Arctic Cruise - Top Balcony": LocData(304255, "Cruise Ship", dlc_flags=HatDLC.dlc1), - "The Arctic Cruise - Octopus Room": LocData(305253, "Cruise Ship", dlc_flags=HatDLC.dlc1), - "The Arctic Cruise - Octopus Room Top": LocData(304249, "Cruise Ship", dlc_flags=HatDLC.dlc1), - "The Arctic Cruise - Laundry Room": LocData(304250, "Cruise Ship", dlc_flags=HatDLC.dlc1), - "The Arctic Cruise - Ship Side": LocData(304247, "Cruise Ship", dlc_flags=HatDLC.dlc1), - "The Arctic Cruise - Silver Ring": LocData(305252, "Cruise Ship", dlc_flags=HatDLC.dlc1), - "Rock the Boat - Reception Room - Suitcase": LocData(304045, "Rock the Boat", dlc_flags=HatDLC.dlc1), - "Rock the Boat - Reception Room - Under Desk": LocData(304047, "Rock the Boat", dlc_flags=HatDLC.dlc1), - "Rock the Boat - Lamp Post": LocData(304048, "Rock the Boat", dlc_flags=HatDLC.dlc1), - "Rock the Boat - Iceberg Top": LocData(304046, "Rock the Boat", dlc_flags=HatDLC.dlc1), - "Rock the Boat - Post Captain Rescue": LocData(304049, "Rock the Boat", dlc_flags=HatDLC.dlc1, + "Bon Voyage! - Lamp Post Top": LocData(2000305321, "Bon Voyage!", dlc_flags=HatDLC.dlc1), + "Bon Voyage! - Mafia Cargo Ship": LocData(2000304313, "Bon Voyage!", dlc_flags=HatDLC.dlc1), + "The Arctic Cruise - Toilet": LocData(2000305109, "Cruise Ship", dlc_flags=HatDLC.dlc1), + "The Arctic Cruise - Bar": LocData(2000304251, "Cruise Ship", dlc_flags=HatDLC.dlc1), + "The Arctic Cruise - Dive Board Ledge": LocData(2000304254, "Cruise Ship", dlc_flags=HatDLC.dlc1), + "The Arctic Cruise - Top Balcony": LocData(2000304255, "Cruise Ship", dlc_flags=HatDLC.dlc1), + "The Arctic Cruise - Octopus Room": LocData(2000305253, "Cruise Ship", dlc_flags=HatDLC.dlc1), + "The Arctic Cruise - Octopus Room Top": LocData(2000304249, "Cruise Ship", dlc_flags=HatDLC.dlc1), + "The Arctic Cruise - Laundry Room": LocData(2000304250, "Cruise Ship", dlc_flags=HatDLC.dlc1), + "The Arctic Cruise - Ship Side": LocData(2000304247, "Cruise Ship", dlc_flags=HatDLC.dlc1), + "The Arctic Cruise - Silver Ring": LocData(2000305252, "Cruise Ship", dlc_flags=HatDLC.dlc1), + "Rock the Boat - Reception Room - Suitcase": LocData(2000304045, "Rock the Boat", dlc_flags=HatDLC.dlc1), + "Rock the Boat - Reception Room - Under Desk": LocData(2000304047, "Rock the Boat", dlc_flags=HatDLC.dlc1), + "Rock the Boat - Lamp Post": LocData(2000304048, "Rock the Boat", dlc_flags=HatDLC.dlc1), + "Rock the Boat - Iceberg Top": LocData(2000304046, "Rock the Boat", dlc_flags=HatDLC.dlc1), + "Rock the Boat - Post Captain Rescue": LocData(2000304049, "Rock the Boat", dlc_flags=HatDLC.dlc1, required_hats=[HatType.ICE]), - "Nyakuza Metro - Main Station Dining Area": LocData(304105, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2), - "Nyakuza Metro - Top of Ramen Shop": LocData(304104, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2), + "Nyakuza Metro - Main Station Dining Area": LocData(2000304105, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2), + "Nyakuza Metro - Top of Ramen Shop": LocData(2000304104, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2), - "Yellow Overpass Station - Brewing Crate": LocData(305413, "Yellow Overpass Station", + "Yellow Overpass Station - Brewing Crate": LocData(2000305413, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.BREWING]), - "Bluefin Tunnel - Cat Vacuum": LocData(305111, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2), + "Bluefin Tunnel - Cat Vacuum": LocData(2000305111, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2), - "Pink Paw Station - Cat Vacuum": LocData(305110, "Pink Paw Station", + "Pink Paw Station - Cat Vacuum": LocData(2000305110, "Pink Paw Station", dlc_flags=HatDLC.dlc2, hookshot=True, required_hats=[HatType.DWELLER]), - "Pink Paw Station - Behind Fan": LocData(304106, "Pink Paw Station", + "Pink Paw Station - Behind Fan": LocData(2000304106, "Pink Paw Station", dlc_flags=HatDLC.dlc2, hookshot=True, required_hats=[HatType.TIME_STOP, HatType.DWELLER]), } act_completions = { - "Act Completion (Time Rift - Gallery)": LocData(312758, "Time Rift - Gallery", required_hats=[HatType.BREWING]), - "Act Completion (Time Rift - The Lab)": LocData(312838, "Time Rift - The Lab"), + "Act Completion (Time Rift - Gallery)": LocData(2000312758, "Time Rift - Gallery", required_hats=[HatType.BREWING]), + "Act Completion (Time Rift - The Lab)": LocData(2000312838, "Time Rift - The Lab"), - "Act Completion (Welcome to Mafia Town)": LocData(311771, "Welcome to Mafia Town"), - "Act Completion (Barrel Battle)": LocData(311958, "Barrel Battle"), - "Act Completion (She Came from Outer Space)": LocData(312262, "She Came from Outer Space"), - "Act Completion (Down with the Mafia!)": LocData(311326, "Down with the Mafia!"), - "Act Completion (Cheating the Race)": LocData(312318, "Cheating the Race", required_hats=[HatType.TIME_STOP]), - "Act Completion (Heating Up Mafia Town)": LocData(311481, "Heating Up Mafia Town", umbrella=True), - "Act Completion (The Golden Vault)": LocData(312250, "The Golden Vault"), - "Act Completion (Time Rift - Bazaar)": LocData(312465, "Time Rift - Bazaar"), - "Act Completion (Time Rift - Sewers)": LocData(312484, "Time Rift - Sewers"), - "Act Completion (Time Rift - Mafia of Cooks)": LocData(311855, "Time Rift - Mafia of Cooks"), + "Act Completion (Welcome to Mafia Town)": LocData(2000311771, "Welcome to Mafia Town"), + "Act Completion (Barrel Battle)": LocData(2000311958, "Barrel Battle"), + "Act Completion (She Came from Outer Space)": LocData(2000312262, "She Came from Outer Space"), + "Act Completion (Down with the Mafia!)": LocData(2000311326, "Down with the Mafia!"), + "Act Completion (Cheating the Race)": LocData(2000312318, "Cheating the Race", required_hats=[HatType.TIME_STOP]), + "Act Completion (Heating Up Mafia Town)": LocData(2000311481, "Heating Up Mafia Town", umbrella=True), + "Act Completion (The Golden Vault)": LocData(2000312250, "The Golden Vault"), + "Act Completion (Time Rift - Bazaar)": LocData(2000312465, "Time Rift - Bazaar"), + "Act Completion (Time Rift - Sewers)": LocData(2000312484, "Time Rift - Sewers"), + "Act Completion (Time Rift - Mafia of Cooks)": LocData(2000311855, "Time Rift - Mafia of Cooks"), - "Act Completion (Dead Bird Studio)": LocData(311383, "Dead Bird Studio", hit_requirement=1), - "Act Completion (Murder on the Owl Express)": LocData(311544, "Murder on the Owl Express"), - "Act Completion (Picture Perfect)": LocData(311587, "Picture Perfect"), - "Act Completion (Train Rush)": LocData(312481, "Train Rush", hookshot=True), - "Act Completion (The Big Parade)": LocData(311157, "The Big Parade", umbrella=True), - "Act Completion (Award Ceremony)": LocData(311488, "Award Ceremony"), - "Act Completion (Dead Bird Studio Basement)": LocData(312253, "Dead Bird Studio Basement", hookshot=True), - "Act Completion (Time Rift - The Owl Express)": LocData(312807, "Time Rift - The Owl Express"), - "Act Completion (Time Rift - The Moon)": LocData(312785, "Time Rift - The Moon"), - "Act Completion (Time Rift - Dead Bird Studio)": LocData(312577, "Time Rift - Dead Bird Studio"), + "Act Completion (Dead Bird Studio)": LocData(2000311383, "Dead Bird Studio", hit_requirement=1), + "Act Completion (Murder on the Owl Express)": LocData(2000311544, "Murder on the Owl Express"), + "Act Completion (Picture Perfect)": LocData(2000311587, "Picture Perfect"), + "Act Completion (Train Rush)": LocData(2000312481, "Train Rush", hookshot=True), + "Act Completion (The Big Parade)": LocData(2000311157, "The Big Parade", umbrella=True), + "Act Completion (Award Ceremony)": LocData(2000311488, "Award Ceremony"), + "Act Completion (Dead Bird Studio Basement)": LocData(2000312253, "Dead Bird Studio Basement", hookshot=True), + "Act Completion (Time Rift - The Owl Express)": LocData(2000312807, "Time Rift - The Owl Express"), + "Act Completion (Time Rift - The Moon)": LocData(2000312785, "Time Rift - The Moon"), + "Act Completion (Time Rift - Dead Bird Studio)": LocData(2000312577, "Time Rift - Dead Bird Studio"), - "Act Completion (Contractual Obligations)": LocData(312317, "Contractual Obligations", paintings=1), - "Act Completion (The Subcon Well)": LocData(311160, "The Subcon Well", hookshot=True, umbrella=True, paintings=1), - "Act Completion (Toilet of Doom)": LocData(311984, "Toilet of Doom", hookshot=True, paintings=1), - "Act Completion (Queen Vanessa's Manor)": LocData(312017, "Queen Vanessa's Manor", umbrella=True, paintings=1), - "Act Completion (Mail Delivery Service)": LocData(312032, "Mail Delivery Service", required_hats=[HatType.SPRINT]), - "Act Completion (Your Contract has Expired)": LocData(311390, "Your Contract has Expired", umbrella=True), - "Act Completion (Time Rift - Pipe)": LocData(313069, "Time Rift - Pipe", hookshot=True), - "Act Completion (Time Rift - Village)": LocData(313056, "Time Rift - Village"), - "Act Completion (Time Rift - Sleepy Subcon)": LocData(312086, "Time Rift - Sleepy Subcon"), + "Act Completion (Contractual Obligations)": LocData(2000312317, "Contractual Obligations", paintings=1), + "Act Completion (The Subcon Well)": LocData(2000311160, "The Subcon Well", hookshot=True, umbrella=True, paintings=1), + "Act Completion (Toilet of Doom)": LocData(2000311984, "Toilet of Doom", hit_requirement=1, hookshot=True, paintings=1), + "Act Completion (Queen Vanessa's Manor)": LocData(2000312017, "Queen Vanessa's Manor", umbrella=True, paintings=1), + "Act Completion (Mail Delivery Service)": LocData(2000312032, "Mail Delivery Service", required_hats=[HatType.SPRINT]), + "Act Completion (Your Contract has Expired)": LocData(2000311390, "Your Contract has Expired", umbrella=True), + "Act Completion (Time Rift - Pipe)": LocData(2000313069, "Time Rift - Pipe", hookshot=True), + "Act Completion (Time Rift - Village)": LocData(2000313056, "Time Rift - Village"), + "Act Completion (Time Rift - Sleepy Subcon)": LocData(2000312086, "Time Rift - Sleepy Subcon"), - "Act Completion (The Birdhouse)": LocData(311428, "The Birdhouse"), - "Act Completion (The Lava Cake)": LocData(312509, "The Lava Cake"), - "Act Completion (The Twilight Bell)": LocData(311540, "The Twilight Bell"), - "Act Completion (The Windmill)": LocData(312263, "The Windmill"), - "Act Completion (The Illness has Spread)": LocData(312022, "The Illness has Spread", hookshot=True), + "Act Completion (The Birdhouse)": LocData(2000311428, "The Birdhouse"), + "Act Completion (The Lava Cake)": LocData(2000312509, "The Lava Cake"), + "Act Completion (The Twilight Bell)": LocData(2000311540, "The Twilight Bell"), + "Act Completion (The Windmill)": LocData(2000312263, "The Windmill"), + "Act Completion (The Illness has Spread)": LocData(2000312022, "The Illness has Spread", hookshot=True), - "Act Completion (Time Rift - The Twilight Bell)": LocData(312399, "Time Rift - The Twilight Bell", + "Act Completion (Time Rift - The Twilight Bell)": LocData(2000312399, "Time Rift - The Twilight Bell", required_hats=[HatType.DWELLER]), - "Act Completion (Time Rift - Curly Tail Trail)": LocData(313335, "Time Rift - Curly Tail Trail", + "Act Completion (Time Rift - Curly Tail Trail)": LocData(2000313335, "Time Rift - Curly Tail Trail", required_hats=[HatType.ICE]), - "Act Completion (Time Rift - Alpine Skyline)": LocData(311777, "Time Rift - Alpine Skyline"), + "Act Completion (Time Rift - Alpine Skyline)": LocData(2000311777, "Time Rift - Alpine Skyline"), - "Act Completion (The Finale)": LocData(311872, "The Finale", hookshot=True, required_hats=[HatType.DWELLER]), - "Act Completion (Time Rift - Tour)": LocData(311803, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), + "Act Completion (The Finale)": LocData(2000311872, "The Finale", hookshot=True, required_hats=[HatType.DWELLER]), + "Act Completion (Time Rift - Tour)": LocData(2000311803, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), - "Act Completion (Bon Voyage!)": LocData(311520, "Bon Voyage!", dlc_flags=HatDLC.dlc1, hookshot=True), - "Act Completion (Ship Shape)": LocData(311451, "Ship Shape", dlc_flags=HatDLC.dlc1), - "Act Completion (Rock the Boat)": LocData(311437, "Rock the Boat", dlc_flags=HatDLC.dlc1, required_hats=[HatType.ICE]), - "Act Completion (Time Rift - Balcony)": LocData(312226, "Time Rift - Balcony", dlc_flags=HatDLC.dlc1, hookshot=True), - "Act Completion (Time Rift - Deep Sea)": LocData(312434, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, + "Act Completion (Bon Voyage!)": LocData(2000311520, "Bon Voyage!", dlc_flags=HatDLC.dlc1, hookshot=True), + "Act Completion (Ship Shape)": LocData(2000311451, "Ship Shape", dlc_flags=HatDLC.dlc1), + "Act Completion (Rock the Boat)": LocData(2000311437, "Rock the Boat", dlc_flags=HatDLC.dlc1, required_hats=[HatType.ICE]), + "Act Completion (Time Rift - Balcony)": LocData(2000312226, "Time Rift - Balcony", dlc_flags=HatDLC.dlc1, hookshot=True), + "Act Completion (Time Rift - Deep Sea)": LocData(2000312434, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True, required_hats=[HatType.DWELLER, HatType.ICE]), - "Act Completion (Nyakuza Metro Intro)": LocData(311138, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2), + "Act Completion (Nyakuza Metro Intro)": LocData(2000311138, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2), - "Act Completion (Yellow Overpass Station)": LocData(311206, "Yellow Overpass Station", + "Act Completion (Yellow Overpass Station)": LocData(2000311206, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, hookshot=True), - "Act Completion (Yellow Overpass Manhole)": LocData(311387, "Yellow Overpass Manhole", + "Act Completion (Yellow Overpass Manhole)": LocData(2000311387, "Yellow Overpass Manhole", dlc_flags=HatDLC.dlc2, required_hats=[HatType.ICE]), - "Act Completion (Green Clean Station)": LocData(311207, "Green Clean Station", dlc_flags=HatDLC.dlc2), + "Act Completion (Green Clean Station)": LocData(2000311207, "Green Clean Station", dlc_flags=HatDLC.dlc2), - "Act Completion (Green Clean Manhole)": LocData(311388, "Green Clean Manhole", + "Act Completion (Green Clean Manhole)": LocData(2000311388, "Green Clean Manhole", dlc_flags=HatDLC.dlc2, required_hats=[HatType.ICE, HatType.DWELLER]), - "Act Completion (Bluefin Tunnel)": LocData(311208, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2), + "Act Completion (Bluefin Tunnel)": LocData(2000311208, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2), - "Act Completion (Pink Paw Station)": LocData(311209, "Pink Paw Station", + "Act Completion (Pink Paw Station)": LocData(2000311209, "Pink Paw Station", dlc_flags=HatDLC.dlc2, hookshot=True, required_hats=[HatType.DWELLER]), - "Act Completion (Pink Paw Manhole)": LocData(311389, "Pink Paw Manhole", + "Act Completion (Pink Paw Manhole)": LocData(2000311389, "Pink Paw Manhole", dlc_flags=HatDLC.dlc2, required_hats=[HatType.ICE]), - "Act Completion (Rush Hour)": LocData(311210, "Rush Hour", + "Act Completion (Rush Hour)": LocData(2000311210, "Rush Hour", dlc_flags=HatDLC.dlc2, hookshot=True, required_hats=[HatType.ICE, HatType.BREWING]), - "Act Completion (Time Rift - Rumbi Factory)": LocData(312736, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Act Completion (Time Rift - Rumbi Factory)": LocData(2000312736, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), } storybook_pages = { - "Mafia of Cooks - Page: Fish Pile": LocData(345091, "Time Rift - Mafia of Cooks"), - "Mafia of Cooks - Page: Trash Mound": LocData(345090, "Time Rift - Mafia of Cooks"), - "Mafia of Cooks - Page: Beside Red Building": LocData(345092, "Time Rift - Mafia of Cooks"), - "Mafia of Cooks - Page: Behind Shipping Containers": LocData(345095, "Time Rift - Mafia of Cooks"), - "Mafia of Cooks - Page: Top of Boat": LocData(345093, "Time Rift - Mafia of Cooks"), - "Mafia of Cooks - Page: Below Dock": LocData(345094, "Time Rift - Mafia of Cooks"), + "Mafia of Cooks - Page: Fish Pile": LocData(2000345091, "Time Rift - Mafia of Cooks"), + "Mafia of Cooks - Page: Trash Mound": LocData(2000345090, "Time Rift - Mafia of Cooks"), + "Mafia of Cooks - Page: Beside Red Building": LocData(2000345092, "Time Rift - Mafia of Cooks"), + "Mafia of Cooks - Page: Behind Shipping Containers": LocData(2000345095, "Time Rift - Mafia of Cooks"), + "Mafia of Cooks - Page: Top of Boat": LocData(2000345093, "Time Rift - Mafia of Cooks"), + "Mafia of Cooks - Page: Below Dock": LocData(2000345094, "Time Rift - Mafia of Cooks"), - "Dead Bird Studio (Rift) - Page: Behind Cardboard Planet": LocData(345449, "Time Rift - Dead Bird Studio"), - "Dead Bird Studio (Rift) - Page: Near Time Rift Gate": LocData(345447, "Time Rift - Dead Bird Studio"), - "Dead Bird Studio (Rift) - Page: Top of Metal Bar": LocData(345448, "Time Rift - Dead Bird Studio"), - "Dead Bird Studio (Rift) - Page: Lava Lamp": LocData(345450, "Time Rift - Dead Bird Studio"), - "Dead Bird Studio (Rift) - Page: Above Horse Picture": LocData(345451, "Time Rift - Dead Bird Studio"), - "Dead Bird Studio (Rift) - Page: Green Screen": LocData(345452, "Time Rift - Dead Bird Studio"), - "Dead Bird Studio (Rift) - Page: In The Corner": LocData(345453, "Time Rift - Dead Bird Studio"), - "Dead Bird Studio (Rift) - Page: Above TV Room": LocData(345445, "Time Rift - Dead Bird Studio"), + "Dead Bird Studio (Rift) - Page: Behind Cardboard Planet": LocData(2000345449, "Time Rift - Dead Bird Studio"), + "Dead Bird Studio (Rift) - Page: Near Time Rift Gate": LocData(2000345447, "Time Rift - Dead Bird Studio"), + "Dead Bird Studio (Rift) - Page: Top of Metal Bar": LocData(2000345448, "Time Rift - Dead Bird Studio"), + "Dead Bird Studio (Rift) - Page: Lava Lamp": LocData(2000345450, "Time Rift - Dead Bird Studio"), + "Dead Bird Studio (Rift) - Page: Above Horse Picture": LocData(2000345451, "Time Rift - Dead Bird Studio"), + "Dead Bird Studio (Rift) - Page: Green Screen": LocData(2000345452, "Time Rift - Dead Bird Studio"), + "Dead Bird Studio (Rift) - Page: In The Corner": LocData(2000345453, "Time Rift - Dead Bird Studio"), + "Dead Bird Studio (Rift) - Page: Above TV Room": LocData(2000345445, "Time Rift - Dead Bird Studio"), - "Sleepy Subcon - Page: Behind Entrance Area": LocData(345373, "Time Rift - Sleepy Subcon"), - "Sleepy Subcon - Page: Near Wrecking Ball": LocData(345327, "Time Rift - Sleepy Subcon"), - "Sleepy Subcon - Page: Behind Crane": LocData(345371, "Time Rift - Sleepy Subcon"), - "Sleepy Subcon - Page: Wrecked Treehouse": LocData(345326, "Time Rift - Sleepy Subcon"), - "Sleepy Subcon - Page: Behind 2nd Rift Gate": LocData(345372, "Time Rift - Sleepy Subcon"), - "Sleepy Subcon - Page: Rotating Platform": LocData(345328, "Time Rift - Sleepy Subcon"), - "Sleepy Subcon - Page: Behind 3rd Rift Gate": LocData(345329, "Time Rift - Sleepy Subcon"), - "Sleepy Subcon - Page: Frozen Tree": LocData(345330, "Time Rift - Sleepy Subcon"), - "Sleepy Subcon - Page: Secret Library": LocData(345370, "Time Rift - Sleepy Subcon"), + "Sleepy Subcon - Page: Behind Entrance Area": LocData(2000345373, "Time Rift - Sleepy Subcon"), + "Sleepy Subcon - Page: Near Wrecking Ball": LocData(2000345327, "Time Rift - Sleepy Subcon"), + "Sleepy Subcon - Page: Behind Crane": LocData(2000345371, "Time Rift - Sleepy Subcon"), + "Sleepy Subcon - Page: Wrecked Treehouse": LocData(2000345326, "Time Rift - Sleepy Subcon"), + "Sleepy Subcon - Page: Behind 2nd Rift Gate": LocData(2000345372, "Time Rift - Sleepy Subcon"), + "Sleepy Subcon - Page: Rotating Platform": LocData(2000345328, "Time Rift - Sleepy Subcon"), + "Sleepy Subcon - Page: Behind 3rd Rift Gate": LocData(2000345329, "Time Rift - Sleepy Subcon"), + "Sleepy Subcon - Page: Frozen Tree": LocData(2000345330, "Time Rift - Sleepy Subcon"), + "Sleepy Subcon - Page: Secret Library": LocData(2000345370, "Time Rift - Sleepy Subcon"), - "Alpine Skyline (Rift) - Page: Entrance Area Hidden Ledge": LocData(345016, "Time Rift - Alpine Skyline"), - "Alpine Skyline (Rift) - Page: Windmill Island Ledge": LocData(345012, "Time Rift - Alpine Skyline"), - "Alpine Skyline (Rift) - Page: Waterfall Wooden Pillar": LocData(345015, "Time Rift - Alpine Skyline"), - "Alpine Skyline (Rift) - Page: Lonely Birdhouse Top": LocData(345014, "Time Rift - Alpine Skyline"), - "Alpine Skyline (Rift) - Page: Below Aqueduct": LocData(345013, "Time Rift - Alpine Skyline"), + "Alpine Skyline (Rift) - Page: Entrance Area Hidden Ledge": LocData(2000345016, "Time Rift - Alpine Skyline"), + "Alpine Skyline (Rift) - Page: Windmill Island Ledge": LocData(2000345012, "Time Rift - Alpine Skyline"), + "Alpine Skyline (Rift) - Page: Waterfall Wooden Pillar": LocData(2000345015, "Time Rift - Alpine Skyline"), + "Alpine Skyline (Rift) - Page: Lonely Birdhouse Top": LocData(2000345014, "Time Rift - Alpine Skyline"), + "Alpine Skyline (Rift) - Page: Below Aqueduct": LocData(2000345013, "Time Rift - Alpine Skyline"), - "Deep Sea - Page: Starfish": LocData(346454, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1), - "Deep Sea - Page: Mini Castle": LocData(346452, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1), - "Deep Sea - Page: Urchins": LocData(346449, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1), - "Deep Sea - Page: Big Castle": LocData(346450, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), - "Deep Sea - Page: Castle Top Chest": LocData(304850, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), - "Deep Sea - Page: Urchin Ledge": LocData(346451, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), - "Deep Sea - Page: Hidden Castle Chest": LocData(304849, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), - "Deep Sea - Page: Falling Platform": LocData(346456, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), - "Deep Sea - Page: Lava Starfish": LocData(346453, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), + "Deep Sea - Page: Starfish": LocData(2000346454, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1), + "Deep Sea - Page: Mini Castle": LocData(2000346452, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1), + "Deep Sea - Page: Urchins": LocData(2000346449, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1), + "Deep Sea - Page: Big Castle": LocData(2000346450, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), + "Deep Sea - Page: Castle Top Chest": LocData(2000304850, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), + "Deep Sea - Page: Urchin Ledge": LocData(2000346451, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), + "Deep Sea - Page: Hidden Castle Chest": LocData(2000304849, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), + "Deep Sea - Page: Falling Platform": LocData(2000346456, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), + "Deep Sea - Page: Lava Starfish": LocData(2000346453, "Time Rift - Deep Sea", dlc_flags=HatDLC.dlc1, hookshot=True), - "Tour - Page: Mafia Town - Ledge": LocData(345038, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), - "Tour - Page: Mafia Town - Beach": LocData(345039, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), - "Tour - Page: Dead Bird Studio - C.A.W. Agents": LocData(345040, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), - "Tour - Page: Dead Bird Studio - Fragile Box": LocData(345041, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), - "Tour - Page: Subcon Forest - Giant Frozen Tree": LocData(345042, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), - "Tour - Page: Subcon Forest - Top of Pillar": LocData(345043, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), - "Tour - Page: Alpine Skyline - Birdhouse": LocData(345044, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), - "Tour - Page: Alpine Skyline - Behind Lava Isle": LocData(345047, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), - "Tour - Page: The Finale - Near Entrance": LocData(345087, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), + "Tour - Page: Mafia Town - Ledge": LocData(2000345038, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), + "Tour - Page: Mafia Town - Beach": LocData(2000345039, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), + "Tour - Page: Dead Bird Studio - C.A.W. Agents": LocData(2000345040, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), + "Tour - Page: Dead Bird Studio - Fragile Box": LocData(2000345041, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), + "Tour - Page: Subcon Forest - Giant Frozen Tree": LocData(2000345042, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), + "Tour - Page: Subcon Forest - Top of Pillar": LocData(2000345043, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), + "Tour - Page: Alpine Skyline - Birdhouse": LocData(2000345044, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), + "Tour - Page: Alpine Skyline - Behind Lava Isle": LocData(2000345047, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), + "Tour - Page: The Finale - Near Entrance": LocData(2000345087, "Time Rift - Tour", dlc_flags=HatDLC.dlc1), - "Rumbi Factory - Page: Manhole": LocData(345891, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), - "Rumbi Factory - Page: Shutter Doors": LocData(345888, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), - "Rumbi Factory - Page: Toxic Waste Dispenser": LocData(345892, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), - "Rumbi Factory - Page: 3rd Area Ledge": LocData(345889, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), - "Rumbi Factory - Page: Green Box Assembly Line": LocData(345884, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), - "Rumbi Factory - Page: Broken Window": LocData(345885, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), - "Rumbi Factory - Page: Money Vault": LocData(345890, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), - "Rumbi Factory - Page: Warehouse Boxes": LocData(345887, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), - "Rumbi Factory - Page: Glass Shelf": LocData(345886, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), - "Rumbi Factory - Page: Last Area": LocData(345883, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Rumbi Factory - Page: Manhole": LocData(2000345891, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Rumbi Factory - Page: Shutter Doors": LocData(2000345888, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Rumbi Factory - Page: Toxic Waste Dispenser": LocData(2000345892, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Rumbi Factory - Page: 20003rd Area Ledge": LocData(2000345889, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Rumbi Factory - Page: Green Box Assembly Line": LocData(2000345884, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Rumbi Factory - Page: Broken Window": LocData(2000345885, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Rumbi Factory - Page: Money Vault": LocData(2000345890, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Rumbi Factory - Page: Warehouse Boxes": LocData(2000345887, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Rumbi Factory - Page: Glass Shelf": LocData(2000345886, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), + "Rumbi Factory - Page: Last Area": LocData(2000345883, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), } shop_locations = { - "Badge Seller - Item 1": LocData(301003, "Badge Seller"), - "Badge Seller - Item 2": LocData(301004, "Badge Seller"), - "Badge Seller - Item 3": LocData(301005, "Badge Seller"), - "Badge Seller - Item 4": LocData(301006, "Badge Seller"), - "Badge Seller - Item 5": LocData(301007, "Badge Seller"), - "Badge Seller - Item 6": LocData(301008, "Badge Seller"), - "Badge Seller - Item 7": LocData(301009, "Badge Seller"), - "Badge Seller - Item 8": LocData(301010, "Badge Seller"), - "Badge Seller - Item 9": LocData(301011, "Badge Seller"), - "Badge Seller - Item 10": LocData(301012, "Badge Seller"), - "Mafia Boss Shop Item": LocData(301013, "Spaceship"), + "Badge Seller - Item 1": LocData(2000301003, "Badge Seller"), + "Badge Seller - Item 2": LocData(2000301004, "Badge Seller"), + "Badge Seller - Item 3": LocData(2000301005, "Badge Seller"), + "Badge Seller - Item 4": LocData(2000301006, "Badge Seller"), + "Badge Seller - Item 5": LocData(2000301007, "Badge Seller"), + "Badge Seller - Item 6": LocData(2000301008, "Badge Seller"), + "Badge Seller - Item 7": LocData(2000301009, "Badge Seller"), + "Badge Seller - Item 8": LocData(2000301010, "Badge Seller"), + "Badge Seller - Item 9": LocData(2000301011, "Badge Seller"), + "Badge Seller - Item 10": LocData(2000301012, "Badge Seller"), + "Mafia Boss Shop Item": LocData(2000301013, "Spaceship"), - "Yellow Overpass Station - Yellow Ticket Booth": LocData(301014, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2), - "Green Clean Station - Green Ticket Booth": LocData(301015, "Green Clean Station", dlc_flags=HatDLC.dlc2), - "Bluefin Tunnel - Blue Ticket Booth": LocData(301016, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2), - "Pink Paw Station - Pink Ticket Booth": LocData(301017, "Pink Paw Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Station - Yellow Ticket Booth": LocData(2000301014, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2), + "Green Clean Station - Green Ticket Booth": LocData(2000301015, "Green Clean Station", dlc_flags=HatDLC.dlc2), + "Bluefin Tunnel - Blue Ticket Booth": LocData(2000301016, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2), + "Pink Paw Station - Pink Ticket Booth": LocData(2000301017, "Pink Paw Station", dlc_flags=HatDLC.dlc2, hookshot=True, required_hats=[HatType.DWELLER]), - "Main Station Thug A - Item 1": LocData(301048, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug A - Item 1": LocData(2000301048, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_0"), - "Main Station Thug A - Item 2": LocData(301049, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug A - Item 2": LocData(2000301049, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_0"), - "Main Station Thug A - Item 3": LocData(301050, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug A - Item 3": LocData(2000301050, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_0"), - "Main Station Thug A - Item 4": LocData(301051, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug A - Item 4": LocData(2000301051, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_0"), - "Main Station Thug A - Item 5": LocData(301052, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug A - Item 5": LocData(2000301052, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_0"), - "Main Station Thug B - Item 1": LocData(301053, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug B - Item 1": LocData(2000301053, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_1"), - "Main Station Thug B - Item 2": LocData(301054, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug B - Item 2": LocData(2000301054, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_1"), - "Main Station Thug B - Item 3": LocData(301055, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug B - Item 3": LocData(2000301055, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_1"), - "Main Station Thug B - Item 4": LocData(301056, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug B - Item 4": LocData(2000301056, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_1"), - "Main Station Thug B - Item 5": LocData(301057, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug B - Item 5": LocData(2000301057, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_1"), - "Main Station Thug C - Item 1": LocData(301058, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug C - Item 1": LocData(2000301058, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_2"), - "Main Station Thug C - Item 2": LocData(301059, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug C - Item 2": LocData(2000301059, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_2"), - "Main Station Thug C - Item 3": LocData(301060, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug C - Item 3": LocData(2000301060, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_2"), - "Main Station Thug C - Item 4": LocData(301061, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug C - Item 4": LocData(2000301061, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_2"), - "Main Station Thug C - Item 5": LocData(301062, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, + "Main Station Thug C - Item 5": LocData(2000301062, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_2"), - "Yellow Overpass Thug A - Item 1": LocData(301018, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug A - Item 1": LocData(2000301018, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_13"), - "Yellow Overpass Thug A - Item 2": LocData(301019, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug A - Item 2": LocData(2000301019, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_13"), - "Yellow Overpass Thug A - Item 3": LocData(301020, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug A - Item 3": LocData(2000301020, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_13"), - "Yellow Overpass Thug A - Item 4": LocData(301021, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug A - Item 4": LocData(2000301021, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_13"), - "Yellow Overpass Thug A - Item 5": LocData(301022, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug A - Item 5": LocData(2000301022, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_13"), - "Yellow Overpass Thug B - Item 1": LocData(301043, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug B - Item 1": LocData(2000301043, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_5"), - "Yellow Overpass Thug B - Item 2": LocData(301044, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug B - Item 2": LocData(2000301044, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_5"), - "Yellow Overpass Thug B - Item 3": LocData(301045, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug B - Item 3": LocData(2000301045, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_5"), - "Yellow Overpass Thug B - Item 4": LocData(301046, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug B - Item 4": LocData(2000301046, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_5"), - "Yellow Overpass Thug B - Item 5": LocData(301047, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug B - Item 5": LocData(2000301047, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_5"), - "Yellow Overpass Thug C - Item 1": LocData(301063, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug C - Item 1": LocData(2000301063, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_14"), - "Yellow Overpass Thug C - Item 2": LocData(301064, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug C - Item 2": LocData(2000301064, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_14"), - "Yellow Overpass Thug C - Item 3": LocData(301065, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug C - Item 3": LocData(2000301065, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_14"), - "Yellow Overpass Thug C - Item 4": LocData(301066, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug C - Item 4": LocData(2000301066, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_14"), - "Yellow Overpass Thug C - Item 5": LocData(301067, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, + "Yellow Overpass Thug C - Item 5": LocData(2000301067, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_14"), - "Green Clean Station Thug A - Item 1": LocData(301033, "Green Clean Station", dlc_flags=HatDLC.dlc2, + "Green Clean Station Thug A - Item 1": LocData(2000301033, "Green Clean Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_4"), - "Green Clean Station Thug A - Item 2": LocData(301034, "Green Clean Station", dlc_flags=HatDLC.dlc2, + "Green Clean Station Thug A - Item 2": LocData(2000301034, "Green Clean Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_4"), - "Green Clean Station Thug A - Item 3": LocData(301035, "Green Clean Station", dlc_flags=HatDLC.dlc2, + "Green Clean Station Thug A - Item 3": LocData(2000301035, "Green Clean Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_4"), - "Green Clean Station Thug A - Item 4": LocData(301036, "Green Clean Station", dlc_flags=HatDLC.dlc2, + "Green Clean Station Thug A - Item 4": LocData(2000301036, "Green Clean Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_4"), - "Green Clean Station Thug A - Item 5": LocData(301037, "Green Clean Station", dlc_flags=HatDLC.dlc2, + "Green Clean Station Thug A - Item 5": LocData(2000301037, "Green Clean Station", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_4"), # This guy requires either the yellow ticket or the Ice Hat - "Green Clean Station Thug B - Item 1": LocData(301028, "Green Clean Station", dlc_flags=HatDLC.dlc2, + "Green Clean Station Thug B - Item 1": LocData(2000301028, "Green Clean Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.ICE], nyakuza_thug="Hat_NPC_NyakuzaShop_6"), - "Green Clean Station Thug B - Item 2": LocData(301029, "Green Clean Station", dlc_flags=HatDLC.dlc2, + "Green Clean Station Thug B - Item 2": LocData(2000301029, "Green Clean Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.ICE], nyakuza_thug="Hat_NPC_NyakuzaShop_6"), - "Green Clean Station Thug B - Item 3": LocData(301030, "Green Clean Station", dlc_flags=HatDLC.dlc2, + "Green Clean Station Thug B - Item 3": LocData(2000301030, "Green Clean Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.ICE], nyakuza_thug="Hat_NPC_NyakuzaShop_6"), - "Green Clean Station Thug B - Item 4": LocData(301031, "Green Clean Station", dlc_flags=HatDLC.dlc2, + "Green Clean Station Thug B - Item 4": LocData(2000301031, "Green Clean Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.ICE], nyakuza_thug="Hat_NPC_NyakuzaShop_6"), - "Green Clean Station Thug B - Item 5": LocData(301032, "Green Clean Station", dlc_flags=HatDLC.dlc2, + "Green Clean Station Thug B - Item 5": LocData(2000301032, "Green Clean Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.ICE], nyakuza_thug="Hat_NPC_NyakuzaShop_6"), - "Bluefin Tunnel Thug - Item 1": LocData(301023, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, + "Bluefin Tunnel Thug - Item 1": LocData(2000301023, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_7"), - "Bluefin Tunnel Thug - Item 2": LocData(301024, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, + "Bluefin Tunnel Thug - Item 2": LocData(2000301024, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_7"), - "Bluefin Tunnel Thug - Item 3": LocData(301025, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, + "Bluefin Tunnel Thug - Item 3": LocData(2000301025, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_7"), - "Bluefin Tunnel Thug - Item 4": LocData(301026, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, + "Bluefin Tunnel Thug - Item 4": LocData(2000301026, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_7"), - "Bluefin Tunnel Thug - Item 5": LocData(301027, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, + "Bluefin Tunnel Thug - Item 5": LocData(2000301027, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, nyakuza_thug="Hat_NPC_NyakuzaShop_7"), - "Pink Paw Station Thug - Item 1": LocData(301038, "Pink Paw Station", dlc_flags=HatDLC.dlc2, + "Pink Paw Station Thug - Item 1": LocData(2000301038, "Pink Paw Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.DWELLER], hookshot=True, nyakuza_thug="Hat_NPC_NyakuzaShop_12"), - "Pink Paw Station Thug - Item 2": LocData(301039, "Pink Paw Station", dlc_flags=HatDLC.dlc2, + "Pink Paw Station Thug - Item 2": LocData(2000301039, "Pink Paw Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.DWELLER], hookshot=True, nyakuza_thug="Hat_NPC_NyakuzaShop_12"), - "Pink Paw Station Thug - Item 3": LocData(301040, "Pink Paw Station", dlc_flags=HatDLC.dlc2, + "Pink Paw Station Thug - Item 3": LocData(2000301040, "Pink Paw Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.DWELLER], hookshot=True, nyakuza_thug="Hat_NPC_NyakuzaShop_12"), - "Pink Paw Station Thug - Item 4": LocData(301041, "Pink Paw Station", dlc_flags=HatDLC.dlc2, + "Pink Paw Station Thug - Item 4": LocData(2000301041, "Pink Paw Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.DWELLER], hookshot=True, nyakuza_thug="Hat_NPC_NyakuzaShop_12"), - "Pink Paw Station Thug - Item 5": LocData(301042, "Pink Paw Station", dlc_flags=HatDLC.dlc2, + "Pink Paw Station Thug - Item 5": LocData(2000301042, "Pink Paw Station", dlc_flags=HatDLC.dlc2, required_hats=[HatType.DWELLER], hookshot=True, nyakuza_thug="Hat_NPC_NyakuzaShop_12"), } contract_locations = { - "Snatcher's Contract - The Subcon Well": LocData(300200, "Contractual Obligations"), - "Snatcher's Contract - Toilet of Doom": LocData(300201, "Subcon Forest Area"), - "Snatcher's Contract - Queen Vanessa's Manor": LocData(300202, "Subcon Forest Area"), - "Snatcher's Contract - Mail Delivery Service": LocData(300203, "Subcon Forest Area"), + "Snatcher's Contract - The Subcon Well": LocData(2000300200, "Contractual Obligations"), + "Snatcher's Contract - Toilet of Doom": LocData(2000300201, "Subcon Forest Area"), + "Snatcher's Contract - Queen Vanessa's Manor": LocData(2000300202, "Subcon Forest Area"), + "Snatcher's Contract - Mail Delivery Service": LocData(2000300203, "Subcon Forest Area"), } # Don't put any of the locations from peaks here, the rules for their entrances are set already @@ -671,61 +664,248 @@ zipline_unlocks = { "Alpine Skyline - The Twilight Path": "Zipline Unlock - The Twilight Bell Path", } -event_locs = { - "HUMT Access": LocData(0, "Heating Up Mafia Town", act_complete_event=False), - "TOD Access": LocData(0, "Toilet of Doom", act_complete_event=False), - "YCHE Access": LocData(0, "Your Contract has Expired", act_complete_event=False), +# act completion rules should be set automatically as these are all event items +zero_jumps_hard = { + "Time Rift - Sewers (Zero Jumps)": LocData(0, "Time Rift - Sewers", + required_hats=[HatType.ICE], dlc_flags=HatDLC.death_wish), - "Birdhouse Cleared": LocData(0, "The Birdhouse"), - "Lava Cake Cleared": LocData(0, "The Lava Cake"), - "Windmill Cleared": LocData(0, "The Windmill"), - "Twilight Bell Cleared": LocData(0, "The Twilight Bell"), - "Time Piece Cluster": LocData(0, "The Finale"), + "Time Rift - Bazaar (Zero Jumps)": LocData(0, "Time Rift - Bazaar", + required_hats=[HatType.ICE], dlc_flags=HatDLC.death_wish), + + "The Big Parade": LocData(0, "The Big Parade", + umbrella=True, + required_hats=[HatType.ICE], + dlc_flags=HatDLC.death_wish), + + "Time Rift - Pipe (Zero Jumps)": LocData(0, "Time Rift - Pipe", hookshot=True, dlc_flags=HatDLC.death_wish), + + "Time Rift - Curly Tail Trail (Zero Jumps)": LocData(0, "Time Rift - Curly Tail Trail", + required_hats=[HatType.ICE], dlc_flags=HatDLC.death_wish), + + "Time Rift - The Twilight Bell (Zero Jumps)": LocData(0, "Time Rift - The Twilight Bell", + required_hats=[HatType.ICE, HatType.DWELLER], + hit_requirement=1, + dlc_flags=HatDLC.death_wish), + + "The Illness has Spread (Zero Jumps)": LocData(0, "The Illness has Spread", + required_hats=[HatType.ICE], hookshot=True, + hit_requirement=1, dlc_flags=HatDLC.death_wish), + + "The Finale (Zero Jumps)": LocData(0, "The Finale", + required_hats=[HatType.ICE, HatType.DWELLER], + hookshot=True, + dlc_flags=HatDLC.death_wish), + + "Pink Paw Station (Zero Jumps)": LocData(0, "Pink Paw Station", + required_hats=[HatType.ICE], + hookshot=True, + dlc_flags=HatDLC.dlc2_dw), +} + +zero_jumps_expert = { + "The Birdhouse (Zero Jumps)": LocData(0, "The Birdhouse", + required_hats=[HatType.ICE], + dlc_flags=HatDLC.death_wish), + + "The Lava Cake (Zero Jumps)": LocData(0, "The Lava Cake", dlc_flags=HatDLC.death_wish), + + "The Windmill (Zero Jumps)": LocData(0, "The Windmill", + required_hats=[HatType.ICE], + misc_required=["No Bonk Badge"], + dlc_flags=HatDLC.death_wish), + "The Twilight Bell (Zero Jumps)": LocData(0, "The Twilight Bell", + required_hats=[HatType.ICE, HatType.DWELLER], + hit_requirement=1, + misc_required=["No Bonk Badge"], + dlc_flags=HatDLC.death_wish), + + "Sleepy Subcon (Zero Jumps)": LocData(0, "Sleepy Subcon", required_hats=[HatType.ICE], dlc_flags=HatDLC.death_wish), + "Ship Shape (Zero Jumps)": LocData(0, "Ship Shape", required_hats=[HatType.ICE], dlc_flags=HatDLC.death_wish), +} + +zero_jumps = { + **zero_jumps_hard, + **zero_jumps_expert, + "Welcome to Mafia Town (Zero Jumps)": LocData(0, "Welcome to Mafia Town", dlc_flags=HatDLC.death_wish), + + "Down with the Mafia! (Zero Jumps)": LocData(0, "Down with the Mafia!", + required_hats=[HatType.ICE], + dlc_flags=HatDLC.death_wish), + + "Cheating the Race (Zero Jumps)": LocData(0, "Cheating the Race", + required_hats=[HatType.TIME_STOP], + dlc_flags=HatDLC.death_wish), + + "The Golden Vault (Zero Jumps)": LocData(0, "The Golden Vault", + required_hats=[HatType.ICE], + dlc_flags=HatDLC.death_wish), + + "Dead Bird Studio (Zero Jumps)": LocData(0, "Dead Bird Studio", + required_hats=[HatType.ICE], + hit_requirement=1, + dlc_flags=HatDLC.death_wish), + + "Murder on the Owl Express (Zero Jumps)": LocData(0, "Murder on the Owl Express", + required_hats=[HatType.ICE], + dlc_flags=HatDLC.death_wish), + + "Picture Perfect (Zero Jumps)": LocData(0, "Picture Perfect", dlc_flags=HatDLC.death_wish), + + "Train Rush (Zero Jumps)": LocData(0, "Train Rush", + required_hats=[HatType.ICE], + hookshot=True, + dlc_flags=HatDLC.death_wish), + + "Contractual Obligations (Zero Jumps)": LocData(0, "Contractual Obligations", + paintings=1, + dlc_flags=HatDLC.death_wish), + + "Your Contract has Expired (Zero Jumps)": LocData(0, "Your Contract has Expired", + umbrella=True, + dlc_flags=HatDLC.death_wish), + + # No ice hat/painting required in Expert + "Toilet of Doom (Zero Jumps)": LocData(0, "Toilet of Doom", + hookshot=True, + hit_requirement=1, + required_hats=[HatType.ICE], + paintings=1, + dlc_flags=HatDLC.death_wish), + + "Mail Delivery Service (Zero Jumps)": LocData(0, "Mail Delivery Service", + required_hats=[HatType.SPRINT], + dlc_flags=HatDLC.death_wish), + + "Time Rift - Alpine Skyline (Zero Jumps)": LocData(0, "Time Rift - Alpine Skyline", + required_hats=[HatType.ICE], + hookshot=True, + dlc_flags=HatDLC.death_wish), + + "Time Rift - The Lab (Zero Jumps)": LocData(0, "Time Rift - The Lab", + required_hats=[HatType.ICE], + dlc_flags=HatDLC.death_wish), + + "Yellow Overpass Station (Zero Jumps)": LocData(0, "Yellow Overpass Station", + required_hats=[HatType.ICE], + hookshot=True, + dlc_flags=HatDLC.dlc2_dw), + + "Green Clean Station (Zero Jumps)": LocData(0, "Green Clean Station", + required_hats=[HatType.ICE], + dlc_flags=HatDLC.dlc2_dw), +} + +# please just ignore all the duplicate key warnings, thanks +snatcher_coins = { + "Snatcher Coin - Top of HQ": LocData(0, "Down with the Mafia!", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Top of HQ": LocData(0, "Cheating the Race", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Top of HQ": LocData(0, "Heating Up Mafia Town", umbrella=True, dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Top of HQ": LocData(0, "The Golden Vault", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Top of HQ": LocData(0, "Beat the Heat", dlc_flags=HatDLC.death_wish), + + "Snatcher Coin - Top of Tower": LocData(0, "Mafia Town Area (HUMT)", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Top of Tower": LocData(0, "Beat the Heat", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Top of Tower": LocData(0, "Collect-a-thon", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Top of Tower": LocData(0, "She Speedran from Outer Space", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Top of Tower": LocData(0, "Mafia's Jumps", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Under Ruined Tower": LocData(0, "Mafia Town Area", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Under Ruined Tower": LocData(0, "Collect-a-thon", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Under Ruined Tower": LocData(0, "She Speedran from Outer Space", dlc_flags=HatDLC.death_wish), + + "Snatcher Coin - Top of Red House": LocData(0, "Dead Bird Studio - Elevator Area", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Top of Red House": LocData(0, "Security Breach", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Train Rush": LocData(0, "Train Rush", hookshot=True, dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Train Rush": LocData(0, "10 Seconds until Self-Destruct", hookshot=True, dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Picture Perfect": LocData(0, "Picture Perfect", dlc_flags=HatDLC.death_wish), + + "Snatcher Coin - Swamp Tree": LocData(0, "Subcon Forest Area", hookshot=True, paintings=1, dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Swamp Tree": LocData(0, "Speedrun Well", hookshot=True, dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Manor Roof": LocData(0, "Subcon Forest Area", hit_requirement=2, paintings=1, dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Giant Time Piece": LocData(0, "Subcon Forest Area", paintings=3, dlc_flags=HatDLC.death_wish), + + "Snatcher Coin - Goat Village Top": LocData(0, "Alpine Skyline Area (TIHS)", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Goat Village Top": LocData(0, "The Illness has Speedrun", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Lava Cake": LocData(0, "The Lava Cake", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Windmill": LocData(0, "The Windmill", dlc_flags=HatDLC.death_wish), + "Snatcher Coin - Windmill": LocData(0, "Wound-Up Windmill", hookshot=True, dlc_flags=HatDLC.death_wish), + + "Snatcher Coin - Green Clean Tower": LocData(0, "Green Clean Station", dlc_flags=HatDLC.dlc2_dw), + "Snatcher Coin - Bluefin Cat Train": LocData(0, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2_dw), + "Snatcher Coin - Pink Paw Fence": LocData(0, "Pink Paw Station", dlc_flags=HatDLC.dlc2_dw), +} + +event_locs = { + **zero_jumps, + **snatcher_coins, + "HUMT Access": LocData(0, "Heating Up Mafia Town"), + "TOD Access": LocData(0, "Toilet of Doom"), + "YCHE Access": LocData(0, "Your Contract has Expired"), + + "Birdhouse Cleared": LocData(0, "The Birdhouse", act_event=True), + "Lava Cake Cleared": LocData(0, "The Lava Cake", act_event=True), + "Windmill Cleared": LocData(0, "The Windmill", act_event=True), + "Twilight Bell Cleared": LocData(0, "The Twilight Bell", act_event=True), + "Time Piece Cluster": LocData(0, "The Finale", act_event=True), # not really an act - "Nyakuza Intro Cleared": LocData(0, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2, act_complete_event=False), + "Nyakuza Intro Cleared": LocData(0, "Nyakuza Free Roam", dlc_flags=HatDLC.dlc2), - "Yellow Overpass Station Cleared": LocData(0, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2), - "Green Clean Station Cleared": LocData(0, "Green Clean Station", dlc_flags=HatDLC.dlc2), - "Bluefin Tunnel Cleared": LocData(0, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2), - "Pink Paw Station Cleared": LocData(0, "Pink Paw Station", dlc_flags=HatDLC.dlc2), - "Yellow Overpass Manhole Cleared": LocData(0, "Yellow Overpass Manhole", dlc_flags=HatDLC.dlc2), - "Green Clean Manhole Cleared": LocData(0, "Green Clean Manhole", dlc_flags=HatDLC.dlc2), - "Pink Paw Manhole Cleared": LocData(0, "Pink Paw Manhole", dlc_flags=HatDLC.dlc2), - "Rush Hour Cleared": LocData(0, "Rush Hour", dlc_flags=HatDLC.dlc2), + "Yellow Overpass Station Cleared": LocData(0, "Yellow Overpass Station", dlc_flags=HatDLC.dlc2, act_event=True), + "Green Clean Station Cleared": LocData(0, "Green Clean Station", dlc_flags=HatDLC.dlc2, act_event=True), + "Bluefin Tunnel Cleared": LocData(0, "Bluefin Tunnel", dlc_flags=HatDLC.dlc2, act_event=True), + "Pink Paw Station Cleared": LocData(0, "Pink Paw Station", dlc_flags=HatDLC.dlc2, act_event=True), + "Yellow Overpass Manhole Cleared": LocData(0, "Yellow Overpass Manhole", dlc_flags=HatDLC.dlc2, act_event=True), + "Green Clean Manhole Cleared": LocData(0, "Green Clean Manhole", dlc_flags=HatDLC.dlc2, act_event=True), + "Pink Paw Manhole Cleared": LocData(0, "Pink Paw Manhole", dlc_flags=HatDLC.dlc2, act_event=True), + "Rush Hour Cleared": LocData(0, "Rush Hour", dlc_flags=HatDLC.dlc2, act_event=True), +} +# DO NOT ALTER THE ORDER OF THIS LIST +death_wishes = { + "Beat the Heat": 2000350000, + "Snatcher's Hit List": 2000350002, + "So You're Back From Outer Space": 2000350004, + "Collect-a-thon": 2000350006, + "Rift Collapse: Mafia of Cooks": 2000350008, + "She Speedran from Outer Space": 2000350010, + "Mafia's Jumps": 2000350012, + "Vault Codes in the Wind": 2000350014, + "Encore! Encore!": 2000350016, + "Snatcher Coins in Mafia Town": 2000350018, - # -------------- Death Wish Candle Related --------------- # + "Security Breach": 2000350020, + "The Great Big Hootenanny": 2000350022, + "Rift Collapse: Dead Bird Studio": 2000350024, + "10 Seconds until Self-Destruct": 2000350026, + "Killing Two Birds": 2000350028, + "Snatcher Coins in Battle of the Birds": 2000350030, + "Zero Jumps": 2000350032, + "Speedrun Well": 2000350034, + "Rift Collapse: Sleepy Subcon": 2000350036, + "Boss Rush": 2000350038, + "Quality Time with Snatcher": 2000350040, + "Breaching the Contract": 2000350042, + "Snatcher Coins in Subcon Forest": 2000350044, - # Snatcher Coins - "MT Access": LocData(0, "Mafia Town Area", act_complete_event=False, dlc_flags=HatDLC.death_wish), - "DWTM Access": LocData(0, "Down with the Mafia!", act_complete_event=False, dlc_flags=HatDLC.death_wish), - "CTR Access": LocData(0, "Cheating the Race", act_complete_event=False, dlc_flags=HatDLC.death_wish), - "TGV Access": LocData(0, "The Golden Vault", act_complete_event=False, dlc_flags=HatDLC.death_wish), + "Bird Sanctuary": 2000350046, + "Rift Collapse: Alpine Skyline": 2000350048, + "Wound-Up Windmill": 2000350050, + "The Illness has Speedrun": 2000350052, + "Snatcher Coins in Alpine Skyline": 2000350054, + "Camera Tourist": 2000350056, - "DBS Access": LocData(0, "Dead Bird Studio - Elevator Area", act_complete_event=False, dlc_flags=HatDLC.death_wish), - "PP Access": LocData(0, "Picture Perfect", act_complete_event=False, dlc_flags=HatDLC.death_wish), + "The Mustache Gauntlet": 2000350058, + "No More Bad Guys": 2000350060, - "SF Access": LocData(0, "Subcon Forest Area", act_complete_event=False, dlc_flags=HatDLC.death_wish), + "Seal the Deal": 2000350062, + "Rift Collapse: Deep Sea": 2000350064, + "Cruisin' for a Bruisin'": 2000350066, - "LC Access": LocData(0, "The Lava Cake", act_complete_event=False, dlc_flags=HatDLC.death_wish), - "WM Access": LocData(0, "The Windmill", act_complete_event=False, dlc_flags=HatDLC.death_wish), - - # Camera Tourist - "Mafia Boss": LocData(0, "Down with the Mafia!", act_complete_event=False, dlc_flags=HatDLC.death_wish), - "Conductor": LocData(0, "Dead Bird Studio Basement", dlc_flags=HatDLC.death_wish), - "Snatcher": LocData(0, "Your Contract has Expired", act_complete_event=False, dlc_flags=HatDLC.death_wish), - "Evil Flower": LocData(0, "The Illness has Spread", act_complete_event=False, dlc_flags=HatDLC.death_wish), - - # Zero Jumps - "Welcome to Mafia Town Cleared": LocData(0, "Welcome to Mafia Town", dlc_flags=HatDLC.death_wish), - "Picture Perfect Cleared": LocData(0, "Picture Perfect", dlc_flags=HatDLC.death_wish), - "Contractual Obligations Cleared": LocData(0, "Contractual Obligations", dlc_flags=HatDLC.death_wish), - "Your Contract has Expired Cleared": LocData(0, "Your Contract has Expired", dlc_flags=HatDLC.death_wish), - "Mail Delivery Service Cleared": LocData(0, "Mail Delivery Service", dlc_flags=HatDLC.death_wish), - "Cheating the Race Cleared": LocData(0, "Cheating the Race", dlc_flags=HatDLC.death_wish), - "Train Rush Cleared": LocData(0, "Train Rush", dlc_flags=HatDLC.death_wish), + "Community Rift: Rhythm Jump Studio": 2000350068, + "Community Rift: Twilight Travels": 2000350070, + "Community Rift: The Mountain Rift": 2000350072, + "Snatcher Coins in Nyakuza Metro": 2000350074, } location_table = { @@ -735,52 +915,3 @@ location_table = { **contract_locations, **shop_locations, } - -# DO NOT ALTER THE ORDER OF THIS LIST -# This file is in here instead of DeathWishLocations.py to prevent circular import problems -death_wishes = { - "Beat the Heat": 350000, - "Snatcher's Hit List": 350002, - "So You're Back From Outer Space": 350004, - "Collect-a-thon": 350006, - "Rift Collapse: Mafia of Cooks": 350008, - "She Speedran from Outer Space": 350010, - "Mafia's Jumps": 350012, - "Vault Codes in the Wind": 350014, - "Encore! Encore!": 350016, - "Snatcher Coins in Mafia Town": 350018, - - "Security Breach": 350020, - "The Great Big Hootenanny": 350022, - "Rift Collapse: Dead Bird Studio": 350024, - "10 Seconds until Self-Destruct": 350026, - "Killing Two Birds": 350028, - "Snatcher Coins in Battle of the Birds": 350030, - "Zero Jumps": 350032, - - "Speedrun Well": 350034, - "Rift Collapse: Sleepy Subcon": 350036, - "Boss Rush": 350038, - "Quality Time with Snatcher": 350040, - "Breaching the Contract": 350042, - "Snatcher Coins in Subcon Forest": 350044, - - "Bird Sanctuary": 350046, - "Rift Collapse: Alpine Skyline": 350048, - "Wound-Up Windmill": 350050, - "The Illness has Speedrun": 350052, - "Snatcher Coins in Alpine Skyline": 350054, - "Camera Tourist": 350056, - - "The Mustache Gauntlet": 350058, - "No More Bad Guys": 350060, - - "Seal the Deal": 350062, - "Rift Collapse: Deep Sea": 350064, - "Cruisin' for a Bruisin'": 350066, - - "Community Rift: Rhythm Jump Studio": 350068, - "Community Rift: Twilight Travels": 350070, - "Community Rift: The Mountain Rift": 350072, - "Snatcher Coins in Nyakuza Metro": 350074, -} diff --git a/worlds/ahit/Options.py b/worlds/ahit/Options.py index c8eced5836..7c0567a151 100644 --- a/worlds/ahit/Options.py +++ b/worlds/ahit/Options.py @@ -532,11 +532,9 @@ class DWExcludeAnnoyingBonuses(Toggle): - Snatcher's Hit List - 10 Seconds until Self-Destruct - Killing Two Birds - - Snatcher Coins in Battle of the Birds - Zero Jumps - Bird Sanctuary - Wound-Up Windmill - - Snatcher Coins in Alpine Skyline - Seal the Deal""" display_name = "Exclude Annoying Death Wish Full Completions" default = 1 @@ -674,6 +672,7 @@ slot_data_options: typing.Dict[str, type(Option)] = { "CTRLogic": CTRLogic, "RandomizeHatOrder": RandomizeHatOrder, "UmbrellaLogic": UmbrellaLogic, + "StartWithCompassBadge": StartWithCompassBadge, "CompassBadgeMode": CompassBadgeMode, "ShuffleStorybookPages": ShuffleStorybookPages, "ShuffleActContracts": ShuffleActContracts, diff --git a/worlds/ahit/Regions.py b/worlds/ahit/Regions.py index c3fbfe8359..b1d2293961 100644 --- a/worlds/ahit/Regions.py +++ b/worlds/ahit/Regions.py @@ -1,11 +1,10 @@ from worlds.AutoWorld import World from BaseClasses import Region, Entrance, ItemClassification, Location -from .Locations import HatInTimeLocation, location_table, storybook_pages, event_locs, is_location_valid, \ - shop_locations, get_tasksanity_start_id -from .Items import HatInTimeItem -from .Types import ChapterIndex, Difficulty +from .Types import ChapterIndex, Difficulty, HatInTimeLocation, HatInTimeItem +from .Locations import location_table, storybook_pages, event_locs, is_location_valid, \ + shop_locations, get_tasksanity_start_id, snatcher_coins, zero_jumps, zero_jumps_expert, zero_jumps_hard import typing -from .Rules import set_rift_rules +from .Rules import set_rift_rules, get_difficulty # ChapterIndex: region @@ -881,6 +880,16 @@ def create_events(world: World) -> int: if not is_location_valid(world, name): continue + if world.is_dw(): + if name in snatcher_coins.keys(): + name = f"{name} ({data.region})" + elif name in zero_jumps: + if get_difficulty(world) < Difficulty.HARD and name in zero_jumps_hard: + continue + + if get_difficulty(world) < Difficulty.EXPERT and name in zero_jumps_expert: + continue + event: Location = create_event(name, world.multiworld.get_region(data.region, world.player), world) event.show_in_spoiler = False count += 1 diff --git a/worlds/ahit/Rules.py b/worlds/ahit/Rules.py index 5123250d85..dd8daedb74 100644 --- a/worlds/ahit/Rules.py +++ b/worlds/ahit/Rules.py @@ -1,8 +1,8 @@ from worlds.AutoWorld import World, CollectionState from worlds.generic.Rules import add_rule, set_rule from .Locations import location_table, zipline_unlocks, is_location_valid, contract_locations, \ - shop_locations, event_locs -from .Types import HatType, ChapterIndex, hat_type_to_item, Difficulty + shop_locations, event_locs, snatcher_coins +from .Types import HatType, ChapterIndex, hat_type_to_item, Difficulty, HatDLC from BaseClasses import Location, Entrance, Region import typing @@ -62,7 +62,7 @@ def get_difficulty(world: World) -> Difficulty: return Difficulty(world.multiworld.LogicDifficulty[world.player].value) -def has_paintings(state: CollectionState, world: World, count: int) -> bool: +def has_paintings(state: CollectionState, world: World, count: int, surf: bool = True) -> bool: if not painting_logic(world): return True @@ -71,11 +71,11 @@ def has_paintings(state: CollectionState, world: World, count: int) -> bool: return True # All paintings can be skipped with No Bonk, very easily, if the player knows - if get_difficulty(world) >= Difficulty.MODERATE and can_surf(state, world): + if surf and get_difficulty(world) >= Difficulty.MODERATE and can_surf(state, world): return True paintings: int = state.count("Progressive Painting Unlock", world.player) - if get_difficulty(world) >= Difficulty.MODERATE: + if surf and get_difficulty(world) >= Difficulty.MODERATE: # Green+Yellow paintings can also be skipped easily if count == 1 or paintings >= 1 and count == 3: return True @@ -264,6 +264,10 @@ def set_rules(world: World): if key in contract_locations.keys(): continue + if data.dlc_flags is HatDLC.death_wish or data.dlc_flags is HatDLC.dlc2_dw: + if key in snatcher_coins.keys(): + key = f"{key} ({data.region})" + location = world.multiworld.get_location(key, world.player) for hat in data.required_hats: @@ -277,7 +281,10 @@ def set_rules(world: World): add_rule(location, lambda state: state.has("Umbrella", world.player)) if data.paintings > 0 and world.multiworld.ShuffleSubconPaintings[world.player].value > 0: - add_rule(location, lambda state, paintings=data.paintings: has_paintings(state, world, paintings)) + if "Toilet of Doom" not in key: + add_rule(location, lambda state, paintings=data.paintings: has_paintings(state, world, paintings)) + else: + add_rule(location, lambda state, paintings=data.paintings: has_paintings(state, world, paintings, False)) if data.hit_requirement > 0: if data.hit_requirement == 1: @@ -402,6 +409,10 @@ def set_moderate_rules(world: World): # Moderate: Gallery without Brewing Hat set_rule(world.multiworld.get_location("Act Completion (Time Rift - Gallery)", world.player), lambda state: True) + # Moderate: Above Boats via Ice Hat Sliding + add_rule(world.multiworld.get_location("Mafia Town - Above Boats", world.player), + lambda state: can_use_hat(state, world, HatType.ICE), "or") + # Moderate: Clock Tower Chest + Ruined Tower with nothing add_rule(world.multiworld.get_location("Mafia Town - Clock Tower Chest", world.player), lambda state: True) add_rule(world.multiworld.get_location("Mafia Town - Top of Ruined Tower", world.player), lambda state: True) @@ -430,6 +441,13 @@ def set_moderate_rules(world: World): set_rule(world.multiworld.get_location("Alpine Skyline - The Birdhouse: Dweller Platforms Relic", world.player), lambda state: True) + # Moderate: Twilight Path without Dweller Mask + set_rule(world.multiworld.get_location("Alpine Skyline - The Twilight Path", world.player), lambda state: True) + + # Moderate: Finale without Hookshot + set_rule(world.multiworld.get_location("Act Completion (The Finale)", world.player), + lambda state: can_use_hat(state, world, HatType.DWELLER)) + if world.is_dlc1(): # Moderate: clear Rock the Boat without Ice Hat add_rule(world.multiworld.get_location("Rock the Boat - Post Captain Rescue", world.player), lambda state: True) @@ -451,13 +469,6 @@ def set_moderate_rules(world: World): # The player can quite literally walk past the fan from the side without Time Stop. set_rule(world.multiworld.get_location("Pink Paw Station - Behind Fan", world.player), lambda state: True) - # The player can't jump back down to the manhole due to a fall damage volume preventing them from doing so - set_rule(world.multiworld.get_location("Act Completion (Pink Paw Manhole)", world.player), - lambda state: (state.has("Metro Ticket - Pink", world.player) - or state.has("Metro Ticket - Yellow", world.player) - and state.has("Metro Ticket - Blue", world.player)) - and can_use_hat(state, world, HatType.ICE)) - # Moderate: clear Rush Hour without Hookshot set_rule(world.multiworld.get_location("Act Completion (Rush Hour)", world.player), lambda state: state.has("Metro Ticket - Pink", world.player) @@ -473,14 +484,13 @@ def set_hard_rules(world: World): lambda state: can_use_hat(state, world, HatType.SPRINT) and state.has("Scooter Badge", world.player), "or") - # Hard: Cross Subcon boss arena gap with No Bonk + SDJ, allowing access to the boss arena chest - # Doing this in reverse from YCHE is expert logic, which expects you to cherry hover - add_rule(world.multiworld.get_location("Subcon Forest - Boss Arena Chest", world.player), - lambda state: can_surf(state, world) and can_sdj(state, world), "or") - set_rule(world.multiworld.get_location("Subcon Forest - Dweller Floating Rocks", world.player), lambda state: has_paintings(state, world, 3)) + # Cherry bridge over boss arena gap (painting still expected) + set_rule(world.multiworld.get_location("Subcon Forest - Boss Arena Chest", world.player), + lambda state: has_paintings(state, world, 1, False)) + # SDJ add_rule(world.multiworld.get_location("Subcon Forest - Long Tree Climb Chest", world.player), lambda state: can_sdj(state, world) @@ -492,13 +502,14 @@ def set_hard_rules(world: World): add_rule(world.multiworld.get_location("Act Completion (Time Rift - Curly Tail Trail)", world.player), lambda state: can_sdj(state, world), "or") - add_rule(world.multiworld.get_location("Act Completion (The Finale)", world.player), - lambda state: can_use_hat(state, world, HatType.DWELLER) and can_sdj(state, world), "or") - # Hard: Mystifying Time Mesa time trial without hats set_rule(world.multiworld.get_location("Alpine Skyline - Mystifying Time Mesa: Zipline", world.player), lambda state: can_use_hookshot(state, world)) + # Finale Telescope with only Ice Hat + add_rule(world.multiworld.get_entrance("Telescope -> Time's End", world.player), + lambda state: can_use_hat(state, world, HatType.ICE), "or") + if world.is_dlc1(): # Hard: clear Deep Sea without Dweller Mask set_rule(world.multiworld.get_location("Act Completion (Time Rift - Deep Sea)", world.player), @@ -515,6 +526,10 @@ def set_hard_rules(world: World): def set_expert_rules(world: World): + # Finale Telescope with no hats + set_rule(world.multiworld.get_entrance("Telescope -> Time's End", world.player), + lambda state: state.has("Time Piece", world.player, world.get_chapter_cost(ChapterIndex.FINALE))) + # Expert: Mafia Town - Above Boats with nothing set_rule(world.multiworld.get_location("Mafia Town - Above Boats", world.player), lambda state: True) @@ -526,8 +541,6 @@ def set_expert_rules(world: World): # Expert: get to and clear Twilight Bell without Dweller Mask. # Dweller Mask OR Sprint Hat OR Brewing Hat OR Time Stop + Umbrella required to complete act. - set_rule(world.multiworld.get_location("Alpine Skyline - The Twilight Path", world.player), lambda state: True) - add_rule(world.multiworld.get_entrance("-> The Twilight Bell", world.player), lambda state: can_use_hookshot(state, world), "or") @@ -640,10 +653,6 @@ def set_subcon_rules(world: World): and (not painting_logic(world) or has_paintings(state, world, 1)) or state.has("YCHE Access", world.player)) - if world.multiworld.UmbrellaLogic[world.player].value > 0: - add_rule(world.multiworld.get_location("Act Completion (Toilet of Doom)", world.player), - lambda state: can_hit(state, world)) - set_rule(world.multiworld.get_location("Act Completion (Time Rift - Village)", world.player), lambda state: can_use_hat(state, world, HatType.BREWING) or state.has("Umbrella", world.player) or can_use_hat(state, world, HatType.DWELLER)) @@ -907,9 +916,12 @@ def set_event_rules(world: World): if not is_location_valid(world, name): continue + if (data.dlc_flags is HatDLC.death_wish or data.dlc_flags is HatDLC.dlc2_dw) and name in snatcher_coins.keys(): + name = f"{name} ({data.region})" + event: Location = world.multiworld.get_location(name, world.player) - if data.act_complete_event: + if data.act_event: add_rule(event, world.multiworld.get_location(f"Act Completion ({data.region})", world.player).access_rule) diff --git a/worlds/ahit/Types.py b/worlds/ahit/Types.py index a62ad581cc..3e1d01ab61 100644 --- a/worlds/ahit/Types.py +++ b/worlds/ahit/Types.py @@ -1,4 +1,14 @@ from enum import IntEnum, IntFlag +from typing import NamedTuple, Optional, List +from BaseClasses import Location, Item, ItemClassification + + +class HatInTimeLocation(Location): + game: str = "A Hat in Time" + + +class HatInTimeItem(Item): + game: str = "A Hat in Time" class HatType(IntEnum): @@ -15,6 +25,7 @@ class HatDLC(IntFlag): dlc1 = 0b001 dlc2 = 0b010 death_wish = 0b100 + dlc2_dw = 0b0110 # for Snatcher Coins in Nyakuza Metro class ChapterIndex(IntEnum): @@ -35,6 +46,30 @@ class Difficulty(IntEnum): EXPERT = 2 +class LocData(NamedTuple): + id: Optional[int] = 0 + region: Optional[str] = "" + required_hats: Optional[List[HatType]] = [HatType.NONE] + hookshot: Optional[bool] = False + dlc_flags: Optional[HatDLC] = HatDLC.none + paintings: Optional[int] = 0 # Paintings required for Subcon painting shuffle + misc_required: Optional[List[str]] = [] + + # For UmbrellaLogic setting + umbrella: Optional[bool] = False # Umbrella required for this check + hit_requirement: Optional[int] = 0 # Hit required. 1 = Umbrella/Brewing only, 2 = bypass w/Dweller Mask (bells) + + # Other + act_event: Optional[bool] = False # Only used for event locations. Copy access rule from act completion + nyakuza_thug: Optional[str] = "" # Name of Nyakuza thug NPC (for metro shops) + + +class ItemData(NamedTuple): + code: Optional[int] + classification: ItemClassification + dlc_flags: Optional[HatDLC] = HatDLC.none + + hat_type_to_item = { HatType.SPRINT: "Sprint Hat", HatType.BREWING: "Brewing Hat", diff --git a/worlds/ahit/__init__.py b/worlds/ahit/__init__.py index 67a9fb0816..564cdbe4f3 100644 --- a/worlds/ahit/__init__.py +++ b/worlds/ahit/__init__.py @@ -1,10 +1,10 @@ -from BaseClasses import Item, ItemClassification, LocationProgressType, Tutorial -from .Items import HatInTimeItem, item_table, create_item, relic_groups, act_contracts, create_itempool +from BaseClasses import Item, ItemClassification, Tutorial +from .Items import item_table, create_item, relic_groups, act_contracts, create_itempool from .Regions import create_regions, randomize_act_entrances, chapter_act_info, create_events, get_shuffled_region from .Locations import location_table, contract_locations, is_location_valid, get_location_names, get_tasksanity_start_id from .Rules import set_rules from .Options import ahit_options, slot_data_options, adjust_options -from .Types import HatType, ChapterIndex +from .Types import HatType, ChapterIndex, HatInTimeItem from .DeathWishLocations import create_dw_regions, dw_classes, death_wishes from .DeathWishRules import set_dw_rules, create_enemy_events from worlds.AutoWorld import World, WebWorld