diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index b98f2153..9d3889d6 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -13,8 +13,6 @@ import ModuleUpdate ModuleUpdate.update() import Utils -death_link = False -item_num = 1 logger = logging.getLogger("Client") @@ -34,62 +32,57 @@ class KH1ClientCommandProcessor(ClientCommandProcessor): def __init__(self, ctx): super().__init__(ctx) + def _cmd_slot_data(self): + """Prints slot data settings for the connected seed""" + for key in self.ctx.slot_data.keys(): + if key not in ["remote_location_ids", "synthesis_item_name_byte_arrays"]: + self.output(str(key) + ": " + str(self.ctx.slot_data[key])) + def _cmd_deathlink(self): - """Toggles Deathlink""" - global death_link - if death_link: - death_link = False - self.output(f"Death Link turned off") - else: - death_link = True - self.output(f"Death Link turned on") - - def _cmd_goal(self): - """Prints goal setting""" - if "goal" in self.ctx.slot_data.keys(): - self.output(str(self.ctx.slot_data["goal"])) - else: - self.output("Unknown") - - def _cmd_eotw_unlock(self): - """Prints End of the World Unlock setting""" - if "required_reports_door" in self.ctx.slot_data.keys(): - if self.ctx.slot_data["required_reports_door"] > 13: - self.output("Item") + """If your Death Link setting is set to "Toggle", use this command to turn Death Link on and off.""" + if "death_link" in self.ctx.slot_data.keys(): + if self.ctx.slot_data["death_link"] == "toggle": + if self.ctx.death_link: + self.ctx.death_link = False + self.output(f"Death Link turned off") + else: + self.ctx.death_link = True + self.output(f"Death Link turned on") else: - self.output(str(self.ctx.slot_data["required_reports_eotw"]) + " reports") + self.output(f"'death_link' is not set to 'toggle' for this seed.") + self.output(f"'death_link' = " + str(self.ctx.slot_data["death_link"])) else: - self.output("Unknown") + self.output(f"No 'death_link' in slot_data keys. You probably aren't connected or are playing an older seed.") - def _cmd_door_unlock(self): - """Prints Final Rest Door Unlock setting""" - if "door" in self.ctx.slot_data.keys(): - if self.ctx.slot_data["door"] == "reports": - self.output(str(self.ctx.slot_data["required_reports_door"]) + " reports") - else: - self.output(str(self.ctx.slot_data["door"])) + def _cmd_communication_path(self): + """Opens a file browser to allow Linux users to manually set their %LOCALAPPDATA% path""" + directory = Utils.open_directory("Select %LOCALAPPDATA% dir", "~/.local/share/Steam/steamapps/compatdata/2552430/pfx/drive_c/users/steamuser/AppData/Local") + if directory: + directory += "/KH1FM" + if not os.path.exists(directory): + os.makedirs(directory) + self.ctx.game_communication_path = directory else: - self.output("Unknown") - - def _cmd_advanced_logic(self): - """Prints advanced logic setting""" - if "advanced_logic" in self.ctx.slot_data.keys(): - self.output(str(self.ctx.slot_data["advanced_logic"])) - else: - self.output("Unknown") + self.output(self.ctx.game_communication_path) class KH1Context(CommonContext): command_processor: int = KH1ClientCommandProcessor game = "Kingdom Hearts" - items_handling = 0b111 # full remote + items_handling = 0b011 # full remote except start inventory def __init__(self, server_address, password): super(KH1Context, self).__init__(server_address, password) self.send_index: int = 0 self.syncing = False self.awaiting_bridge = False - self.hinted_synth_location_ids = False - self.slot_data = {} + self.hinted_location_ids: list[int] = [] + self.slot_data: dict = {} + + # Moved globals into instance attributes + self.death_link: bool = False + self.item_num: int = 1 + self.remote_location_ids: list[int] = [] + # self.game_communication_path: files go in this path to pass data between us and the actual game if "localappdata" in os.environ: self.game_communication_path = os.path.expandvars(r"%localappdata%/KH1FM") @@ -103,6 +96,10 @@ class KH1Context(CommonContext): os.remove(root+"/"+file) async def server_auth(self, password_requested: bool = False): + for root, dirs, files in os.walk(self.game_communication_path): + for file in files: + if file.find("obtain") <= -1: + os.remove(root+"/"+file) if password_requested and not self.password: await super(KH1Context, self).server_auth(password_requested) await self.get_username() @@ -114,8 +111,7 @@ class KH1Context(CommonContext): for file in files: if file.find("obtain") <= -1: os.remove(root + "/" + file) - global item_num - item_num = 1 + self.item_num = 1 @property def endpoints(self): @@ -130,8 +126,7 @@ class KH1Context(CommonContext): for file in files: if file.find("obtain") <= -1: os.remove(root+"/"+file) - global item_num - item_num = 1 + self.item_num = 1 def on_package(self, cmd: str, args: dict): if cmd in {"Connected"}: @@ -142,38 +137,34 @@ class KH1Context(CommonContext): with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() - #Handle Slot Data + # Handle Slot Data self.slot_data = args['slot_data'] for key in list(args['slot_data'].keys()): with open(os.path.join(self.game_communication_path, key + ".cfg"), 'w') as f: f.write(str(args['slot_data'][key])) f.close() - - ###Support Legacy Games - if "Required Reports" in list(args['slot_data'].keys()) and "required_reports_eotw" not in list(args['slot_data'].keys()): - reports_required = args['slot_data']["Required Reports"] - with open(os.path.join(self.game_communication_path, "required_reports.cfg"), 'w') as f: - f.write(str(reports_required)) - f.close() - ###End Support Legacy Games - - #End Handle Slot Data + if key == "remote_location_ids": + self.remote_location_ids = args['slot_data'][key] + if key == "death_link": + if args['slot_data']["death_link"] != "off": + self.death_link = True + # End Handle Slot Data if cmd in {"ReceivedItems"}: start_index = args["index"] if start_index != len(self.items_received): - global item_num for item in args['items']: found = False - item_filename = f"AP_{str(item_num)}.item" + item_filename = f"AP_{str(self.item_num)}.item" for filename in os.listdir(self.game_communication_path): if filename == item_filename: found = True if not found: - with open(os.path.join(self.game_communication_path, item_filename), 'w') as f: - f.write(str(NetworkItem(*item).item) + "\n" + str(NetworkItem(*item).location) + "\n" + str(NetworkItem(*item).player)) - f.close() - item_num = item_num + 1 + if (NetworkItem(*item).player == self.slot and (NetworkItem(*item).location in self.remote_location_ids) or (NetworkItem(*item).location < 0)) or NetworkItem(*item).player != self.slot: + with open(os.path.join(self.game_communication_path, item_filename), 'w') as f: + f.write(str(NetworkItem(*item).item) + "\n" + str(NetworkItem(*item).location) + "\n" + str(NetworkItem(*item).player)) + f.close() + self.item_num += 1 if cmd in {"RoomUpdate"}: if "checked_locations" in args: @@ -186,21 +177,39 @@ class KH1Context(CommonContext): if args["type"] == "ItemSend": item = args["item"] networkItem = NetworkItem(*item) - recieverID = args["receiving"] + receiverID = args["receiving"] senderID = networkItem.player locationID = networkItem.location - if recieverID != self.slot and senderID == self.slot: - itemName = self.item_names.lookup_in_slot(networkItem.item, recieverID) + if receiverID == self.slot or senderID == self.slot: + itemName = self.item_names.lookup_in_slot(networkItem.item, receiverID)[:20] itemCategory = networkItem.flags - recieverName = self.player_names[recieverID] - filename = "sent" - with open(os.path.join(self.game_communication_path, filename), 'w') as f: - f.write( - re.sub('[^A-Za-z0-9 ]+', '',str(itemName))[:15] + "\n" - + re.sub('[^A-Za-z0-9 ]+', '',str(recieverName))[:6] + "\n" - + str(itemCategory) + "\n" - + str(locationID)) - f.close() + receiverName = self.player_names[receiverID][:20] + senderName = self.player_names[senderID][:20] + message = "" + if receiverID == self.slot and receiverID != senderID: # Item received from someone else + message = "From " + senderName + "\n" + itemName + elif senderID == self.slot and receiverID != senderID: # Item sent to someone else + message = itemName + "\nTo " + receiverName + elif locationID in self.remote_location_ids: # Found a remote item + message = itemName + filename = "msg" + if message != "": + if not os.path.exists(self.game_communication_path + "/" + filename): + with open(os.path.join(self.game_communication_path, filename), 'w') as f: + f.write(message) + f.close() + if args["type"] == "ItemCheat": + item = args["item"] + networkItem = NetworkItem(*item) + receiverID = args["receiving"] + if receiverID == self.slot: + itemName = self.item_names.lookup_in_slot(networkItem.item, receiverID)[:20] + filename = "msg" + message = "Received " + itemName + "\nfrom server" + if not os.path.exists(self.game_communication_path + "/" + filename): + with open(os.path.join(self.game_communication_path, filename), 'w') as f: + f.write(message) + f.close() def on_deathlink(self, data: dict[str, object]): self.last_death_link = max(data["time"], self.last_death_link) @@ -230,12 +239,11 @@ class KH1Context(CommonContext): async def game_watcher(ctx: KH1Context): from .Locations import lookup_id_to_name while not ctx.exit_event.is_set(): - global death_link - if death_link and "DeathLink" not in ctx.tags: - await ctx.update_death_link(death_link) - if not death_link and "DeathLink" in ctx.tags: - await ctx.update_death_link(death_link) - if ctx.syncing == True: + if ctx.death_link and "DeathLink" not in ctx.tags: + await ctx.update_death_link(ctx.death_link) + if not ctx.death_link and "DeathLink" in ctx.tags: + await ctx.update_death_link(ctx.death_link) + if ctx.syncing is True: sync_msg = [{'cmd': 'Sync'}] if ctx.locations_checked: sync_msg.append({"cmd": "LocationChecks", "locations": list(ctx.locations_checked)}) @@ -256,17 +264,17 @@ async def game_watcher(ctx: KH1Context): if st != "nil": if timegm(time.strptime(st, '%Y%m%d%H%M%S')) > ctx.last_death_link and int(time.time()) % int(timegm(time.strptime(st, '%Y%m%d%H%M%S'))) < 10: await ctx.send_death(death_text = "Sora was defeated!") - if file.find("insynthshop") > -1: - if not ctx.hinted_synth_location_ids: + if file.find("hint") > -1: + hint_location_id = int(file.split("hint", -1)[1]) + if hint_location_id not in ctx.hinted_location_ids: await ctx.send_msgs([{ "cmd": "LocationScouts", - "locations": [2656401,2656402,2656403,2656404,2656405,2656406], + "locations": [hint_location_id], "create_as_hint": 2 }]) - ctx.hinted_synth_location_ids = True + ctx.hinted_location_ids.append(hint_location_id) ctx.locations_checked = sending - message = [{"cmd": 'LocationChecks', "locations": sending}] - await ctx.send_msgs(message) + await ctx.check_locations(sending) if not ctx.finished_game and victory: await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) ctx.finished_game = True diff --git a/worlds/kh1/Data.py b/worlds/kh1/Data.py new file mode 100644 index 00000000..19227c03 --- /dev/null +++ b/worlds/kh1/Data.py @@ -0,0 +1,202 @@ +VANILLA_KEYBLADE_STATS = [ + {"STR": 3, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Kingdom Key + {"STR": 1, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Dream Sword + {"STR": 1, "CRR": 0, "CRB": 0, "REC": 60, "MP": 0}, # Dream Shield + {"STR": 1, "CRR": 10, "CRB": 0, "REC": 30, "MP": 0}, # Dream Rod + {"STR": 0, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Wooden Sword + {"STR": 5, "CRR": 10, "CRB": 0, "REC": 1, "MP": 0}, # Jungle King + {"STR": 6, "CRR": 20, "CRB": 0, "REC": 60, "MP": 0}, # Three Wishes + {"STR": 8, "CRR": 10, "CRB": 2, "REC": 30, "MP": 1}, # Fairy Harp + {"STR": 7, "CRR": 40, "CRB": 0, "REC": 1, "MP": 0}, # Pumpkinhead + {"STR": 6, "CRR": 20, "CRB": 0, "REC": 30, "MP": 1}, # Crabclaw + {"STR": 13, "CRR": 40, "CRB": 0, "REC": 60, "MP": 0}, # Divine Rose + {"STR": 4, "CRR": 20, "CRB": 0, "REC": 30, "MP": 2}, # Spellbinder + {"STR": 10, "CRR": 20, "CRB": 2, "REC": 90, "MP": 0}, # Olympia + {"STR": 10, "CRR": 20, "CRB": 0, "REC": 30, "MP": 1}, # Lionheart + {"STR": 9, "CRR": 2, "CRB": 0, "REC": 90, "MP": -1}, # Metal Chocobo + {"STR": 9, "CRR": 40, "CRB": 0, "REC": 1, "MP": 1}, # Oathkeeper + {"STR": 11, "CRR": 20, "CRB": 2, "REC": 30, "MP": -1}, # Oblivion + {"STR": 7, "CRR": 20, "CRB": 0, "REC": 1, "MP": 2}, # Lady Luck + {"STR": 5, "CRR": 200, "CRB": 2, "REC": 1, "MP": 0}, # Wishing Star + {"STR": 14, "CRR": 40, "CRB": 2, "REC": 90, "MP": 2}, # Ultima Weapon + {"STR": 3, "CRR": 20, "CRB": 0, "REC": 1, "MP": 3}, # Diamond Dust + {"STR": 8, "CRR": 10, "CRB": 16, "REC": 90, "MP": -2}, # One-Winged Angel + ] +VANILLA_PUPPY_LOCATIONS = [ + "Traverse Town Mystical House Glide Chest", + "Traverse Town Alleyway Behind Crates Chest", + "Traverse Town Item Workshop Left Chest", + "Traverse Town Secret Waterway Near Stairs Chest", + "Wonderland Queen's Castle Hedge Right Blue Chest", + "Wonderland Lotus Forest Nut Chest", + "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest", + "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest", + "Deep Jungle Hippo's Lagoon Center Chest", + "Deep Jungle Vines 2 Chest", + "Deep Jungle Waterfall Cavern Middle Chest", + "Deep Jungle Camp Blue Trinity Chest", + "Agrabah Cave of Wonders Treasure Room Across Platforms Chest", + "Halloween Town Oogie's Manor Hollow Chest", + "Neverland Pirate Ship Deck White Trinity Chest", + "Agrabah Cave of Wonders Hidden Room Left Chest", + "Agrabah Cave of Wonders Entrance Tall Tower Chest", + "Agrabah Palace Gates High Opposite Palace Chest", + "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest", + "Wonderland Lotus Forest Through the Painting Thunder Plant Chest", + "Hollow Bastion Grand Hall Left of Gate Chest", + "Halloween Town Cemetery By Cat Shape Chest", + "Halloween Town Moonlight Hill White Trinity Chest", + "Halloween Town Guillotine Square Pumpkin Structure Right Chest", + "Monstro Mouth High Platform Across from Boat Chest", + "Monstro Chamber 6 Low Chest", + "Monstro Chamber 5 Atop Barrel Chest", + "Neverland Hold Flight 1st Chest", + "Neverland Hold Yellow Trinity Green Chest", + "Neverland Captain's Cabin Chest", + "Hollow Bastion Rising Falls Floating Platform Near Save Chest", + "Hollow Bastion Castle Gates Gravity Chest", + "Hollow Bastion Lift Stop Outside Library Gravity Chest" + ] +CHAR_TO_KH = { + " ": 0x01, + "0": 0x21, + "1": 0x22, + "2": 0x23, + "3": 0x24, + "4": 0x25, + "5": 0x26, + "6": 0x27, + "7": 0x28, + "8": 0x29, + "9": 0x2A, + "A": 0x2B, + "B": 0x2C, + "C": 0x2D, + "D": 0x2E, + "E": 0x2F, + "F": 0x30, + "G": 0x31, + "H": 0x32, + "I": 0x33, + "J": 0x34, + "K": 0x35, + "L": 0x36, + "M": 0x37, + "N": 0x38, + "O": 0x39, + "P": 0x3A, + "Q": 0x3B, + "R": 0x3C, + "S": 0x3D, + "T": 0x3E, + "U": 0x3F, + "V": 0x40, + "W": 0x41, + "X": 0x42, + "Y": 0x43, + "Z": 0x44, + "a": 0x45, + "b": 0x46, + "c": 0x47, + "d": 0x48, + "e": 0x49, + "f": 0x4A, + "g": 0x4B, + "h": 0x4C, + "i": 0x4D, + "j": 0x4E, + "k": 0x4F, + "l": 0x50, + "m": 0x51, + "n": 0x52, + "o": 0x53, + "p": 0x54, + "q": 0x55, + "r": 0x56, + "s": 0x57, + "t": 0x58, + "u": 0x59, + "v": 0x5A, + "w": 0x5B, + "x": 0x5C, + "y": 0x5D, + "z": 0x5E + } +VANILLA_ABILITY_AP_COSTS = [ + {"Ability Name": "Treasure Magnet", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Combo Plus", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Air Combo Plus", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Critical Plus", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Second Wind", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Scan", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Sonic Blade", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ars Arcanum", "AP Cost": 4, "Randomize": True}, + {"Ability Name": "Strike Raid", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ragnarok", "AP Cost": 4, "Randomize": True}, + {"Ability Name": "Trinity Limit", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Cheer", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Vortex", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Aerial Sweep", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Counter Attack", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Blitz", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Guard", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Dodge Roll", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "MP Haste", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "MP Rage", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Second Chance", "AP Cost": 5, "Randomize": True}, + {"Ability Name": "Berserk", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Jackpot", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Lucky Strike", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Charge", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Rocket", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Tornado", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "MP Gift", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Raging Boar", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Asp's Bite", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Healing Herb", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Wind Armor", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Crescent", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Sandstorm", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Applause!", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Blazing Fury", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Icy Terror", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Bolts of Sorrow", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ghostly Scream", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Hummingbird", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Time-Out", "AP Cost": 4, "Randomize": True}, + {"Ability Name": "Storm“s Eye", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ferocious Lunge", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Furious Bellow", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Spiral Wave", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Thunder Potion", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Cure Potion", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Aero Potion", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Slapshot", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Sliding Dash", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Hurricane Blast", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Ripple Drive", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Stun Impact", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Gravity Break", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Zantetsuken", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Tech Boost", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Encounter Plus", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Leaf Bracer", "AP Cost": 5, "Randomize": True}, + {"Ability Name": "Evolution", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "EXP Zero", "AP Cost": 0, "Randomize": True}, + {"Ability Name": "Combo Master", "AP Cost": 3, "Randomize": True} + ] + +WORLD_KEY_ITEMS = { + "Footprints": "Wonderland", + "Entry Pass": "Olympus Coliseum", + "Slides": "Deep Jungle", + "Crystal Trident": "Atlantica", + "Forget-Me-Not": "Halloween Town", + "Jack-In-The-Box": "Halloween Town", + "Theon Vol. 6": "Hollow Bastion" +} + +LOGIC_BEGINNER = 0 +LOGIC_NORMAL = 5 +LOGIC_PROUD = 10 +LOGIC_MINIMAL = 15 \ No newline at end of file diff --git a/worlds/kh1/GenerateJSON.py b/worlds/kh1/GenerateJSON.py new file mode 100644 index 00000000..fdd8f215 --- /dev/null +++ b/worlds/kh1/GenerateJSON.py @@ -0,0 +1,67 @@ +import logging + +import yaml +import os +import io +from typing import TYPE_CHECKING, Dict, List, Optional, cast +import Utils +import zipfile +import json + +from .Locations import KH1Location, location_table + +from worlds.Files import APPlayerContainer + + + +class KH1Container(APPlayerContainer): + game: str = 'Kingdom Hearts' + patch_file_ending = ".zip" + + def __init__(self, patch_data: Dict[str, str] | io.BytesIO, base_path: str = "", output_directory: str = "", + player: Optional[int] = None, player_name: str = "", server: str = ""): + self.patch_data = patch_data + self.file_path = base_path + container_path = os.path.join(output_directory, base_path + ".zip") + super().__init__(container_path, player, player_name, server) + + def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None: + for filename, text in self.patch_data.items(): + opened_zipfile.writestr(filename, text) + super().write_contents(opened_zipfile) + + +def generate_json(world, output_directory): + mod_name = f"AP-{world.multiworld.seed_name}-P{world.player}-{world.multiworld.get_file_safe_player_name(world.player)}" + mod_dir = os.path.join(output_directory, mod_name + "_" + Utils.__version__) + + item_location_map = get_item_location_map(world) + settings = get_settings(world) + + files = { + "item_location_map.json": json.dumps(item_location_map), + "keyblade_stats.json": json.dumps(world.get_keyblade_stats()), + "settings.json": json.dumps(settings), + "ap_costs.json": json.dumps(world.get_ap_costs()) + } + + mod = KH1Container(files, mod_dir, output_directory, world.player, + world.multiworld.get_file_safe_player_name(world.player)) + mod.write() + +def get_item_location_map(world): + location_item_map = {} + for location in world.multiworld.get_filled_locations(world.player): + if location.name != "Final Ansem": + if world.player != location.item.player or (world.player == location.item.player and world.options.remote_items.current_key == "full" and (location_table[location.name].code < 2656800 or location_table[location.name].code > 2656814)): + item_id = 2641230 + else: + item_id = location.item.code + location_data = location_table[location.name] + location_id = location_data.code + location_item_map[location_id] = item_id + return location_item_map + +def get_settings(world): + settings = world.fill_slot_data() + return settings \ No newline at end of file diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index bac98a9b..c453d904 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -10,518 +10,341 @@ class KH1Item(Item): class KH1ItemData(NamedTuple): category: str code: int + type: str classification: ItemClassification = ItemClassification.filler max_quantity: int = 1 weight: int = 1 def get_items_by_category(category: str) -> Dict[str, KH1ItemData]: - item_dict: Dict[str, KH1ItemData] = {} - for name, data in item_table.items(): - if data.category == category: - item_dict.setdefault(name, data) - - return item_dict - + return {name: data for name, data in item_table.items() if data.category == category} item_table: Dict[str, KH1ItemData] = { - "Victory": KH1ItemData("VIC", code = 264_0000, classification = ItemClassification.progression, ), - "Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, ), - "Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, ), - "Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, ), - "Elixir": KH1ItemData("Item", code = 264_1004, classification = ItemClassification.filler, ), - #"B05": KH1ItemData("Item", code = 264_1005, classification = ItemClassification.filler, ), - "Mega-Potion": KH1ItemData("Item", code = 264_1006, classification = ItemClassification.filler, ), - "Mega-Ether": KH1ItemData("Item", code = 264_1007, classification = ItemClassification.filler, ), - "Megalixir": KH1ItemData("Item", code = 264_1008, classification = ItemClassification.filler, ), - #"Fury Stone": KH1ItemData("Synthesis", code = 264_1009, classification = ItemClassification.filler, ), - #"Power Stone": KH1ItemData("Synthesis", code = 264_1010, classification = ItemClassification.filler, ), - #"Energy Stone": KH1ItemData("Synthesis", code = 264_1011, classification = ItemClassification.filler, ), - #"Blazing Stone": KH1ItemData("Synthesis", code = 264_1012, classification = ItemClassification.filler, ), - #"Frost Stone": KH1ItemData("Synthesis", code = 264_1013, classification = ItemClassification.filler, ), - #"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, ), - #"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, ), - #"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, ), - "Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.useful, ), - "Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.useful, ), - "Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.useful, ), - "Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.useful, ), - "Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.useful, ), - "Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.useful, ), - "Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.useful, ), - "Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.useful, ), - "Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.useful, ), - "Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.useful, ), - "Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.useful, ), - "Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.useful, ), - "Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.useful, ), - "Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.useful, ), - "Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.useful, ), - "Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.useful, ), - "Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.useful, ), - "Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.useful, ), - "Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.useful, ), - "Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.useful, ), - "Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.useful, ), - "Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.useful, ), - "Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.useful, ), - "Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.useful, ), - "Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.useful, ), - "Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.useful, ), - "Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.useful, ), - "Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.useful, ), - "Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.useful, ), - "Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.useful, ), - "Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.useful, ), - "Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.useful, ), - "Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.useful, ), - "Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.useful, ), - "White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.useful, ), - "Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.useful, ), - "Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.useful, ), - "Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.useful, ), - "Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.useful, ), - "EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.useful, ), - #"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.useful, ), - "EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.useful, ), - "EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.useful, ), - "EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.useful, ), - "Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.useful, ), - "Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.useful, ), - "Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.useful, ), - "Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.useful, ), - "Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.useful, ), - "Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.useful, ), - "Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.useful, ), - "Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.useful, ), - "Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.useful, ), - "Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.useful, ), - "Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.useful, ), - #"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, ), - #"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, ), - #"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, ), - #"A59": KH1ItemData("Accessory", code = 264_1075, classification = ItemClassification.filler, ), - #"A60": KH1ItemData("Accessory", code = 264_1076, classification = ItemClassification.filler, ), - #"A61": KH1ItemData("Accessory", code = 264_1077, classification = ItemClassification.filler, ), - #"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, ), - #"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, ), - #"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, ), - #"Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, ), - #"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, ), - #"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, ), - #"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, ), - "Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, ), - "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.progression, ), - "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.progression, ), - "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.progression, ), - "Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.progression, ), - "Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.useful, ), - "Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.progression, ), - "Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.useful, ), - "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, ), - "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, ), - "Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, ), - "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.progression, ), - "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, ), - "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, ), - "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, ), - "Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, ), - "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, ), - "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, ), - #"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, ), - "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.useful, ), - "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.useful, ), - "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.useful, ), - "Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.useful, ), - "Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.useful, ), - "Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.useful, ), - "Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.useful, ), - "Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.useful, ), - "Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.useful, ), - "Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.useful, ), - "Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.useful, ), - "Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.useful, ), - "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.useful, ), - "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.useful, ), - #"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, ), - #"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, ), - "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.useful, ), - "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.useful, ), - "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.useful, ), - "Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.useful, ), - "Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.useful, ), - "Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.useful, ), - "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, ), - "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, ), - "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, ), - "Dream Shield (Goofy)": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, ), - "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, ), - "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, ), - "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, ), - "Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.useful, ), - #"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, ), - #"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, ), - #"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, ), - #"Genie": KH1ItemData("Weapons", code = 264_1137, classification = ItemClassification.filler, ), - #"No Weapon": KH1ItemData("Weapons", code = 264_1138, classification = ItemClassification.filler, ), - #"No Weapon": KH1ItemData("Weapons", code = 264_1139, classification = ItemClassification.filler, ), - #"Tinker Bell": KH1ItemData("Weapons", code = 264_1140, classification = ItemClassification.filler, ), - #"Claws": KH1ItemData("Weapons", code = 264_1141, classification = ItemClassification.filler, ), - "Tent": KH1ItemData("Camping", code = 264_1142, classification = ItemClassification.filler, ), - "Camping Set": KH1ItemData("Camping", code = 264_1143, classification = ItemClassification.filler, ), - "Cottage": KH1ItemData("Camping", code = 264_1144, classification = ItemClassification.filler, ), - #"C04": KH1ItemData("Camping", code = 264_1145, classification = ItemClassification.filler, ), - #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, ), - #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, ), - #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, ), - "Ansem's Report 11": KH1ItemData("Reports", code = 264_1149, classification = ItemClassification.progression, ), - "Ansem's Report 12": KH1ItemData("Reports", code = 264_1150, classification = ItemClassification.progression, ), - "Ansem's Report 13": KH1ItemData("Reports", code = 264_1151, classification = ItemClassification.progression, ), - "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, ), - "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, ), - "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, ), - #"Serenity Power": KH1ItemData("Synthesis", code = 264_1155, classification = ItemClassification.filler, ), - #"Dark Matter": KH1ItemData("Synthesis", code = 264_1156, classification = ItemClassification.filler, ), - #"Mythril Stone": KH1ItemData("Synthesis", code = 264_1157, classification = ItemClassification.filler, ), - "Fire Arts": KH1ItemData("Key", code = 264_1158, classification = ItemClassification.progression, ), - "Blizzard Arts": KH1ItemData("Key", code = 264_1159, classification = ItemClassification.progression, ), - "Thunder Arts": KH1ItemData("Key", code = 264_1160, classification = ItemClassification.progression, ), - "Cure Arts": KH1ItemData("Key", code = 264_1161, classification = ItemClassification.progression, ), - "Gravity Arts": KH1ItemData("Key", code = 264_1162, classification = ItemClassification.progression, ), - "Stop Arts": KH1ItemData("Key", code = 264_1163, classification = ItemClassification.progression, ), - "Aero Arts": KH1ItemData("Key", code = 264_1164, classification = ItemClassification.progression, ), - #"Shiitank Rank": KH1ItemData("Synthesis", code = 264_1165, classification = ItemClassification.filler, ), - #"Matsutake Rank": KH1ItemData("Synthesis", code = 264_1166, classification = ItemClassification.filler, ), - #"Mystery Mold": KH1ItemData("Synthesis", code = 264_1167, classification = ItemClassification.filler, ), - "Ansem's Report 1": KH1ItemData("Reports", code = 264_1168, classification = ItemClassification.progression, ), - "Ansem's Report 2": KH1ItemData("Reports", code = 264_1169, classification = ItemClassification.progression, ), - "Ansem's Report 3": KH1ItemData("Reports", code = 264_1170, classification = ItemClassification.progression, ), - "Ansem's Report 4": KH1ItemData("Reports", code = 264_1171, classification = ItemClassification.progression, ), - "Ansem's Report 5": KH1ItemData("Reports", code = 264_1172, classification = ItemClassification.progression, ), - "Ansem's Report 6": KH1ItemData("Reports", code = 264_1173, classification = ItemClassification.progression, ), - "Ansem's Report 7": KH1ItemData("Reports", code = 264_1174, classification = ItemClassification.progression, ), - "Ansem's Report 8": KH1ItemData("Reports", code = 264_1175, classification = ItemClassification.progression, ), - "Ansem's Report 9": KH1ItemData("Reports", code = 264_1176, classification = ItemClassification.progression, ), - "Ansem's Report 10": KH1ItemData("Reports", code = 264_1177, classification = ItemClassification.progression, ), - #"Khama Vol. 8": KH1ItemData("Key", code = 264_1178, classification = ItemClassification.progression, ), - #"Salegg Vol. 6": KH1ItemData("Key", code = 264_1179, classification = ItemClassification.progression, ), - #"Azal Vol. 3": KH1ItemData("Key", code = 264_1180, classification = ItemClassification.progression, ), - #"Mava Vol. 3": KH1ItemData("Key", code = 264_1181, classification = ItemClassification.progression, ), - #"Mava Vol. 6": KH1ItemData("Key", code = 264_1182, classification = ItemClassification.progression, ), - "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, ), - #"Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, ), - #"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, ), - "Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 6 ), - #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, ), - "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, ), - "Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, ), - "Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, ), - "Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, ), - #"Log": KH1ItemData("Key", code = 264_1192, classification = ItemClassification.progression, ), - #"Cloth": KH1ItemData("Key", code = 264_1193, classification = ItemClassification.progression, ), - #"Rope": KH1ItemData("Key", code = 264_1194, classification = ItemClassification.progression, ), - #"Seagull Egg": KH1ItemData("Key", code = 264_1195, classification = ItemClassification.progression, ), - #"Fish": KH1ItemData("Key", code = 264_1196, classification = ItemClassification.progression, ), - #"Mushroom": KH1ItemData("Key", code = 264_1197, classification = ItemClassification.progression, ), - #"Coconut": KH1ItemData("Key", code = 264_1198, classification = ItemClassification.progression, ), - #"Drinking Water": KH1ItemData("Key", code = 264_1199, classification = ItemClassification.progression, ), - #"Navi-G Piece 1": KH1ItemData("Key", code = 264_1200, classification = ItemClassification.progression, ), - #"Navi-G Piece 2": KH1ItemData("Key", code = 264_1201, classification = ItemClassification.progression, ), - #"Navi-Gummi Unused": KH1ItemData("Key", code = 264_1202, classification = ItemClassification.progression, ), - #"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, ), - #"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, ), - #"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, ), - #"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, ), - #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, ), - #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, ), - #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, ), - "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, ), - "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 10), - "Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, ), - "Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, ), - "Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, ), - "Torn Page 4": KH1ItemData("Torn Pages", code = 264_1215, classification = ItemClassification.progression, ), - "Torn Page 5": KH1ItemData("Torn Pages", code = 264_1216, classification = ItemClassification.progression, ), - "Slides": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, ), - #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, ), - #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, ), - #"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, ), - #"Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, ), - #"Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, ), - "Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, ), - #"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, ), - #"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, ), - #"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, ), - "Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, ), - "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, ), - "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, ), - #"Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, ), - #"Pretty Stone": KH1ItemData("Synthesis", code = 264_1231, classification = ItemClassification.filler, ), - #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, ), - #"Lucid Shard": KH1ItemData("Synthesis", code = 264_1233, classification = ItemClassification.filler, ), - #"Lucid Gem": KH1ItemData("Synthesis", code = 264_1234, classification = ItemClassification.filler, ), - #"Lucid Crystal": KH1ItemData("Synthesis", code = 264_1235, classification = ItemClassification.filler, ), - #"Spirit Shard": KH1ItemData("Synthesis", code = 264_1236, classification = ItemClassification.filler, ), - #"Spirit Gem": KH1ItemData("Synthesis", code = 264_1237, classification = ItemClassification.filler, ), - #"Power Shard": KH1ItemData("Synthesis", code = 264_1238, classification = ItemClassification.filler, ), - #"Power Gem": KH1ItemData("Synthesis", code = 264_1239, classification = ItemClassification.filler, ), - #"Power Crystal": KH1ItemData("Synthesis", code = 264_1240, classification = ItemClassification.filler, ), - #"Blaze Shard": KH1ItemData("Synthesis", code = 264_1241, classification = ItemClassification.filler, ), - #"Blaze Gem": KH1ItemData("Synthesis", code = 264_1242, classification = ItemClassification.filler, ), - #"Frost Shard": KH1ItemData("Synthesis", code = 264_1243, classification = ItemClassification.filler, ), - #"Frost Gem": KH1ItemData("Synthesis", code = 264_1244, classification = ItemClassification.filler, ), - #"Thunder Shard": KH1ItemData("Synthesis", code = 264_1245, classification = ItemClassification.filler, ), - #"Thunder Gem": KH1ItemData("Synthesis", code = 264_1246, classification = ItemClassification.filler, ), - #"Shiny Crystal": KH1ItemData("Synthesis", code = 264_1247, classification = ItemClassification.filler, ), - #"Bright Shard": KH1ItemData("Synthesis", code = 264_1248, classification = ItemClassification.filler, ), - #"Bright Gem": KH1ItemData("Synthesis", code = 264_1249, classification = ItemClassification.filler, ), - #"Bright Crystal": KH1ItemData("Synthesis", code = 264_1250, classification = ItemClassification.filler, ), - #"Mystery Goo": KH1ItemData("Synthesis", code = 264_1251, classification = ItemClassification.filler, ), - #"Gale": KH1ItemData("Synthesis", code = 264_1252, classification = ItemClassification.filler, ), - #"Mythril Shard": KH1ItemData("Synthesis", code = 264_1253, classification = ItemClassification.filler, ), - #"Mythril": KH1ItemData("Synthesis", code = 264_1254, classification = ItemClassification.filler, ), - #"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, ), - "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, ), - "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, ), - "Progressive Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 2 ), - #"Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, ), - "Puppy 01": KH1ItemData("Puppies", code = 264_2101, classification = ItemClassification.progression, ), - "Puppy 02": KH1ItemData("Puppies", code = 264_2102, classification = ItemClassification.progression, ), - "Puppy 03": KH1ItemData("Puppies", code = 264_2103, classification = ItemClassification.progression, ), - "Puppy 04": KH1ItemData("Puppies", code = 264_2104, classification = ItemClassification.progression, ), - "Puppy 05": KH1ItemData("Puppies", code = 264_2105, classification = ItemClassification.progression, ), - "Puppy 06": KH1ItemData("Puppies", code = 264_2106, classification = ItemClassification.progression, ), - "Puppy 07": KH1ItemData("Puppies", code = 264_2107, classification = ItemClassification.progression, ), - "Puppy 08": KH1ItemData("Puppies", code = 264_2108, classification = ItemClassification.progression, ), - "Puppy 09": KH1ItemData("Puppies", code = 264_2109, classification = ItemClassification.progression, ), - "Puppy 10": KH1ItemData("Puppies", code = 264_2110, classification = ItemClassification.progression, ), - "Puppy 11": KH1ItemData("Puppies", code = 264_2111, classification = ItemClassification.progression, ), - "Puppy 12": KH1ItemData("Puppies", code = 264_2112, classification = ItemClassification.progression, ), - "Puppy 13": KH1ItemData("Puppies", code = 264_2113, classification = ItemClassification.progression, ), - "Puppy 14": KH1ItemData("Puppies", code = 264_2114, classification = ItemClassification.progression, ), - "Puppy 15": KH1ItemData("Puppies", code = 264_2115, classification = ItemClassification.progression, ), - "Puppy 16": KH1ItemData("Puppies", code = 264_2116, classification = ItemClassification.progression, ), - "Puppy 17": KH1ItemData("Puppies", code = 264_2117, classification = ItemClassification.progression, ), - "Puppy 18": KH1ItemData("Puppies", code = 264_2118, classification = ItemClassification.progression, ), - "Puppy 19": KH1ItemData("Puppies", code = 264_2119, classification = ItemClassification.progression, ), - "Puppy 20": KH1ItemData("Puppies", code = 264_2120, classification = ItemClassification.progression, ), - "Puppy 21": KH1ItemData("Puppies", code = 264_2121, classification = ItemClassification.progression, ), - "Puppy 22": KH1ItemData("Puppies", code = 264_2122, classification = ItemClassification.progression, ), - "Puppy 23": KH1ItemData("Puppies", code = 264_2123, classification = ItemClassification.progression, ), - "Puppy 24": KH1ItemData("Puppies", code = 264_2124, classification = ItemClassification.progression, ), - "Puppy 25": KH1ItemData("Puppies", code = 264_2125, classification = ItemClassification.progression, ), - "Puppy 26": KH1ItemData("Puppies", code = 264_2126, classification = ItemClassification.progression, ), - "Puppy 27": KH1ItemData("Puppies", code = 264_2127, classification = ItemClassification.progression, ), - "Puppy 28": KH1ItemData("Puppies", code = 264_2128, classification = ItemClassification.progression, ), - "Puppy 29": KH1ItemData("Puppies", code = 264_2129, classification = ItemClassification.progression, ), - "Puppy 30": KH1ItemData("Puppies", code = 264_2130, classification = ItemClassification.progression, ), - "Puppy 31": KH1ItemData("Puppies", code = 264_2131, classification = ItemClassification.progression, ), - "Puppy 32": KH1ItemData("Puppies", code = 264_2132, classification = ItemClassification.progression, ), - "Puppy 33": KH1ItemData("Puppies", code = 264_2133, classification = ItemClassification.progression, ), - "Puppy 34": KH1ItemData("Puppies", code = 264_2134, classification = ItemClassification.progression, ), - "Puppy 35": KH1ItemData("Puppies", code = 264_2135, classification = ItemClassification.progression, ), - "Puppy 36": KH1ItemData("Puppies", code = 264_2136, classification = ItemClassification.progression, ), - "Puppy 37": KH1ItemData("Puppies", code = 264_2137, classification = ItemClassification.progression, ), - "Puppy 38": KH1ItemData("Puppies", code = 264_2138, classification = ItemClassification.progression, ), - "Puppy 39": KH1ItemData("Puppies", code = 264_2139, classification = ItemClassification.progression, ), - "Puppy 40": KH1ItemData("Puppies", code = 264_2140, classification = ItemClassification.progression, ), - "Puppy 41": KH1ItemData("Puppies", code = 264_2141, classification = ItemClassification.progression, ), - "Puppy 42": KH1ItemData("Puppies", code = 264_2142, classification = ItemClassification.progression, ), - "Puppy 43": KH1ItemData("Puppies", code = 264_2143, classification = ItemClassification.progression, ), - "Puppy 44": KH1ItemData("Puppies", code = 264_2144, classification = ItemClassification.progression, ), - "Puppy 45": KH1ItemData("Puppies", code = 264_2145, classification = ItemClassification.progression, ), - "Puppy 46": KH1ItemData("Puppies", code = 264_2146, classification = ItemClassification.progression, ), - "Puppy 47": KH1ItemData("Puppies", code = 264_2147, classification = ItemClassification.progression, ), - "Puppy 48": KH1ItemData("Puppies", code = 264_2148, classification = ItemClassification.progression, ), - "Puppy 49": KH1ItemData("Puppies", code = 264_2149, classification = ItemClassification.progression, ), - "Puppy 50": KH1ItemData("Puppies", code = 264_2150, classification = ItemClassification.progression, ), - "Puppy 51": KH1ItemData("Puppies", code = 264_2151, classification = ItemClassification.progression, ), - "Puppy 52": KH1ItemData("Puppies", code = 264_2152, classification = ItemClassification.progression, ), - "Puppy 53": KH1ItemData("Puppies", code = 264_2153, classification = ItemClassification.progression, ), - "Puppy 54": KH1ItemData("Puppies", code = 264_2154, classification = ItemClassification.progression, ), - "Puppy 55": KH1ItemData("Puppies", code = 264_2155, classification = ItemClassification.progression, ), - "Puppy 56": KH1ItemData("Puppies", code = 264_2156, classification = ItemClassification.progression, ), - "Puppy 57": KH1ItemData("Puppies", code = 264_2157, classification = ItemClassification.progression, ), - "Puppy 58": KH1ItemData("Puppies", code = 264_2158, classification = ItemClassification.progression, ), - "Puppy 59": KH1ItemData("Puppies", code = 264_2159, classification = ItemClassification.progression, ), - "Puppy 60": KH1ItemData("Puppies", code = 264_2160, classification = ItemClassification.progression, ), - "Puppy 61": KH1ItemData("Puppies", code = 264_2161, classification = ItemClassification.progression, ), - "Puppy 62": KH1ItemData("Puppies", code = 264_2162, classification = ItemClassification.progression, ), - "Puppy 63": KH1ItemData("Puppies", code = 264_2163, classification = ItemClassification.progression, ), - "Puppy 64": KH1ItemData("Puppies", code = 264_2164, classification = ItemClassification.progression, ), - "Puppy 65": KH1ItemData("Puppies", code = 264_2165, classification = ItemClassification.progression, ), - "Puppy 66": KH1ItemData("Puppies", code = 264_2166, classification = ItemClassification.progression, ), - "Puppy 67": KH1ItemData("Puppies", code = 264_2167, classification = ItemClassification.progression, ), - "Puppy 68": KH1ItemData("Puppies", code = 264_2168, classification = ItemClassification.progression, ), - "Puppy 69": KH1ItemData("Puppies", code = 264_2169, classification = ItemClassification.progression, ), - "Puppy 70": KH1ItemData("Puppies", code = 264_2170, classification = ItemClassification.progression, ), - "Puppy 71": KH1ItemData("Puppies", code = 264_2171, classification = ItemClassification.progression, ), - "Puppy 72": KH1ItemData("Puppies", code = 264_2172, classification = ItemClassification.progression, ), - "Puppy 73": KH1ItemData("Puppies", code = 264_2173, classification = ItemClassification.progression, ), - "Puppy 74": KH1ItemData("Puppies", code = 264_2174, classification = ItemClassification.progression, ), - "Puppy 75": KH1ItemData("Puppies", code = 264_2175, classification = ItemClassification.progression, ), - "Puppy 76": KH1ItemData("Puppies", code = 264_2176, classification = ItemClassification.progression, ), - "Puppy 77": KH1ItemData("Puppies", code = 264_2177, classification = ItemClassification.progression, ), - "Puppy 78": KH1ItemData("Puppies", code = 264_2178, classification = ItemClassification.progression, ), - "Puppy 79": KH1ItemData("Puppies", code = 264_2179, classification = ItemClassification.progression, ), - "Puppy 80": KH1ItemData("Puppies", code = 264_2180, classification = ItemClassification.progression, ), - "Puppy 81": KH1ItemData("Puppies", code = 264_2181, classification = ItemClassification.progression, ), - "Puppy 82": KH1ItemData("Puppies", code = 264_2182, classification = ItemClassification.progression, ), - "Puppy 83": KH1ItemData("Puppies", code = 264_2183, classification = ItemClassification.progression, ), - "Puppy 84": KH1ItemData("Puppies", code = 264_2184, classification = ItemClassification.progression, ), - "Puppy 85": KH1ItemData("Puppies", code = 264_2185, classification = ItemClassification.progression, ), - "Puppy 86": KH1ItemData("Puppies", code = 264_2186, classification = ItemClassification.progression, ), - "Puppy 87": KH1ItemData("Puppies", code = 264_2187, classification = ItemClassification.progression, ), - "Puppy 88": KH1ItemData("Puppies", code = 264_2188, classification = ItemClassification.progression, ), - "Puppy 89": KH1ItemData("Puppies", code = 264_2189, classification = ItemClassification.progression, ), - "Puppy 90": KH1ItemData("Puppies", code = 264_2190, classification = ItemClassification.progression, ), - "Puppy 91": KH1ItemData("Puppies", code = 264_2191, classification = ItemClassification.progression, ), - "Puppy 92": KH1ItemData("Puppies", code = 264_2192, classification = ItemClassification.progression, ), - "Puppy 93": KH1ItemData("Puppies", code = 264_2193, classification = ItemClassification.progression, ), - "Puppy 94": KH1ItemData("Puppies", code = 264_2194, classification = ItemClassification.progression, ), - "Puppy 95": KH1ItemData("Puppies", code = 264_2195, classification = ItemClassification.progression, ), - "Puppy 96": KH1ItemData("Puppies", code = 264_2196, classification = ItemClassification.progression, ), - "Puppy 97": KH1ItemData("Puppies", code = 264_2197, classification = ItemClassification.progression, ), - "Puppy 98": KH1ItemData("Puppies", code = 264_2198, classification = ItemClassification.progression, ), - "Puppy 99": KH1ItemData("Puppies", code = 264_2199, classification = ItemClassification.progression, ), - "Puppies 01-03": KH1ItemData("Puppies", code = 264_2201, classification = ItemClassification.progression, ), - "Puppies 04-06": KH1ItemData("Puppies", code = 264_2202, classification = ItemClassification.progression, ), - "Puppies 07-09": KH1ItemData("Puppies", code = 264_2203, classification = ItemClassification.progression, ), - "Puppies 10-12": KH1ItemData("Puppies", code = 264_2204, classification = ItemClassification.progression, ), - "Puppies 13-15": KH1ItemData("Puppies", code = 264_2205, classification = ItemClassification.progression, ), - "Puppies 16-18": KH1ItemData("Puppies", code = 264_2206, classification = ItemClassification.progression, ), - "Puppies 19-21": KH1ItemData("Puppies", code = 264_2207, classification = ItemClassification.progression, ), - "Puppies 22-24": KH1ItemData("Puppies", code = 264_2208, classification = ItemClassification.progression, ), - "Puppies 25-27": KH1ItemData("Puppies", code = 264_2209, classification = ItemClassification.progression, ), - "Puppies 28-30": KH1ItemData("Puppies", code = 264_2210, classification = ItemClassification.progression, ), - "Puppies 31-33": KH1ItemData("Puppies", code = 264_2211, classification = ItemClassification.progression, ), - "Puppies 34-36": KH1ItemData("Puppies", code = 264_2212, classification = ItemClassification.progression, ), - "Puppies 37-39": KH1ItemData("Puppies", code = 264_2213, classification = ItemClassification.progression, ), - "Puppies 40-42": KH1ItemData("Puppies", code = 264_2214, classification = ItemClassification.progression, ), - "Puppies 43-45": KH1ItemData("Puppies", code = 264_2215, classification = ItemClassification.progression, ), - "Puppies 46-48": KH1ItemData("Puppies", code = 264_2216, classification = ItemClassification.progression, ), - "Puppies 49-51": KH1ItemData("Puppies", code = 264_2217, classification = ItemClassification.progression, ), - "Puppies 52-54": KH1ItemData("Puppies", code = 264_2218, classification = ItemClassification.progression, ), - "Puppies 55-57": KH1ItemData("Puppies", code = 264_2219, classification = ItemClassification.progression, ), - "Puppies 58-60": KH1ItemData("Puppies", code = 264_2220, classification = ItemClassification.progression, ), - "Puppies 61-63": KH1ItemData("Puppies", code = 264_2221, classification = ItemClassification.progression, ), - "Puppies 64-66": KH1ItemData("Puppies", code = 264_2222, classification = ItemClassification.progression, ), - "Puppies 67-69": KH1ItemData("Puppies", code = 264_2223, classification = ItemClassification.progression, ), - "Puppies 70-72": KH1ItemData("Puppies", code = 264_2224, classification = ItemClassification.progression, ), - "Puppies 73-75": KH1ItemData("Puppies", code = 264_2225, classification = ItemClassification.progression, ), - "Puppies 76-78": KH1ItemData("Puppies", code = 264_2226, classification = ItemClassification.progression, ), - "Puppies 79-81": KH1ItemData("Puppies", code = 264_2227, classification = ItemClassification.progression, ), - "Puppies 82-84": KH1ItemData("Puppies", code = 264_2228, classification = ItemClassification.progression, ), - "Puppies 85-87": KH1ItemData("Puppies", code = 264_2229, classification = ItemClassification.progression, ), - "Puppies 88-90": KH1ItemData("Puppies", code = 264_2230, classification = ItemClassification.progression, ), - "Puppies 91-93": KH1ItemData("Puppies", code = 264_2231, classification = ItemClassification.progression, ), - "Puppies 94-96": KH1ItemData("Puppies", code = 264_2232, classification = ItemClassification.progression, ), - "Puppies 97-99": KH1ItemData("Puppies", code = 264_2233, classification = ItemClassification.progression, ), - "All Puppies": KH1ItemData("Puppies", code = 264_2240, classification = ItemClassification.progression, ), - "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2 ), - "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 4 ), - "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 2 ), - "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, max_quantity = 3 ), - #"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, ), - "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, ), - "Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.useful, ), - "Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, ), - "Strike Raid": KH1ItemData("Abilities", code = 264_3013, classification = ItemClassification.useful, ), - "Ragnarok": KH1ItemData("Abilities", code = 264_3014, classification = ItemClassification.useful, ), - "Trinity Limit": KH1ItemData("Abilities", code = 264_3015, classification = ItemClassification.useful, ), - "Cheer": KH1ItemData("Abilities", code = 264_3016, classification = ItemClassification.useful, ), - "Vortex": KH1ItemData("Abilities", code = 264_3017, classification = ItemClassification.useful, ), - "Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, ), - "Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.useful, ), - "Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, ), - "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, ), - "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.progression, ), - "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, ), - "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.progression, ), - "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.progression, ), - "Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, ), - "Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, ), - "Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, ), - #"Charge": KH1ItemData("Abilities", code = 264_3029, classification = ItemClassification.useful, ), - #"Rocket": KH1ItemData("Abilities", code = 264_3030, classification = ItemClassification.useful, ), - #"Tornado": KH1ItemData("Abilities", code = 264_3031, classification = ItemClassification.useful, ), - #"MP Gift": KH1ItemData("Abilities", code = 264_3032, classification = ItemClassification.useful, ), - #"Raging Boar": KH1ItemData("Abilities", code = 264_3033, classification = ItemClassification.useful, ), - #"Asp's Bite": KH1ItemData("Abilities", code = 264_3034, classification = ItemClassification.useful, ), - #"Healing Herb": KH1ItemData("Abilities", code = 264_3035, classification = ItemClassification.useful, ), - #"Wind Armor": KH1ItemData("Abilities", code = 264_3036, classification = ItemClassification.useful, ), - #"Crescent": KH1ItemData("Abilities", code = 264_3037, classification = ItemClassification.useful, ), - #"Sandstorm": KH1ItemData("Abilities", code = 264_3038, classification = ItemClassification.useful, ), - #"Applause!": KH1ItemData("Abilities", code = 264_3039, classification = ItemClassification.useful, ), - #"Blazing Fury": KH1ItemData("Abilities", code = 264_3040, classification = ItemClassification.useful, ), - #"Icy Terror": KH1ItemData("Abilities", code = 264_3041, classification = ItemClassification.useful, ), - #"Bolts of Sorrow": KH1ItemData("Abilities", code = 264_3042, classification = ItemClassification.useful, ), - #"Ghostly Scream": KH1ItemData("Abilities", code = 264_3043, classification = ItemClassification.useful, ), - #"Humming Bird": KH1ItemData("Abilities", code = 264_3044, classification = ItemClassification.useful, ), - #"Time-Out": KH1ItemData("Abilities", code = 264_3045, classification = ItemClassification.useful, ), - #"Storm's Eye": KH1ItemData("Abilities", code = 264_3046, classification = ItemClassification.useful, ), - #"Ferocious Lunge": KH1ItemData("Abilities", code = 264_3047, classification = ItemClassification.useful, ), - #"Furious Bellow": KH1ItemData("Abilities", code = 264_3048, classification = ItemClassification.useful, ), - #"Spiral Wave": KH1ItemData("Abilities", code = 264_3049, classification = ItemClassification.useful, ), - #"Thunder Potion": KH1ItemData("Abilities", code = 264_3050, classification = ItemClassification.useful, ), - #"Cure Potion": KH1ItemData("Abilities", code = 264_3051, classification = ItemClassification.useful, ), - #"Aero Potion": KH1ItemData("Abilities", code = 264_3052, classification = ItemClassification.useful, ), - "Slapshot": KH1ItemData("Abilities", code = 264_3053, classification = ItemClassification.useful, ), - "Sliding Dash": KH1ItemData("Abilities", code = 264_3054, classification = ItemClassification.useful, ), - "Hurricane Blast": KH1ItemData("Abilities", code = 264_3055, classification = ItemClassification.useful, ), - "Ripple Drive": KH1ItemData("Abilities", code = 264_3056, classification = ItemClassification.useful, ), - "Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, ), - "Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, ), - "Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, ), - "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, max_quantity = 4 ), - "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, ), - "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, ), - #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, ), - "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, ), - "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.progression, ), - "Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15), - "Max MP Increase": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15), - "Max AP Increase": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15), - "Strength Increase": KH1ItemData("Level Up", code = 264_4004, classification = ItemClassification.useful, max_quantity = 15), - "Defense Increase": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15), - "Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15), - "Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15), - "Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.progression, ), - "Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.progression, ), - "Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.progression, ), - "Tinker Bell": KH1ItemData("Summons", code = 264_5003, classification = ItemClassification.progression, ), - "Mushu": KH1ItemData("Summons", code = 264_5004, classification = ItemClassification.progression, ), - "Simba": KH1ItemData("Summons", code = 264_5005, classification = ItemClassification.progression, ), - "Progressive Fire": KH1ItemData("Magic", code = 264_6001, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Blizzard": KH1ItemData("Magic", code = 264_6002, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Thunder": KH1ItemData("Magic", code = 264_6003, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Cure": KH1ItemData("Magic", code = 264_6004, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Gravity": KH1ItemData("Magic", code = 264_6005, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Stop": KH1ItemData("Magic", code = 264_6006, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Aero": KH1ItemData("Magic", code = 264_6007, classification = ItemClassification.progression, max_quantity = 3 ), - #"Traverse Town": KH1ItemData("Worlds", code = 264_7001, classification = ItemClassification.progression, ), - "Wonderland": KH1ItemData("Worlds", code = 264_7002, classification = ItemClassification.progression, ), - "Olympus Coliseum": KH1ItemData("Worlds", code = 264_7003, classification = ItemClassification.progression, ), - "Deep Jungle": KH1ItemData("Worlds", code = 264_7004, classification = ItemClassification.progression, ), - "Agrabah": KH1ItemData("Worlds", code = 264_7005, classification = ItemClassification.progression, ), - "Halloween Town": KH1ItemData("Worlds", code = 264_7006, classification = ItemClassification.progression, ), - "Atlantica": KH1ItemData("Worlds", code = 264_7007, classification = ItemClassification.progression, ), - "Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, ), - "Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, ), - "End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, ), - "Monstro": KH1ItemData("Worlds", code = 264_7011, classification = ItemClassification.progression, ), - "Blue Trinity": KH1ItemData("Trinities", code = 264_8001, classification = ItemClassification.progression, ), - "Red Trinity": KH1ItemData("Trinities", code = 264_8002, classification = ItemClassification.progression, ), - "Green Trinity": KH1ItemData("Trinities", code = 264_8003, classification = ItemClassification.progression, ), - "Yellow Trinity": KH1ItemData("Trinities", code = 264_8004, classification = ItemClassification.progression, ), - "White Trinity": KH1ItemData("Trinities", code = 264_8005, classification = ItemClassification.progression, ), - "Phil Cup": KH1ItemData("Cups", code = 264_9001, classification = ItemClassification.progression, ), - "Pegasus Cup": KH1ItemData("Cups", code = 264_9002, classification = ItemClassification.progression, ), - "Hercules Cup": KH1ItemData("Cups", code = 264_9003, classification = ItemClassification.progression, ), - #"Hades Cup": KH1ItemData("Cups", code = 264_9004, classification = ItemClassification.progression, ), + "Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, type = "Item", ), + "Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, type = "Item", ), + "Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, type = "Item", ), + "Elixir": KH1ItemData("Item", code = 264_1004, classification = ItemClassification.filler, type = "Item", ), + #"B05": KH1ItemData("Item", code = 264_1005, classification = ItemClassification.filler, type = "Item", ), + "Mega-Potion": KH1ItemData("Item", code = 264_1006, classification = ItemClassification.filler, type = "Item", ), + "Mega-Ether": KH1ItemData("Item", code = 264_1007, classification = ItemClassification.filler, type = "Item", ), + "Megalixir": KH1ItemData("Item", code = 264_1008, classification = ItemClassification.filler, type = "Item", ), + "Torn Page": KH1ItemData("Torn Pages", code = 264_1009, classification = ItemClassification.progression, type = "Item", max_quantity = 5 ), + "Final Door Key": KH1ItemData("Key", code = 264_1010, classification = ItemClassification.progression, type = "Item", ), + "Destiny Islands": KH1ItemData("Worlds", code = 264_1011, classification = ItemClassification.progression, type = "Item", ), + "Raft Materials": KH1ItemData("Key", code = 264_1012, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ), + #"Frost Stone": KH1ItemData("Synthesis", code = 264_1013, classification = ItemClassification.filler, type = "Item", ), + #"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, type = "Item", ), + #"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, type = "Item", ), + #"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, type = "Item", ), + "Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.useful, type = "Item", ), + "Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.useful, type = "Item", ), + "Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.useful, type = "Item", ), + "Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.useful, type = "Item", ), + "Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.useful, type = "Item", ), + "Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.useful, type = "Item", ), + "Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.useful, type = "Item", ), + "Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.useful, type = "Item", ), + "Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.useful, type = "Item", ), + "Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.useful, type = "Item", ), + "Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.useful, type = "Item", ), + "Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.useful, type = "Item", ), + "Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.useful, type = "Item", ), + "Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.useful, type = "Item", ), + "Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.useful, type = "Item", ), + "Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.useful, type = "Item", ), + "Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.useful, type = "Item", ), + "Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.useful, type = "Item", ), + "Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.useful, type = "Item", ), + "Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.useful, type = "Item", ), + "Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.useful, type = "Item", ), + "Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.useful, type = "Item", ), + "Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.useful, type = "Item", ), + "Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.useful, type = "Item", ), + "Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.useful, type = "Item", ), + "Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.useful, type = "Item", ), + "Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.useful, type = "Item", ), + "Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.useful, type = "Item", ), + "Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.useful, type = "Item", ), + "Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.useful, type = "Item", ), + "Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.useful, type = "Item", ), + "Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.useful, type = "Item", ), + "Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.useful, type = "Item", ), + "Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.useful, type = "Item", ), + "White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.useful, type = "Item", ), + "Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.useful, type = "Item", ), + "Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.useful, type = "Item", ), + "Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.useful, type = "Item", ), + "Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.useful, type = "Item", ), + "EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.useful, type = "Item", ), + #"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.useful, type = "Item", ), + "EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.useful, type = "Item", ), + "EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.useful, type = "Item", ), + "EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.useful, type = "Item", ), + "Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.useful, type = "Item", ), + "Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.useful, type = "Item", ), + "Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.useful, type = "Item", ), + "Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.useful, type = "Item", ), + "Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.useful, type = "Item", ), + "Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.useful, type = "Item", ), + "Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.useful, type = "Item", ), + "Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.useful, type = "Item", ), + "Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.useful, type = "Item", ), + "Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.useful, type = "Item", ), + "Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.useful, type = "Item", ), + #"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, type = "Item", ), + #"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, type = "Item", ), + #"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, type = "Item", ), + #"A59": KH1ItemData("Accessory", code = 264_1075, classification = ItemClassification.filler, type = "Item", ), + #"A60": KH1ItemData("Accessory", code = 264_1076, classification = ItemClassification.filler, type = "Item", ), + #"A61": KH1ItemData("Accessory", code = 264_1077, classification = ItemClassification.filler, type = "Item", ), + #"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, type = "Item", ), + #"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, type = "Item", ), + #"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, type = "Item", ), + #"Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, type = "Item", ), + #"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, type = "Item", ), + #"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, type = "Item", ), + #"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, type = "Item", ), + #"Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, type = "Item", ), + "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.progression, type = "Item", ), + "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.progression, type = "Item", ), + "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.progression, type = "Item", ), + "Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.progression, type = "Item", ), + "Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.progression, type = "Item", ), + "Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.progression, type = "Item", ), + "Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.progression, type = "Item", ), + "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, type = "Item", ), + "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, type = "Item", ), + "Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, type = "Item", ), + "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.progression, type = "Item", ), + "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, type = "Item", ), + "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, type = "Item", ), + "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, type = "Item", ), + "Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, type = "Item", ), + "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, type = "Item", ), + "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, type = "Item", ), + #"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, type = "Item", ), + "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.useful, type = "Item", ), + "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.useful, type = "Item", ), + "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.useful, type = "Item", ), + "Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.useful, type = "Item", ), + "Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.useful, type = "Item", ), + "Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.useful, type = "Item", ), + "Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.useful, type = "Item", ), + "Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.useful, type = "Item", ), + "Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.useful, type = "Item", ), + "Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.useful, type = "Item", ), + "Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.useful, type = "Item", ), + "Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.useful, type = "Item", ), + "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.useful, type = "Item", ), + "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.useful, type = "Item", ), + #"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, type = "Item", ), + #"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, type = "Item", ), + "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.useful, type = "Item", ), + "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.useful, type = "Item", ), + "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.useful, type = "Item", ), + "Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.useful, type = "Item", ), + "Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.useful, type = "Item", ), + "Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.useful, type = "Item", ), + "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, type = "Item", ), + "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, type = "Item", ), + "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, type = "Item", ), + "Dream Shield (Goofy)": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, type = "Item", ), + "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, type = "Item", ), + "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, type = "Item", ), + "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, type = "Item", ), + "Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.useful, type = "Item", ), + #"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, type = "Item", ), + #"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, type = "Item", ), + #"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, type = "Item", ), + #"Genie": KH1ItemData("Weapons", code = 264_1137, classification = ItemClassification.filler, type = "Item", ), + #"No Weapon": KH1ItemData("Weapons", code = 264_1138, classification = ItemClassification.filler, type = "Item", ), + #"No Weapon": KH1ItemData("Weapons", code = 264_1139, classification = ItemClassification.filler, type = "Item", ), + #"Dagger": KH1ItemData("Weapons", code = 264_1140, classification = ItemClassification.filler, type = "Item", ), + #"Claws": KH1ItemData("Weapons", code = 264_1141, classification = ItemClassification.filler, type = "Item", ), + "Tent": KH1ItemData("Camping", code = 264_1142, classification = ItemClassification.filler, type = "Item", ), + "Camping Set": KH1ItemData("Camping", code = 264_1143, classification = ItemClassification.filler, type = "Item", ), + "Cottage": KH1ItemData("Camping", code = 264_1144, classification = ItemClassification.filler, type = "Item", ), + #"C04": KH1ItemData("Camping", code = 264_1145, classification = ItemClassification.filler, type = "Item", ), + #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, type = "Item", ), + #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, type = "Item", ), + #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, type = "Item", ), + "Wonderland": KH1ItemData("Worlds", code = 264_1149, classification = ItemClassification.progression, type = "Item", ), + "Olympus Coliseum": KH1ItemData("Worlds", code = 264_1150, classification = ItemClassification.progression, type = "Item", ), + "Deep Jungle": KH1ItemData("Worlds", code = 264_1151, classification = ItemClassification.progression, type = "Item", ), + "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, type = "Item", ), + "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, type = "Item", ), + "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, type = "Item", ), + "Agrabah": KH1ItemData("Worlds", code = 264_1155, classification = ItemClassification.progression, type = "Item", ), + "Monstro": KH1ItemData("Worlds", code = 264_1156, classification = ItemClassification.progression, type = "Item", ), + "Atlantica": KH1ItemData("Worlds", code = 264_1157, classification = ItemClassification.progression, type = "Item", ), + "Fire Arts": KH1ItemData("Key", code = 264_1158, classification = ItemClassification.progression, type = "Item", ), + "Blizzard Arts": KH1ItemData("Key", code = 264_1159, classification = ItemClassification.progression, type = "Item", ), + "Thunder Arts": KH1ItemData("Key", code = 264_1160, classification = ItemClassification.progression, type = "Item", ), + "Cure Arts": KH1ItemData("Key", code = 264_1161, classification = ItemClassification.progression, type = "Item", ), + "Gravity Arts": KH1ItemData("Key", code = 264_1162, classification = ItemClassification.progression, type = "Item", ), + "Stop Arts": KH1ItemData("Key", code = 264_1163, classification = ItemClassification.progression, type = "Item", ), + "Aero Arts": KH1ItemData("Key", code = 264_1164, classification = ItemClassification.progression, type = "Item", ), + "Neverland": KH1ItemData("Worlds", code = 264_1165, classification = ItemClassification.progression, type = "Item", ), + "Halloween Town": KH1ItemData("Worlds", code = 264_1166, classification = ItemClassification.progression, type = "Item", ), + "Puppy": KH1ItemData("Key", code = 264_1167, classification = ItemClassification.progression, type = "Item", ), + "Hollow Bastion": KH1ItemData("Worlds", code = 264_1168, classification = ItemClassification.progression, type = "Item", ), + "End of the World": KH1ItemData("Worlds", code = 264_1169, classification = ItemClassification.progression, type = "Item", ), + "Blue Trinity": KH1ItemData("Trinities", code = 264_1170, classification = ItemClassification.progression, type = "Item", ), + "Red Trinity": KH1ItemData("Trinities", code = 264_1171, classification = ItemClassification.progression, type = "Item", ), + "Green Trinity": KH1ItemData("Trinities", code = 264_1172, classification = ItemClassification.progression, type = "Item", ), + "Yellow Trinity": KH1ItemData("Trinities", code = 264_1173, classification = ItemClassification.progression, type = "Item", ), + "White Trinity": KH1ItemData("Trinities", code = 264_1174, classification = ItemClassification.progression, type = "Item", ), + "Progressive Fire": KH1ItemData("Magic", code = 264_1175, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Blizzard": KH1ItemData("Magic", code = 264_1176, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Thunder": KH1ItemData("Magic", code = 264_1177, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Cure": KH1ItemData("Magic", code = 264_1178, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Gravity": KH1ItemData("Magic", code = 264_1179, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Stop": KH1ItemData("Magic", code = 264_1180, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Aero": KH1ItemData("Magic", code = 264_1181, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Phil Cup": KH1ItemData("Cups", code = 264_1182, classification = ItemClassification.progression, type = "Item", ), + "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, type = "Item", ), + "Pegasus Cup": KH1ItemData("Cups", code = 264_1184, classification = ItemClassification.progression, type = "Item", ), + "Hercules Cup": KH1ItemData("Cups", code = 264_1185, classification = ItemClassification.progression, type = "Item", ), + #"Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, type = "Item", max_quantity = 6 ), + #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, type = "Item", ), + #"Log": KH1ItemData("DI", code = 264_1192, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ), + #"Cloth": KH1ItemData("DI", code = 264_1193, classification = ItemClassification.progression, type = "Item", ), + #"Rope": KH1ItemData("DI", code = 264_1194, classification = ItemClassification.progression, type = "Item", ), + #"Seagull Egg": KH1ItemData("DI", code = 264_1195, classification = ItemClassification.progression, type = "Item", ), + #"Fish": KH1ItemData("DI", code = 264_1196, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + #"Mushroom": KH1ItemData("DI", code = 264_1197, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + #"Coconut": KH1ItemData("DI", code = 264_1198, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ), + #"Drinking Water": KH1ItemData("DI", code = 264_1199, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 1": KH1ItemData("Key", code = 264_1200, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 2": KH1ItemData("Key", code = 264_1201, classification = ItemClassification.progression, type = "Item", ), + #"Navi-Gummi Unused": KH1ItemData("Key", code = 264_1202, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, type = "Item", ), + #"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, type = "Item", ), + #"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, type = "Item", ), + #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, type = "Item", ), + #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, type = "Item", ), + #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, type = "Item", ), + "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, type = "Item", ), + "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, type = "Item", max_quantity = 10), + #"Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 4": KH1ItemData("Torn Pages", code = 264_1215, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 5": KH1ItemData("Torn Pages", code = 264_1216, classification = ItemClassification.progression, type = "Item", ), + "Slides": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, type = "Item", ), + #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, type = "Item", ), + #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, type = "Item", ), + #"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, type = "Item", ), + #"Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, type = "Item", ), + #"Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, type = "Item", ), + "Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, type = "Item", ), + #"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, type = "Item", ), + #"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, type = "Item", ), + #"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, type = "Item", ), + "Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, type = "Item", ), + "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, type = "Item", ), + "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, type = "Item", ), + #"AP Item": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, type = "Item", ), + "Dumbo": KH1ItemData("Summons", code = 264_1231, classification = ItemClassification.progression, type = "Item", ), + #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, type = "Item", ), + "Bambi": KH1ItemData("Summons", code = 264_1233, classification = ItemClassification.progression, type = "Item", ), + "Genie": KH1ItemData("Summons", code = 264_1234, classification = ItemClassification.progression, type = "Item", ), + "Tinker Bell": KH1ItemData("Summons", code = 264_1235, classification = ItemClassification.progression, type = "Item", ), + "Mushu": KH1ItemData("Summons", code = 264_1236, classification = ItemClassification.progression, type = "Item", ), + "Simba": KH1ItemData("Summons", code = 264_1237, classification = ItemClassification.progression, type = "Item", ), + "Lucky Emblem": KH1ItemData("Key", code = 264_1238, classification = ItemClassification.progression, type = "Item", ), + "Max HP Increase": KH1ItemData("Level Up", code = 264_1239, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Max MP Increase": KH1ItemData("Level Up", code = 264_1240, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Max AP Increase": KH1ItemData("Level Up", code = 264_1241, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Strength Increase": KH1ItemData("Level Up", code = 264_1242, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Defense Increase": KH1ItemData("Level Up", code = 264_1243, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_1244, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_1245, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + #"Thunder Gem": KH1ItemData("Synthesis", code = 264_1246, classification = ItemClassification.filler, type = "Item", ), + #"Shiny Crystal": KH1ItemData("Synthesis", code = 264_1247, classification = ItemClassification.filler, type = "Item", ), + #"Bright Shard": KH1ItemData("Synthesis", code = 264_1248, classification = ItemClassification.filler, type = "Item", ), + #"Bright Gem": KH1ItemData("Synthesis", code = 264_1249, classification = ItemClassification.filler, type = "Item", ), + #"Bright Crystal": KH1ItemData("Synthesis", code = 264_1250, classification = ItemClassification.filler, type = "Item", ), + #"Mystery Goo": KH1ItemData("Synthesis", code = 264_1251, classification = ItemClassification.filler, type = "Item", ), + #"Gale": KH1ItemData("Synthesis", code = 264_1252, classification = ItemClassification.filler, type = "Item", ), + #"Mythril Shard": KH1ItemData("Synthesis", code = 264_1253, classification = ItemClassification.filler, type = "Item", ), + "Mythril": KH1ItemData("Key", code = 264_1254, classification = ItemClassification.progression, type = "Item", max_quantity = 16), + "Orichalcum": KH1ItemData("Key", code = 264_1255, classification = ItemClassification.progression, type = "Item", max_quantity = 17), + "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, type = "Shared Ability", ), + "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, type = "Shared Ability", ), + "Progressive Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, type = "Shared Ability", max_quantity = 2 ), + #"Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, type = "Ability", ), + "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, type = "Ability", max_quantity = 2 ), + "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, type = "Ability", max_quantity = 4 ), + "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.progression, type = "Ability", max_quantity = 2 ), + "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, type = "Ability", max_quantity = 3 ), + #"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, type = "Ability", ), + "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, type = "Ability", ), + "Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.progression, type = "Ability", ), + "Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, type = "Ability", ), + "Strike Raid": KH1ItemData("Abilities", code = 264_3013, classification = ItemClassification.progression, type = "Ability", ), + "Ragnarok": KH1ItemData("Abilities", code = 264_3014, classification = ItemClassification.useful, type = "Ability", ), + "Trinity Limit": KH1ItemData("Abilities", code = 264_3015, classification = ItemClassification.useful, type = "Ability", ), + "Cheer": KH1ItemData("Abilities", code = 264_3016, classification = ItemClassification.useful, type = "Ability", ), + "Vortex": KH1ItemData("Abilities", code = 264_3017, classification = ItemClassification.useful, type = "Ability", ), + "Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, type = "Ability", ), + "Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.progression, type = "Ability", ), + "Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, type = "Ability", ), + "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, type = "Ability", ), + "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.progression, type = "Ability", ), + "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, type = "Ability", ), + "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.progression, type = "Ability", ), + "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.progression, type = "Ability", ), + "Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, type = "Ability", ), + "Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, type = "Ability", ), + "Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, type = "Ability", ), + #"Charge": KH1ItemData("Abilities", code = 264_3029, classification = ItemClassification.useful, type = "Ability", ), + #"Rocket": KH1ItemData("Abilities", code = 264_3030, classification = ItemClassification.useful, type = "Ability", ), + #"Tornado": KH1ItemData("Abilities", code = 264_3031, classification = ItemClassification.useful, type = "Ability", ), + #"MP Gift": KH1ItemData("Abilities", code = 264_3032, classification = ItemClassification.useful, type = "Ability", ), + #"Raging Boar": KH1ItemData("Abilities", code = 264_3033, classification = ItemClassification.useful, type = "Ability", ), + #"Asp's Bite": KH1ItemData("Abilities", code = 264_3034, classification = ItemClassification.useful, type = "Ability", ), + #"Healing Herb": KH1ItemData("Abilities", code = 264_3035, classification = ItemClassification.useful, type = "Ability", ), + #"Wind Armor": KH1ItemData("Abilities", code = 264_3036, classification = ItemClassification.useful, type = "Ability", ), + #"Crescent": KH1ItemData("Abilities", code = 264_3037, classification = ItemClassification.useful, type = "Ability", ), + #"Sandstorm": KH1ItemData("Abilities", code = 264_3038, classification = ItemClassification.useful, type = "Ability", ), + #"Applause!": KH1ItemData("Abilities", code = 264_3039, classification = ItemClassification.useful, type = "Ability", ), + #"Blazing Fury": KH1ItemData("Abilities", code = 264_3040, classification = ItemClassification.useful, type = "Ability", ), + #"Icy Terror": KH1ItemData("Abilities", code = 264_3041, classification = ItemClassification.useful, type = "Ability", ), + #"Bolts of Sorrow": KH1ItemData("Abilities", code = 264_3042, classification = ItemClassification.useful, type = "Ability", ), + #"Ghostly Scream": KH1ItemData("Abilities", code = 264_3043, classification = ItemClassification.useful, type = "Ability", ), + #"Humming Bird": KH1ItemData("Abilities", code = 264_3044, classification = ItemClassification.useful, type = "Ability", ), + #"Time-Out": KH1ItemData("Abilities", code = 264_3045, classification = ItemClassification.useful, type = "Ability", ), + #"Storm's Eye": KH1ItemData("Abilities", code = 264_3046, classification = ItemClassification.useful, type = "Ability", ), + #"Ferocious Lunge": KH1ItemData("Abilities", code = 264_3047, classification = ItemClassification.useful, type = "Ability", ), + #"Furious Bellow": KH1ItemData("Abilities", code = 264_3048, classification = ItemClassification.useful, type = "Ability", ), + #"Spiral Wave": KH1ItemData("Abilities", code = 264_3049, classification = ItemClassification.useful, type = "Ability", ), + #"Thunder Potion": KH1ItemData("Abilities", code = 264_3050, classification = ItemClassification.useful, type = "Ability", ), + #"Cure Potion": KH1ItemData("Abilities", code = 264_3051, classification = ItemClassification.useful, type = "Ability", ), + #"Aero Potion": KH1ItemData("Abilities", code = 264_3052, classification = ItemClassification.useful, type = "Ability", ), + "Slapshot": KH1ItemData("Abilities", code = 264_3053, classification = ItemClassification.useful, type = "Ability", ), + "Sliding Dash": KH1ItemData("Abilities", code = 264_3054, classification = ItemClassification.useful, type = "Ability", ), + "Hurricane Blast": KH1ItemData("Abilities", code = 264_3055, classification = ItemClassification.useful, type = "Ability", ), + "Ripple Drive": KH1ItemData("Abilities", code = 264_3056, classification = ItemClassification.useful, type = "Ability", ), + "Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, type = "Ability", ), + "Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, type = "Ability", ), + "Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, type = "Ability", ), + "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, type = "Ability", max_quantity = 4 ), + "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, type = "Ability", ), + "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, type = "Ability", ), + #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, type = "Ability", ), + "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, type = "Ability", ), + "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.progression, type = "Ability", ) } -event_item_table: Dict[str, KH1ItemData] = {} +event_item_table: Dict[str, KH1ItemData] = { + "Victory": KH1ItemData("Event", code = None, classification = ItemClassification.progression, type = "Event") +} #Make item categories item_name_groups: Dict[str, Set[str]] = {} diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index a82be70f..582d69a8 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -11,572 +11,758 @@ class KH1Location(Location): class KH1LocationData(NamedTuple): category: str - code: int + code: Optional[int] = None + type: Optional[str] = None + behind_boss: Optional[bool] = False - -def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: - location_dict: Dict[str, KH1LocationData] = {} - for name, data in location_table.items(): - if data.category == category: - location_dict.setdefault(name, data) - - return location_dict +def get_locations_by_type(type: str) -> Dict[str, KH1LocationData]: + return {name: data for name, data in location_table.items() if data.type == type} location_table: Dict[str, KH1LocationData] = { - #"Destiny Islands Chest": KH1LocationData("Destiny Islands", 265_0011), missable - "Traverse Town 1st District Candle Puzzle Chest": KH1LocationData("Traverse Town", 265_0211), - "Traverse Town 1st District Accessory Shop Roof Chest": KH1LocationData("Traverse Town", 265_0212), - "Traverse Town 2nd District Boots and Shoes Awning Chest": KH1LocationData("Traverse Town", 265_0213), - "Traverse Town 2nd District Rooftop Chest": KH1LocationData("Traverse Town", 265_0214), - "Traverse Town 2nd District Gizmo Shop Facade Chest": KH1LocationData("Traverse Town", 265_0251), - "Traverse Town Alleyway Balcony Chest": KH1LocationData("Traverse Town", 265_0252), - "Traverse Town Alleyway Blue Room Awning Chest": KH1LocationData("Traverse Town", 265_0253), - "Traverse Town Alleyway Corner Chest": KH1LocationData("Traverse Town", 265_0254), - "Traverse Town Green Room Clock Puzzle Chest": KH1LocationData("Traverse Town", 265_0292), - "Traverse Town Green Room Table Chest": KH1LocationData("Traverse Town", 265_0293), - "Traverse Town Red Room Chest": KH1LocationData("Traverse Town", 265_0294), - "Traverse Town Mystical House Yellow Trinity Chest": KH1LocationData("Traverse Town", 265_0331), - "Traverse Town Accessory Shop Chest": KH1LocationData("Traverse Town", 265_0332), - "Traverse Town Secret Waterway White Trinity Chest": KH1LocationData("Traverse Town", 265_0333), - "Traverse Town Geppetto's House Chest": KH1LocationData("Traverse Town", 265_0334), - "Traverse Town Item Workshop Right Chest": KH1LocationData("Traverse Town", 265_0371), - "Traverse Town 1st District Blue Trinity Balcony Chest": KH1LocationData("Traverse Town", 265_0411), - "Traverse Town Mystical House Glide Chest": KH1LocationData("Traverse Town", 265_0891), - "Traverse Town Alleyway Behind Crates Chest": KH1LocationData("Traverse Town", 265_0892), - "Traverse Town Item Workshop Left Chest": KH1LocationData("Traverse Town", 265_0893), - "Traverse Town Secret Waterway Near Stairs Chest": KH1LocationData("Traverse Town", 265_0894), - "Wonderland Rabbit Hole Green Trinity Chest": KH1LocationData("Wonderland", 265_0931), - "Wonderland Rabbit Hole Defeat Heartless 1 Chest": KH1LocationData("Wonderland", 265_0932), - "Wonderland Rabbit Hole Defeat Heartless 2 Chest": KH1LocationData("Wonderland", 265_0933), - "Wonderland Rabbit Hole Defeat Heartless 3 Chest": KH1LocationData("Wonderland", 265_0934), - "Wonderland Bizarre Room Green Trinity Chest": KH1LocationData("Wonderland", 265_0971), - "Wonderland Queen's Castle Hedge Left Red Chest": KH1LocationData("Wonderland", 265_1011), - "Wonderland Queen's Castle Hedge Right Blue Chest": KH1LocationData("Wonderland", 265_1012), - "Wonderland Queen's Castle Hedge Right Red Chest": KH1LocationData("Wonderland", 265_1013), - "Wonderland Lotus Forest Thunder Plant Chest": KH1LocationData("Wonderland", 265_1014), - "Wonderland Lotus Forest Through the Painting Thunder Plant Chest": KH1LocationData("Wonderland", 265_1051), - "Wonderland Lotus Forest Glide Chest": KH1LocationData("Wonderland", 265_1052), - "Wonderland Lotus Forest Nut Chest": KH1LocationData("Wonderland", 265_1053), - "Wonderland Lotus Forest Corner Chest": KH1LocationData("Wonderland", 265_1054), - "Wonderland Bizarre Room Lamp Chest": KH1LocationData("Wonderland", 265_1091), - "Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest": KH1LocationData("Wonderland", 265_1093), - "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest": KH1LocationData("Wonderland", 265_1094), - "Wonderland Tea Party Garden Bear and Clock Puzzle Chest": KH1LocationData("Wonderland", 265_1131), - "Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest": KH1LocationData("Wonderland", 265_1132), - "Wonderland Lotus Forest Through the Painting White Trinity Chest": KH1LocationData("Wonderland", 265_1133), - "Deep Jungle Tree House Beneath Tree House Chest": KH1LocationData("Deep Jungle", 265_1213), - "Deep Jungle Tree House Rooftop Chest": KH1LocationData("Deep Jungle", 265_1214), - "Deep Jungle Hippo's Lagoon Center Chest": KH1LocationData("Deep Jungle", 265_1251), - "Deep Jungle Hippo's Lagoon Left Chest": KH1LocationData("Deep Jungle", 265_1252), - "Deep Jungle Hippo's Lagoon Right Chest": KH1LocationData("Deep Jungle", 265_1253), - "Deep Jungle Vines Chest": KH1LocationData("Deep Jungle", 265_1291), - "Deep Jungle Vines 2 Chest": KH1LocationData("Deep Jungle", 265_1292), - "Deep Jungle Climbing Trees Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1293), - "Deep Jungle Tunnel Chest": KH1LocationData("Deep Jungle", 265_1331), - "Deep Jungle Cavern of Hearts White Trinity Chest": KH1LocationData("Deep Jungle", 265_1332), - "Deep Jungle Camp Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1333), - "Deep Jungle Tent Chest": KH1LocationData("Deep Jungle", 265_1334), - "Deep Jungle Waterfall Cavern Low Chest": KH1LocationData("Deep Jungle", 265_1371), - "Deep Jungle Waterfall Cavern Middle Chest": KH1LocationData("Deep Jungle", 265_1372), - "Deep Jungle Waterfall Cavern High Wall Chest": KH1LocationData("Deep Jungle", 265_1373), - "Deep Jungle Waterfall Cavern High Middle Chest": KH1LocationData("Deep Jungle", 265_1374), - "Deep Jungle Cliff Right Cliff Left Chest": KH1LocationData("Deep Jungle", 265_1411), - "Deep Jungle Cliff Right Cliff Right Chest": KH1LocationData("Deep Jungle", 265_1412), - "Deep Jungle Tree House Suspended Boat Chest": KH1LocationData("Deep Jungle", 265_1413), - "100 Acre Wood Meadow Inside Log Chest": KH1LocationData("100 Acre Wood", 265_1654), - "100 Acre Wood Bouncing Spot Left Cliff Chest": KH1LocationData("100 Acre Wood", 265_1691), - "100 Acre Wood Bouncing Spot Right Tree Alcove Chest": KH1LocationData("100 Acre Wood", 265_1692), - "100 Acre Wood Bouncing Spot Under Giant Pot Chest": KH1LocationData("100 Acre Wood", 265_1693), - "Agrabah Plaza By Storage Chest": KH1LocationData("Agrabah", 265_1972), - "Agrabah Plaza Raised Terrace Chest": KH1LocationData("Agrabah", 265_1973), - "Agrabah Plaza Top Corner Chest": KH1LocationData("Agrabah", 265_1974), - "Agrabah Alley Chest": KH1LocationData("Agrabah", 265_2011), - "Agrabah Bazaar Across Windows Chest": KH1LocationData("Agrabah", 265_2012), - "Agrabah Bazaar High Corner Chest": KH1LocationData("Agrabah", 265_2013), - "Agrabah Main Street Right Palace Entrance Chest": KH1LocationData("Agrabah", 265_2014), - "Agrabah Main Street High Above Alley Entrance Chest": KH1LocationData("Agrabah", 265_2051), - "Agrabah Main Street High Above Palace Gates Entrance Chest": KH1LocationData("Agrabah", 265_2052), - "Agrabah Palace Gates Low Chest": KH1LocationData("Agrabah", 265_2053), - "Agrabah Palace Gates High Opposite Palace Chest": KH1LocationData("Agrabah", 265_2054), - "Agrabah Palace Gates High Close to Palace Chest": KH1LocationData("Agrabah", 265_2091), - "Agrabah Storage Green Trinity Chest": KH1LocationData("Agrabah", 265_2092), - "Agrabah Storage Behind Barrel Chest": KH1LocationData("Agrabah", 265_2093), - "Agrabah Cave of Wonders Entrance Left Chest": KH1LocationData("Agrabah", 265_2094), - "Agrabah Cave of Wonders Entrance Tall Tower Chest": KH1LocationData("Agrabah", 265_2131), - "Agrabah Cave of Wonders Hall High Left Chest": KH1LocationData("Agrabah", 265_2132), - "Agrabah Cave of Wonders Hall Near Bottomless Hall Chest": KH1LocationData("Agrabah", 265_2133), - "Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest": KH1LocationData("Agrabah", 265_2134), - "Agrabah Cave of Wonders Bottomless Hall Pillar Chest": KH1LocationData("Agrabah", 265_2171), - "Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest": KH1LocationData("Agrabah", 265_2172), - "Agrabah Cave of Wonders Treasure Room Across Platforms Chest": KH1LocationData("Agrabah", 265_2173), - "Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest": KH1LocationData("Agrabah", 265_2174), - "Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest": KH1LocationData("Agrabah", 265_2211), - "Agrabah Cave of Wonders Treasure Room Above Fire Chest": KH1LocationData("Agrabah", 265_2212), - "Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest": KH1LocationData("Agrabah", 265_2213), - "Agrabah Cave of Wonders Relic Chamber Stairs Chest": KH1LocationData("Agrabah", 265_2214), - "Agrabah Cave of Wonders Dark Chamber Abu Gem Chest": KH1LocationData("Agrabah", 265_2251), - "Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest": KH1LocationData("Agrabah", 265_2252), - "Agrabah Cave of Wonders Dark Chamber Bridge Chest": KH1LocationData("Agrabah", 265_2253), - "Agrabah Cave of Wonders Dark Chamber Near Save Chest": KH1LocationData("Agrabah", 265_2254), - "Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest": KH1LocationData("Agrabah", 265_2291), - "Agrabah Cave of Wonders Hidden Room Right Chest": KH1LocationData("Agrabah", 265_2292), - "Agrabah Cave of Wonders Hidden Room Left Chest": KH1LocationData("Agrabah", 265_2293), - "Agrabah Aladdin's House Main Street Entrance Chest": KH1LocationData("Agrabah", 265_2294), - "Agrabah Aladdin's House Plaza Entrance Chest": KH1LocationData("Agrabah", 265_2331), - "Agrabah Cave of Wonders Entrance White Trinity Chest": KH1LocationData("Agrabah", 265_2332), - "Monstro Chamber 6 Other Platform Chest": KH1LocationData("Monstro", 265_2413), - "Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest": KH1LocationData("Monstro", 265_2414), - "Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest": KH1LocationData("Monstro", 265_2451), - "Monstro Chamber 6 Low Chest": KH1LocationData("Monstro", 265_2452), - "Atlantica Sunken Ship In Flipped Boat Chest": KH1LocationData("Atlantica", 265_2531), - "Atlantica Sunken Ship Seabed Chest": KH1LocationData("Atlantica", 265_2532), - "Atlantica Sunken Ship Inside Ship Chest": KH1LocationData("Atlantica", 265_2533), - "Atlantica Ariel's Grotto High Chest": KH1LocationData("Atlantica", 265_2534), - "Atlantica Ariel's Grotto Middle Chest": KH1LocationData("Atlantica", 265_2571), - "Atlantica Ariel's Grotto Low Chest": KH1LocationData("Atlantica", 265_2572), - "Atlantica Ursula's Lair Use Fire on Urchin Chest": KH1LocationData("Atlantica", 265_2573), - "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest": KH1LocationData("Atlantica", 265_2574), - "Atlantica Triton's Palace White Trinity Chest": KH1LocationData("Atlantica", 265_2611), - "Halloween Town Moonlight Hill White Trinity Chest": KH1LocationData("Halloween Town", 265_3014), - "Halloween Town Bridge Under Bridge": KH1LocationData("Halloween Town", 265_3051), - "Halloween Town Boneyard Tombstone Puzzle Chest": KH1LocationData("Halloween Town", 265_3052), - "Halloween Town Bridge Right of Gate Chest": KH1LocationData("Halloween Town", 265_3053), - "Halloween Town Cemetery Behind Grave Chest": KH1LocationData("Halloween Town", 265_3054), - "Halloween Town Cemetery By Cat Shape Chest": KH1LocationData("Halloween Town", 265_3091), - "Halloween Town Cemetery Between Graves Chest": KH1LocationData("Halloween Town", 265_3092), - "Halloween Town Oogie's Manor Lower Iron Cage Chest": KH1LocationData("Halloween Town", 265_3093), - "Halloween Town Oogie's Manor Upper Iron Cage Chest": KH1LocationData("Halloween Town", 265_3094), - "Halloween Town Oogie's Manor Hollow Chest": KH1LocationData("Halloween Town", 265_3131), - "Halloween Town Oogie's Manor Grounds Red Trinity Chest": KH1LocationData("Halloween Town", 265_3132), - "Halloween Town Guillotine Square High Tower Chest": KH1LocationData("Halloween Town", 265_3133), - "Halloween Town Guillotine Square Pumpkin Structure Left Chest": KH1LocationData("Halloween Town", 265_3134), - "Halloween Town Oogie's Manor Entrance Steps Chest": KH1LocationData("Halloween Town", 265_3171), - "Halloween Town Oogie's Manor Inside Entrance Chest": KH1LocationData("Halloween Town", 265_3172), - "Halloween Town Bridge Left of Gate Chest": KH1LocationData("Halloween Town", 265_3291), - "Halloween Town Cemetery By Striped Grave Chest": KH1LocationData("Halloween Town", 265_3292), - "Halloween Town Guillotine Square Under Jack's House Stairs Chest": KH1LocationData("Halloween Town", 265_3293), - "Halloween Town Guillotine Square Pumpkin Structure Right Chest": KH1LocationData("Halloween Town", 265_3294), - "Olympus Coliseum Coliseum Gates Left Behind Columns Chest": KH1LocationData("Olympus Coliseum", 265_3332), - "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3333), - "Olympus Coliseum Coliseum Gates Left Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3334), - "Olympus Coliseum Coliseum Gates White Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3371), - "Olympus Coliseum Coliseum Gates Blizzara Chest": KH1LocationData("Olympus Coliseum", 265_3372), - "Olympus Coliseum Coliseum Gates Blizzaga Chest": KH1LocationData("Olympus Coliseum", 265_3373), - "Monstro Mouth Boat Deck Chest": KH1LocationData("Monstro", 265_3454), - "Monstro Mouth High Platform Boat Side Chest": KH1LocationData("Monstro", 265_3491), - "Monstro Mouth High Platform Across from Boat Chest": KH1LocationData("Monstro", 265_3492), - "Monstro Mouth Near Ship Chest": KH1LocationData("Monstro", 265_3493), - "Monstro Mouth Green Trinity Top of Boat Chest": KH1LocationData("Monstro", 265_3494), - "Monstro Chamber 2 Ground Chest": KH1LocationData("Monstro", 265_3534), - "Monstro Chamber 2 Platform Chest": KH1LocationData("Monstro", 265_3571), - "Monstro Chamber 5 Platform Chest": KH1LocationData("Monstro", 265_3613), - "Monstro Chamber 3 Ground Chest": KH1LocationData("Monstro", 265_3614), - "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest": KH1LocationData("Monstro", 265_3651), - "Monstro Chamber 3 Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3652), - "Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3653), - "Monstro Mouth High Platform Near Teeth Chest": KH1LocationData("Monstro", 265_3732), - "Monstro Chamber 5 Atop Barrel Chest": KH1LocationData("Monstro", 265_3733), - "Monstro Chamber 5 Low 2nd Chest": KH1LocationData("Monstro", 265_3734), - "Monstro Chamber 5 Low 1st Chest": KH1LocationData("Monstro", 265_3771), - "Neverland Pirate Ship Deck White Trinity Chest": KH1LocationData("Neverland", 265_3772), - "Neverland Pirate Ship Crows Nest Chest": KH1LocationData("Neverland", 265_3773), - "Neverland Hold Yellow Trinity Right Blue Chest": KH1LocationData("Neverland", 265_3774), - "Neverland Hold Yellow Trinity Left Blue Chest": KH1LocationData("Neverland", 265_3811), - "Neverland Galley Chest": KH1LocationData("Neverland", 265_3812), - "Neverland Cabin Chest": KH1LocationData("Neverland", 265_3813), - "Neverland Hold Flight 1st Chest": KH1LocationData("Neverland", 265_3814), - "Neverland Clock Tower Chest": KH1LocationData("Neverland", 265_4014), - "Neverland Hold Flight 2nd Chest": KH1LocationData("Neverland", 265_4051), - "Neverland Hold Yellow Trinity Green Chest": KH1LocationData("Neverland", 265_4052), - "Neverland Captain's Cabin Chest": KH1LocationData("Neverland", 265_4053), - "Hollow Bastion Rising Falls Water's Surface Chest": KH1LocationData("Hollow Bastion", 265_4054), - "Hollow Bastion Rising Falls Under Water 1st Chest": KH1LocationData("Hollow Bastion", 265_4091), - "Hollow Bastion Rising Falls Under Water 2nd Chest": KH1LocationData("Hollow Bastion", 265_4092), - "Hollow Bastion Rising Falls Floating Platform Near Save Chest": KH1LocationData("Hollow Bastion", 265_4093), - "Hollow Bastion Rising Falls Floating Platform Near Bubble Chest": KH1LocationData("Hollow Bastion", 265_4094), - "Hollow Bastion Rising Falls High Platform Chest": KH1LocationData("Hollow Bastion", 265_4131), - "Hollow Bastion Castle Gates Gravity Chest": KH1LocationData("Hollow Bastion", 265_4132), - "Hollow Bastion Castle Gates Freestanding Pillar Chest": KH1LocationData("Hollow Bastion", 265_4133), - "Hollow Bastion Castle Gates High Pillar Chest": KH1LocationData("Hollow Bastion", 265_4134), - "Hollow Bastion Great Crest Lower Chest": KH1LocationData("Hollow Bastion", 265_4171), - "Hollow Bastion Great Crest After Battle Platform Chest": KH1LocationData("Hollow Bastion", 265_4172), - "Hollow Bastion High Tower 2nd Gravity Chest": KH1LocationData("Hollow Bastion", 265_4173), - "Hollow Bastion High Tower 1st Gravity Chest": KH1LocationData("Hollow Bastion", 265_4174), - "Hollow Bastion High Tower Above Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4211), - "Hollow Bastion Library Top of Bookshelf Chest": KH1LocationData("Hollow Bastion", 265_4213), - "Hollow Bastion Library 1st Floor Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4214), - "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4251), - "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest": KH1LocationData("Hollow Bastion", 265_4252), - "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest": KH1LocationData("Hollow Bastion", 265_4253), - "Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest": KH1LocationData("Hollow Bastion", 265_4254), - "Hollow Bastion Lift Stop Library Node Gravity Chest": KH1LocationData("Hollow Bastion", 265_4291), - "Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4292), - "Hollow Bastion Lift Stop Outside Library Gravity Chest": KH1LocationData("Hollow Bastion", 265_4293), - "Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest": KH1LocationData("Hollow Bastion", 265_4294), - "Hollow Bastion Base Level Bubble Under the Wall Platform Chest": KH1LocationData("Hollow Bastion", 265_4331), - "Hollow Bastion Base Level Platform Near Entrance Chest": KH1LocationData("Hollow Bastion", 265_4332), - "Hollow Bastion Base Level Near Crystal Switch Chest": KH1LocationData("Hollow Bastion", 265_4333), - "Hollow Bastion Waterway Near Save Chest": KH1LocationData("Hollow Bastion", 265_4334), - "Hollow Bastion Waterway Blizzard on Bubble Chest": KH1LocationData("Hollow Bastion", 265_4371), - "Hollow Bastion Waterway Unlock Passage from Base Level Chest": KH1LocationData("Hollow Bastion", 265_4372), - "Hollow Bastion Dungeon By Candles Chest": KH1LocationData("Hollow Bastion", 265_4373), - "Hollow Bastion Dungeon Corner Chest": KH1LocationData("Hollow Bastion", 265_4374), - "Hollow Bastion Grand Hall Steps Right Side Chest": KH1LocationData("Hollow Bastion", 265_4454), - "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Hollow Bastion", 265_4491), - "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Hollow Bastion", 265_4492), - #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Hollow Bastion", 265_4493), --handled later - "Hollow Bastion Entrance Hall Left of Emblem Door Chest": KH1LocationData("Hollow Bastion", 265_4212), - "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Hollow Bastion", 265_4494), - "End of the World Final Dimension 1st Chest": KH1LocationData("End of the World", 265_4531), - "End of the World Final Dimension 2nd Chest": KH1LocationData("End of the World", 265_4532), - "End of the World Final Dimension 3rd Chest": KH1LocationData("End of the World", 265_4533), - "End of the World Final Dimension 4th Chest": KH1LocationData("End of the World", 265_4534), - "End of the World Final Dimension 5th Chest": KH1LocationData("End of the World", 265_4571), - "End of the World Final Dimension 6th Chest": KH1LocationData("End of the World", 265_4572), - "End of the World Final Dimension 10th Chest": KH1LocationData("End of the World", 265_4573), - "End of the World Final Dimension 9th Chest": KH1LocationData("End of the World", 265_4574), - "End of the World Final Dimension 8th Chest": KH1LocationData("End of the World", 265_4611), - "End of the World Final Dimension 7th Chest": KH1LocationData("End of the World", 265_4612), - "End of the World Giant Crevasse 3rd Chest": KH1LocationData("End of the World", 265_4613), - "End of the World Giant Crevasse 5th Chest": KH1LocationData("End of the World", 265_4614), - "End of the World Giant Crevasse 1st Chest": KH1LocationData("End of the World", 265_4651), - "End of the World Giant Crevasse 4th Chest": KH1LocationData("End of the World", 265_4652), - "End of the World Giant Crevasse 2nd Chest": KH1LocationData("End of the World", 265_4653), - "End of the World World Terminus Traverse Town Chest": KH1LocationData("End of the World", 265_4654), - "End of the World World Terminus Wonderland Chest": KH1LocationData("End of the World", 265_4691), - "End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("End of the World", 265_4692), - "End of the World World Terminus Deep Jungle Chest": KH1LocationData("End of the World", 265_4693), - "End of the World World Terminus Agrabah Chest": KH1LocationData("End of the World", 265_4694), - "End of the World World Terminus Atlantica Chest": KH1LocationData("End of the World", 265_4731), - "End of the World World Terminus Halloween Town Chest": KH1LocationData("End of the World", 265_4732), - "End of the World World Terminus Neverland Chest": KH1LocationData("End of the World", 265_4733), - "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("End of the World", 265_4734), - #"End of the World World Terminus Hollow Bastion Chest": KH1LocationData("End of the World", 265_4771), - "End of the World Final Rest Chest": KH1LocationData("End of the World", 265_4772), - "Monstro Chamber 6 White Trinity Chest": KH1LocationData("End of the World", 265_5092), - #"Awakening Chest": KH1LocationData("Awakening", 265_5093), missable + "Destiny Islands Chest": KH1LocationData("Destiny Islands", 265_0011, "Chest"), + "Traverse Town 1st District Candle Puzzle Chest": KH1LocationData("Traverse Town", 265_0211, "Chest"), + "Traverse Town 1st District Accessory Shop Roof Chest": KH1LocationData("Traverse Town", 265_0212, "Chest"), + "Traverse Town 2nd District Boots and Shoes Awning Chest": KH1LocationData("Traverse Town", 265_0213, "Chest"), + "Traverse Town 2nd District Rooftop Chest": KH1LocationData("Traverse Town", 265_0214, "Chest"), + "Traverse Town 2nd District Gizmo Shop Facade Chest": KH1LocationData("Traverse Town", 265_0251, "Chest"), + "Traverse Town Alleyway Balcony Chest": KH1LocationData("Traverse Town", 265_0252, "Chest"), + "Traverse Town Alleyway Blue Room Awning Chest": KH1LocationData("Traverse Town", 265_0253, "Chest"), + "Traverse Town Alleyway Corner Chest": KH1LocationData("Traverse Town", 265_0254, "Chest"), + "Traverse Town Green Room Clock Puzzle Chest": KH1LocationData("Traverse Town", 265_0292, "Chest"), + "Traverse Town Green Room Table Chest": KH1LocationData("Traverse Town", 265_0293, "Chest"), + "Traverse Town Red Room Chest": KH1LocationData("Traverse Town", 265_0294, "Chest"), + "Traverse Town Mystical House Yellow Trinity Chest": KH1LocationData("Traverse Town", 265_0331, "Chest"), + "Traverse Town Accessory Shop Chest": KH1LocationData("Traverse Town", 265_0332, "Chest"), + "Traverse Town Secret Waterway White Trinity Chest": KH1LocationData("Traverse Town", 265_0333, "Chest"), + "Traverse Town Geppetto's House Chest": KH1LocationData("Traverse Town", 265_0334, "Chest", True), + "Traverse Town Item Workshop Right Chest": KH1LocationData("Traverse Town", 265_0371, "Chest"), + "Traverse Town 1st District Blue Trinity Balcony Chest": KH1LocationData("Traverse Town", 265_0411, "Chest"), + "Traverse Town Mystical House Glide Chest": KH1LocationData("Traverse Town", 265_0891, "Chest"), + "Traverse Town Alleyway Behind Crates Chest": KH1LocationData("Traverse Town", 265_0892, "Chest"), + "Traverse Town Item Workshop Left Chest": KH1LocationData("Traverse Town", 265_0893, "Chest"), + "Traverse Town Secret Waterway Near Stairs Chest": KH1LocationData("Traverse Town", 265_0894, "Chest"), + "Wonderland Rabbit Hole Green Trinity Chest": KH1LocationData("Wonderland", 265_0931, "Chest"), + "Wonderland Rabbit Hole Defeat Heartless 1 Chest": KH1LocationData("Wonderland", 265_0932, "Chest"), + "Wonderland Rabbit Hole Defeat Heartless 2 Chest": KH1LocationData("Wonderland", 265_0933, "Chest"), + "Wonderland Rabbit Hole Defeat Heartless 3 Chest": KH1LocationData("Wonderland", 265_0934, "Chest"), + "Wonderland Bizarre Room Green Trinity Chest": KH1LocationData("Wonderland", 265_0971, "Chest"), + "Wonderland Queen's Castle Hedge Left Red Chest": KH1LocationData("Wonderland", 265_1011, "Chest"), + "Wonderland Queen's Castle Hedge Right Blue Chest": KH1LocationData("Wonderland", 265_1012, "Chest"), + "Wonderland Queen's Castle Hedge Right Red Chest": KH1LocationData("Wonderland", 265_1013, "Chest"), + "Wonderland Lotus Forest Thunder Plant Chest": KH1LocationData("Wonderland", 265_1014, "Chest"), + "Wonderland Lotus Forest Through the Painting Thunder Plant Chest": KH1LocationData("Wonderland", 265_1051, "Chest"), + "Wonderland Lotus Forest Glide Chest": KH1LocationData("Wonderland", 265_1052, "Chest"), + "Wonderland Lotus Forest Nut Chest": KH1LocationData("Wonderland", 265_1053, "Chest"), + "Wonderland Lotus Forest Corner Chest": KH1LocationData("Wonderland", 265_1054, "Chest"), + "Wonderland Bizarre Room Lamp Chest": KH1LocationData("Wonderland", 265_1091, "Chest"), + "Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest": KH1LocationData("Wonderland", 265_1093, "Chest"), + "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest": KH1LocationData("Wonderland", 265_1094, "Chest"), + "Wonderland Tea Party Garden Bear and Clock Puzzle Chest": KH1LocationData("Wonderland", 265_1131, "Chest"), + "Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest": KH1LocationData("Wonderland", 265_1132, "Chest"), + "Wonderland Lotus Forest Through the Painting White Trinity Chest": KH1LocationData("Wonderland", 265_1133, "Chest"), + "Deep Jungle Tree House Beneath Tree House Chest": KH1LocationData("Deep Jungle", 265_1213, "Chest"), + "Deep Jungle Tree House Rooftop Chest": KH1LocationData("Deep Jungle", 265_1214, "Chest"), + "Deep Jungle Hippo's Lagoon Center Chest": KH1LocationData("Deep Jungle", 265_1251, "Chest"), + "Deep Jungle Hippo's Lagoon Left Chest": KH1LocationData("Deep Jungle", 265_1252, "Chest"), + "Deep Jungle Hippo's Lagoon Right Chest": KH1LocationData("Deep Jungle", 265_1253, "Chest"), + "Deep Jungle Vines Chest": KH1LocationData("Deep Jungle", 265_1291, "Chest"), + "Deep Jungle Vines 2 Chest": KH1LocationData("Deep Jungle", 265_1292, "Chest"), + "Deep Jungle Climbing Trees Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1293, "Chest"), + "Deep Jungle Tunnel Chest": KH1LocationData("Deep Jungle", 265_1331, "Chest"), + "Deep Jungle Cavern of Hearts White Trinity Chest": KH1LocationData("Deep Jungle", 265_1332, "Chest", True), + "Deep Jungle Camp Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1333, "Chest"), + "Deep Jungle Tent Chest": KH1LocationData("Deep Jungle", 265_1334, "Chest"), + "Deep Jungle Waterfall Cavern Low Chest": KH1LocationData("Deep Jungle", 265_1371, "Chest", True), + "Deep Jungle Waterfall Cavern Middle Chest": KH1LocationData("Deep Jungle", 265_1372, "Chest", True), + "Deep Jungle Waterfall Cavern High Wall Chest": KH1LocationData("Deep Jungle", 265_1373, "Chest", True), + "Deep Jungle Waterfall Cavern High Middle Chest": KH1LocationData("Deep Jungle", 265_1374, "Chest", True), + "Deep Jungle Cliff Right Cliff Left Chest": KH1LocationData("Deep Jungle", 265_1411, "Chest"), + "Deep Jungle Cliff Right Cliff Right Chest": KH1LocationData("Deep Jungle", 265_1412, "Chest"), + "Deep Jungle Tree House Suspended Boat Chest": KH1LocationData("Deep Jungle", 265_1413, "Chest"), + "100 Acre Wood Meadow Inside Log Chest": KH1LocationData("100 Acre Wood", 265_1654, "Chest"), + "100 Acre Wood Bouncing Spot Left Cliff Chest": KH1LocationData("100 Acre Wood", 265_1691, "Chest"), + "100 Acre Wood Bouncing Spot Right Tree Alcove Chest": KH1LocationData("100 Acre Wood", 265_1692, "Chest"), + "100 Acre Wood Bouncing Spot Under Giant Pot Chest": KH1LocationData("100 Acre Wood", 265_1693, "Chest"), + "Agrabah Plaza By Storage Chest": KH1LocationData("Agrabah", 265_1972, "Chest"), + "Agrabah Plaza Raised Terrace Chest": KH1LocationData("Agrabah", 265_1973, "Chest"), + "Agrabah Plaza Top Corner Chest": KH1LocationData("Agrabah", 265_1974, "Chest"), + "Agrabah Alley Chest": KH1LocationData("Agrabah", 265_2011, "Chest"), + "Agrabah Bazaar Across Windows Chest": KH1LocationData("Agrabah", 265_2012, "Chest"), + "Agrabah Bazaar High Corner Chest": KH1LocationData("Agrabah", 265_2013, "Chest"), + "Agrabah Main Street Right Palace Entrance Chest": KH1LocationData("Agrabah", 265_2014, "Chest"), + "Agrabah Main Street High Above Alley Entrance Chest": KH1LocationData("Agrabah", 265_2051, "Chest"), + "Agrabah Main Street High Above Palace Gates Entrance Chest": KH1LocationData("Agrabah", 265_2052, "Chest"), + "Agrabah Palace Gates Low Chest": KH1LocationData("Agrabah", 265_2053, "Chest", True), + "Agrabah Palace Gates High Opposite Palace Chest": KH1LocationData("Agrabah", 265_2054, "Chest", True), + "Agrabah Palace Gates High Close to Palace Chest": KH1LocationData("Agrabah", 265_2091, "Chest", True), + "Agrabah Storage Green Trinity Chest": KH1LocationData("Agrabah", 265_2092, "Chest"), + "Agrabah Storage Behind Barrel Chest": KH1LocationData("Agrabah", 265_2093, "Chest"), + "Agrabah Cave of Wonders Entrance Left Chest": KH1LocationData("Agrabah", 265_2094, "Chest", True), + "Agrabah Cave of Wonders Entrance Tall Tower Chest": KH1LocationData("Agrabah", 265_2131, "Chest", True), + "Agrabah Cave of Wonders Hall High Left Chest": KH1LocationData("Agrabah", 265_2132, "Chest", True), + "Agrabah Cave of Wonders Hall Near Bottomless Hall Chest": KH1LocationData("Agrabah", 265_2133, "Chest", True), + "Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest": KH1LocationData("Agrabah", 265_2134, "Chest", True), + "Agrabah Cave of Wonders Bottomless Hall Pillar Chest": KH1LocationData("Agrabah", 265_2171, "Chest", True), + "Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest": KH1LocationData("Agrabah", 265_2172, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Across Platforms Chest": KH1LocationData("Agrabah", 265_2173, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest": KH1LocationData("Agrabah", 265_2174, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest": KH1LocationData("Agrabah", 265_2211, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Above Fire Chest": KH1LocationData("Agrabah", 265_2212, "Chest", True), + "Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest": KH1LocationData("Agrabah", 265_2213, "Chest", True), + "Agrabah Cave of Wonders Relic Chamber Stairs Chest": KH1LocationData("Agrabah", 265_2214, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Abu Gem Chest": KH1LocationData("Agrabah", 265_2251, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest": KH1LocationData("Agrabah", 265_2252, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Bridge Chest": KH1LocationData("Agrabah", 265_2253, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Near Save Chest": KH1LocationData("Agrabah", 265_2254, "Chest", True), + "Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest": KH1LocationData("Agrabah", 265_2291, "Chest", True), + "Agrabah Cave of Wonders Hidden Room Right Chest": KH1LocationData("Agrabah", 265_2292, "Chest", True), + "Agrabah Cave of Wonders Hidden Room Left Chest": KH1LocationData("Agrabah", 265_2293, "Chest", True), + "Agrabah Aladdin's House Main Street Entrance Chest": KH1LocationData("Agrabah", 265_2294, "Chest"), + "Agrabah Aladdin's House Plaza Entrance Chest": KH1LocationData("Agrabah", 265_2331, "Chest"), + "Agrabah Cave of Wonders Entrance White Trinity Chest": KH1LocationData("Agrabah", 265_2332, "Chest", True), + "Monstro Chamber 6 Other Platform Chest": KH1LocationData("Monstro", 265_2413, "Chest"), + "Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest": KH1LocationData("Monstro", 265_2414, "Chest"), + "Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest": KH1LocationData("Monstro", 265_2451, "Chest"), + "Monstro Chamber 6 Low Chest": KH1LocationData("Monstro", 265_2452, "Chest"), + "Atlantica Sunken Ship In Flipped Boat Chest": KH1LocationData("Atlantica", 265_2531, "Static"), + "Atlantica Sunken Ship Seabed Chest": KH1LocationData("Atlantica", 265_2532, "Static"), + "Atlantica Sunken Ship Inside Ship Chest": KH1LocationData("Atlantica", 265_2533, "Static"), + "Atlantica Ariel's Grotto High Chest": KH1LocationData("Atlantica", 265_2534, "Static"), + "Atlantica Ariel's Grotto Middle Chest": KH1LocationData("Atlantica", 265_2571, "Static"), + "Atlantica Ariel's Grotto Low Chest": KH1LocationData("Atlantica", 265_2572, "Static"), + "Atlantica Ursula's Lair Use Fire on Urchin Chest": KH1LocationData("Atlantica", 265_2573, "Static", True), + "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest": KH1LocationData("Atlantica", 265_2574, "Static"), + "Atlantica Triton's Palace White Trinity Chest": KH1LocationData("Atlantica", 265_2611, "Static"), + "Halloween Town Moonlight Hill White Trinity Chest": KH1LocationData("Halloween Town", 265_3014, "Chest"), + "Halloween Town Bridge Under Bridge": KH1LocationData("Halloween Town", 265_3051, "Chest"), + "Halloween Town Boneyard Tombstone Puzzle Chest": KH1LocationData("Halloween Town", 265_3052, "Chest"), + "Halloween Town Bridge Right of Gate Chest": KH1LocationData("Halloween Town", 265_3053, "Chest"), + "Halloween Town Cemetery Behind Grave Chest": KH1LocationData("Halloween Town", 265_3054, "Chest", True), + "Halloween Town Cemetery By Cat Shape Chest": KH1LocationData("Halloween Town", 265_3091, "Chest", True), + "Halloween Town Cemetery Between Graves Chest": KH1LocationData("Halloween Town", 265_3092, "Chest", True), + "Halloween Town Oogie's Manor Lower Iron Cage Chest": KH1LocationData("Halloween Town", 265_3093, "Chest"), + "Halloween Town Oogie's Manor Upper Iron Cage Chest": KH1LocationData("Halloween Town", 265_3094, "Chest"), + "Halloween Town Oogie's Manor Hollow Chest": KH1LocationData("Halloween Town", 265_3131, "Chest", True), + "Halloween Town Oogie's Manor Grounds Red Trinity Chest": KH1LocationData("Halloween Town", 265_3132, "Chest"), + "Halloween Town Guillotine Square High Tower Chest": KH1LocationData("Halloween Town", 265_3133, "Chest"), + "Halloween Town Guillotine Square Pumpkin Structure Left Chest": KH1LocationData("Halloween Town", 265_3134, "Chest"), + "Halloween Town Oogie's Manor Entrance Steps Chest": KH1LocationData("Halloween Town", 265_3171, "Chest"), + "Halloween Town Oogie's Manor Inside Entrance Chest": KH1LocationData("Halloween Town", 265_3172, "Chest"), + "Halloween Town Bridge Left of Gate Chest": KH1LocationData("Halloween Town", 265_3291, "Chest"), + "Halloween Town Cemetery By Striped Grave Chest": KH1LocationData("Halloween Town", 265_3292, "Chest", True), + "Halloween Town Guillotine Square Under Jack's House Stairs Chest": KH1LocationData("Halloween Town", 265_3293, "Chest"), + "Halloween Town Guillotine Square Pumpkin Structure Right Chest": KH1LocationData("Halloween Town", 265_3294, "Chest"), + "Olympus Coliseum Coliseum Gates Left Behind Columns Chest": KH1LocationData("Olympus Coliseum", 265_3332, "Chest"), + "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3333, "Chest"), + "Olympus Coliseum Coliseum Gates Left Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3334, "Chest"), + "Olympus Coliseum Coliseum Gates White Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3371, "Chest"), + "Olympus Coliseum Coliseum Gates Blizzara Chest": KH1LocationData("Olympus Coliseum", 265_3372, "Chest"), + "Olympus Coliseum Coliseum Gates Blizzaga Chest": KH1LocationData("Olympus Coliseum", 265_3373, "Chest"), + "Monstro Mouth Boat Deck Chest": KH1LocationData("Monstro", 265_3454, "Chest", True), + "Monstro Mouth High Platform Boat Side Chest": KH1LocationData("Monstro", 265_3491, "Chest"), + "Monstro Mouth High Platform Across from Boat Chest": KH1LocationData("Monstro", 265_3492, "Chest"), + "Monstro Mouth Near Ship Chest": KH1LocationData("Monstro", 265_3493, "Chest"), + "Monstro Mouth Green Trinity Top of Boat Chest": KH1LocationData("Monstro", 265_3494, "Chest", True), + "Monstro Chamber 2 Ground Chest": KH1LocationData("Monstro", 265_3534, "Chest"), + "Monstro Chamber 2 Platform Chest": KH1LocationData("Monstro", 265_3571, "Chest"), + "Monstro Chamber 5 Platform Chest": KH1LocationData("Monstro", 265_3613, "Chest"), + "Monstro Chamber 3 Ground Chest": KH1LocationData("Monstro", 265_3614, "Chest"), + "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest": KH1LocationData("Monstro", 265_3651, "Chest"), + "Monstro Chamber 3 Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3652, "Chest"), + "Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3653, "Chest"), + "Monstro Mouth High Platform Near Teeth Chest": KH1LocationData("Monstro", 265_3732, "Chest", True), + "Monstro Chamber 5 Atop Barrel Chest": KH1LocationData("Monstro", 265_3733, "Chest"), + "Monstro Chamber 5 Low 2nd Chest": KH1LocationData("Monstro", 265_3734, "Chest"), + "Monstro Chamber 5 Low 1st Chest": KH1LocationData("Monstro", 265_3771, "Chest"), + "Neverland Pirate Ship Deck White Trinity Chest": KH1LocationData("Neverland", 265_3772, "Chest", True), + "Neverland Pirate Ship Crows Nest Chest": KH1LocationData("Neverland", 265_3773, "Chest", True), + "Neverland Hold Yellow Trinity Right Blue Chest": KH1LocationData("Neverland", 265_3774, "Chest"), + "Neverland Hold Yellow Trinity Left Blue Chest": KH1LocationData("Neverland", 265_3811, "Chest"), + "Neverland Galley Chest": KH1LocationData("Neverland", 265_3812, "Chest"), + "Neverland Cabin Chest": KH1LocationData("Neverland", 265_3813, "Chest", True), + "Neverland Hold Flight 1st Chest": KH1LocationData("Neverland", 265_3814, "Chest", True), + "Neverland Clock Tower Chest": KH1LocationData("Neverland", 265_4014, "Chest", True), + "Neverland Hold Flight 2nd Chest": KH1LocationData("Neverland", 265_4051, "Chest", True), + "Neverland Hold Yellow Trinity Green Chest": KH1LocationData("Neverland", 265_4052, "Chest"), + "Neverland Captain's Cabin Chest": KH1LocationData("Neverland", 265_4053, "Chest", True), + "Hollow Bastion Rising Falls Water's Surface Chest": KH1LocationData("Hollow Bastion", 265_4054, "Chest"), + "Hollow Bastion Rising Falls Under Water 1st Chest": KH1LocationData("Hollow Bastion", 265_4091, "Chest"), + "Hollow Bastion Rising Falls Under Water 2nd Chest": KH1LocationData("Hollow Bastion", 265_4092, "Chest", True), + "Hollow Bastion Rising Falls Floating Platform Near Save Chest": KH1LocationData("Hollow Bastion", 265_4093, "Chest"), + "Hollow Bastion Rising Falls Floating Platform Near Bubble Chest": KH1LocationData("Hollow Bastion", 265_4094, "Chest"), + "Hollow Bastion Rising Falls High Platform Chest": KH1LocationData("Hollow Bastion", 265_4131, "Chest"), + "Hollow Bastion Castle Gates Gravity Chest": KH1LocationData("Hollow Bastion", 265_4132, "Chest"), + "Hollow Bastion Castle Gates Freestanding Pillar Chest": KH1LocationData("Hollow Bastion", 265_4133, "Chest"), + "Hollow Bastion Castle Gates High Pillar Chest": KH1LocationData("Hollow Bastion", 265_4134, "Chest"), + "Hollow Bastion Great Crest Lower Chest": KH1LocationData("Hollow Bastion", 265_4171, "Chest", True), + "Hollow Bastion Great Crest After Battle Platform Chest": KH1LocationData("Hollow Bastion", 265_4172, "Chest", True), + "Hollow Bastion High Tower 2nd Gravity Chest": KH1LocationData("Hollow Bastion", 265_4173, "Chest", True), + "Hollow Bastion High Tower 1st Gravity Chest": KH1LocationData("Hollow Bastion", 265_4174, "Chest", True), + "Hollow Bastion High Tower Above Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4211, "Chest", True), + "Hollow Bastion Library Top of Bookshelf Chest": KH1LocationData("Hollow Bastion", 265_4213, "Chest", True), + "Hollow Bastion Library 1st Floor Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4214, "Static", True), + "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4251, "Static", True), + "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest": KH1LocationData("Hollow Bastion", 265_4252, "Static", True), + "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest": KH1LocationData("Hollow Bastion", 265_4253, "Static", True), + "Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest": KH1LocationData("Hollow Bastion", 265_4254, "Chest", True), + "Hollow Bastion Lift Stop Library Node Gravity Chest": KH1LocationData("Hollow Bastion", 265_4291, "Chest", True), + "Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4292, "Chest", True), + "Hollow Bastion Lift Stop Outside Library Gravity Chest": KH1LocationData("Hollow Bastion", 265_4293, "Chest", True), + "Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest": KH1LocationData("Hollow Bastion", 265_4294, "Chest", True), + "Hollow Bastion Base Level Bubble Under the Wall Platform Chest": KH1LocationData("Hollow Bastion", 265_4331, "Chest"), + "Hollow Bastion Base Level Platform Near Entrance Chest": KH1LocationData("Hollow Bastion", 265_4332, "Chest"), + "Hollow Bastion Base Level Near Crystal Switch Chest": KH1LocationData("Hollow Bastion", 265_4333, "Chest"), + "Hollow Bastion Waterway Near Save Chest": KH1LocationData("Hollow Bastion", 265_4334, "Chest"), + "Hollow Bastion Waterway Blizzard on Bubble Chest": KH1LocationData("Hollow Bastion", 265_4371, "Chest"), + "Hollow Bastion Waterway Unlock Passage from Base Level Chest": KH1LocationData("Hollow Bastion", 265_4372, "Chest"), + "Hollow Bastion Dungeon By Candles Chest": KH1LocationData("Hollow Bastion", 265_4373, "Chest"), + "Hollow Bastion Dungeon Corner Chest": KH1LocationData("Hollow Bastion", 265_4374, "Chest"), + "Hollow Bastion Grand Hall Steps Right Side Chest": KH1LocationData("Hollow Bastion", 265_4454, "Chest", True), + "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Hollow Bastion", 265_4491, "Chest", True), + "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Hollow Bastion", 265_4492, "Chest", True), + #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Hollow Bastion", 265_4493, "Static"), --handled later + "Hollow Bastion Entrance Hall Left of Emblem Door Chest": KH1LocationData("Hollow Bastion", 265_4212, "Chest", True), + "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Hollow Bastion", 265_4494, "Chest", True), + "End of the World Final Dimension 1st Chest": KH1LocationData("End of the World", 265_4531, "Chest", True), + "End of the World Final Dimension 2nd Chest": KH1LocationData("End of the World", 265_4532, "Chest", True), + "End of the World Final Dimension 3rd Chest": KH1LocationData("End of the World", 265_4533, "Chest", True), + "End of the World Final Dimension 4th Chest": KH1LocationData("End of the World", 265_4534, "Chest", True), + "End of the World Final Dimension 5th Chest": KH1LocationData("End of the World", 265_4571, "Chest", True), + "End of the World Final Dimension 6th Chest": KH1LocationData("End of the World", 265_4572, "Chest", True), + "End of the World Final Dimension 10th Chest": KH1LocationData("End of the World", 265_4573, "Chest", True), + "End of the World Final Dimension 9th Chest": KH1LocationData("End of the World", 265_4574, "Chest", True), + "End of the World Final Dimension 8th Chest": KH1LocationData("End of the World", 265_4611, "Chest", True), + "End of the World Final Dimension 7th Chest": KH1LocationData("End of the World", 265_4612, "Chest", True), + "End of the World Giant Crevasse 3rd Chest": KH1LocationData("End of the World", 265_4613, "Chest", True), + "End of the World Giant Crevasse 5th Chest": KH1LocationData("End of the World", 265_4614, "Chest", True), + "End of the World Giant Crevasse 1st Chest": KH1LocationData("End of the World", 265_4651, "Chest", True), + "End of the World Giant Crevasse 4th Chest": KH1LocationData("End of the World", 265_4652, "Chest", True), + "End of the World Giant Crevasse 2nd Chest": KH1LocationData("End of the World", 265_4653, "Chest", True), + "End of the World World Terminus Traverse Town Chest": KH1LocationData("End of the World", 265_4654, "Chest", True), + "End of the World World Terminus Wonderland Chest": KH1LocationData("End of the World", 265_4691, "Chest", True), + "End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("End of the World", 265_4692, "Chest", True), + "End of the World World Terminus Deep Jungle Chest": KH1LocationData("End of the World", 265_4693, "Chest", True), + "End of the World World Terminus Agrabah Chest": KH1LocationData("End of the World", 265_4694, "Chest", True), + "End of the World World Terminus Atlantica Chest": KH1LocationData("End of the World", 265_4731, "Static", True), + "End of the World World Terminus Halloween Town Chest": KH1LocationData("End of the World", 265_4732, "Chest", True), + "End of the World World Terminus Neverland Chest": KH1LocationData("End of the World", 265_4733, "Chest", True), + "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("End of the World", 265_4734, "Chest", True), + "End of the World World Terminus Hollow Bastion Chest": KH1LocationData("End of the World", 265_4771, "Chest", True), + "End of the World Final Rest Chest": KH1LocationData("End of the World", 265_4772, "Chest", True), + "Monstro Chamber 6 White Trinity Chest": KH1LocationData("Monstro", 265_5092, "Chest", True), + #"Awakening Chest": KH1LocationData("Awakening", 265_5093, "Chest"), missable - "Traverse Town Defeat Guard Armor Dodge Roll Event": KH1LocationData("Traverse Town", 265_6011), - "Traverse Town Defeat Guard Armor Fire Event": KH1LocationData("Traverse Town", 265_6012), - "Traverse Town Defeat Guard Armor Blue Trinity Event": KH1LocationData("Traverse Town", 265_6013), - "Traverse Town Leon Secret Waterway Earthshine Event": KH1LocationData("Traverse Town", 265_6014), - "Traverse Town Kairi Secret Waterway Oathkeeper Event": KH1LocationData("Traverse Town", 265_6015), - "Traverse Town Defeat Guard Armor Brave Warrior Event": KH1LocationData("Traverse Town", 265_6016), - "Deep Jungle Defeat Sabor White Fang Event": KH1LocationData("Deep Jungle", 265_6021), - "Deep Jungle Defeat Clayton Cure Event": KH1LocationData("Deep Jungle", 265_6022), - "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Deep Jungle", 265_6023), - "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Deep Jungle", 265_6024), - "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Olympus Coliseum", 265_6031), - "Olympus Coliseum Defeat Cerberus Inferno Band Event": KH1LocationData("Olympus Coliseum", 265_6033), - "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Wonderland", 265_6041), - "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Wonderland", 265_6042), - "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Agrabah", 265_6051), - "Agrabah Defeat Jafar Blizzard Event": KH1LocationData("Agrabah", 265_6052), - "Agrabah Defeat Jafar Genie Fire Event": KH1LocationData("Agrabah", 265_6053), - "Agrabah Seal Keyhole Genie Event": KH1LocationData("Agrabah", 265_6054), - "Agrabah Seal Keyhole Three Wishes Event": KH1LocationData("Agrabah", 265_6055), - "Agrabah Seal Keyhole Green Trinity Event": KH1LocationData("Agrabah", 265_6056), - "Monstro Defeat Parasite Cage I Goofy Cheer Event": KH1LocationData("Monstro", 265_6061), - "Monstro Defeat Parasite Cage II Stop Event": KH1LocationData("Monstro", 265_6062), - "Atlantica Defeat Ursula I Mermaid Kick Event": KH1LocationData("Atlantica", 265_6071), - "Atlantica Defeat Ursula II Thunder Event": KH1LocationData("Atlantica", 265_6072), - "Atlantica Seal Keyhole Crabclaw Event": KH1LocationData("Atlantica", 265_6073), - "Halloween Town Defeat Oogie Boogie Holy Circlet Event": KH1LocationData("Halloween Town", 265_6081), - "Halloween Town Defeat Oogie's Manor Gravity Event": KH1LocationData("Halloween Town", 265_6082), - "Halloween Town Seal Keyhole Pumpkinhead Event": KH1LocationData("Halloween Town", 265_6083), - "Neverland Defeat Anti Sora Raven's Claw Event": KH1LocationData("Neverland", 265_6091), - "Neverland Encounter Hook Cure Event": KH1LocationData("Neverland", 265_6092), - "Neverland Seal Keyhole Fairy Harp Event": KH1LocationData("Neverland", 265_6093), - "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Neverland", 265_6094), - "Neverland Seal Keyhole Glide Event": KH1LocationData("Neverland", 265_6095), - "Neverland Defeat Phantom Stop Event": KH1LocationData("Neverland", 265_6096), - "Neverland Defeat Captain Hook Ars Arcanum Event": KH1LocationData("Neverland", 265_6097), - "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Hollow Bastion", 265_6101), - "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Hollow Bastion", 265_6102), - "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Hollow Bastion", 265_6103), - "Hollow Bastion Defeat Riku II Ragnarok Event": KH1LocationData("Hollow Bastion", 265_6104), - "Hollow Bastion Defeat Behemoth Omega Arts Event": KH1LocationData("Hollow Bastion", 265_6105), - "Hollow Bastion Speak to Princesses Fire Event": KH1LocationData("Hollow Bastion", 265_6106), - "End of the World Defeat Chernabog Superglide Event": KH1LocationData("End of the World", 265_6111), + "Traverse Town Defeat Guard Armor Dodge Roll Event": KH1LocationData("Traverse Town", 265_6011, "Reward"), + "Traverse Town Defeat Guard Armor Fire Event": KH1LocationData("Traverse Town", 265_6012, "Static"), + "Traverse Town Defeat Guard Armor Blue Trinity Event": KH1LocationData("Traverse Town", 265_6013, "Static"), + "Traverse Town Leon Secret Waterway Earthshine Event": KH1LocationData("Traverse Town", 265_6014, "Reward"), + "Traverse Town Kairi Secret Waterway Oathkeeper Event": KH1LocationData("Traverse Town", 265_6015, "Reward", True), + "Traverse Town Defeat Guard Armor Brave Warrior Event": KH1LocationData("Traverse Town", 265_6016, "Reward"), + "Deep Jungle Defeat Sabor White Fang Event": KH1LocationData("Deep Jungle", 265_6021, "Reward", True), + "Deep Jungle Defeat Clayton Cure Event": KH1LocationData("Deep Jungle", 265_6022, "Static", True), + "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Deep Jungle", 265_6023, "Reward", True), + "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Deep Jungle", 265_6024, "Static", True), + "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Olympus Coliseum", 265_6031, "Static"), + "Olympus Coliseum Defeat Cerberus Inferno Band Event": KH1LocationData("Olympus Coliseum", 265_6033, "Reward", True), + "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Wonderland", 265_6041, "Static", True), + "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Wonderland", 265_6042, "Reward", True), + "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Agrabah", 265_6051, "Reward", True), + "Agrabah Defeat Jafar Blizzard Event": KH1LocationData("Agrabah", 265_6052, "Static", True), + "Agrabah Defeat Jafar Genie Fire Event": KH1LocationData("Agrabah", 265_6053, "Static", True), + "Agrabah Seal Keyhole Genie Event": KH1LocationData("Agrabah", 265_6054, "Static", True), + "Agrabah Seal Keyhole Three Wishes Event": KH1LocationData("Agrabah", 265_6055, "Reward", True), + "Agrabah Seal Keyhole Green Trinity Event": KH1LocationData("Agrabah", 265_6056, "Static", True), + "Monstro Defeat Parasite Cage I Goofy Cheer Event": KH1LocationData("Monstro", 265_6061, "Reward", True), + "Monstro Defeat Parasite Cage II Stop Event": KH1LocationData("Monstro", 265_6062, "Static", True), + "Atlantica Defeat Ursula I Mermaid Kick Event": KH1LocationData("Atlantica", 265_6071, "Reward", True), + "Atlantica Defeat Ursula II Thunder Event": KH1LocationData("Atlantica", 265_6072, "Static", True), + "Atlantica Seal Keyhole Crabclaw Event": KH1LocationData("Atlantica", 265_6073, "Reward", True), + "Halloween Town Defeat Oogie Boogie Holy Circlet Event": KH1LocationData("Halloween Town", 265_6081, "Reward", True), + "Halloween Town Defeat Oogie's Manor Gravity Event": KH1LocationData("Halloween Town", 265_6082, "Static", True), + "Halloween Town Seal Keyhole Pumpkinhead Event": KH1LocationData("Halloween Town", 265_6083, "Reward", True), + "Neverland Defeat Anti Sora Raven's Claw Event": KH1LocationData("Neverland", 265_6091, "Reward", True), + "Neverland Encounter Hook Cure Event": KH1LocationData("Neverland", 265_6092, "Static", True), + "Neverland Seal Keyhole Fairy Harp Event": KH1LocationData("Neverland", 265_6093, "Reward", True), + "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Neverland", 265_6094, "Static", True), + "Neverland Seal Keyhole Glide Event": KH1LocationData("Neverland", 265_6095, "Reward", True), + "Neverland Defeat Phantom Stop Event": KH1LocationData("Neverland", 265_6096, "Static", True), + "Neverland Defeat Captain Hook Ars Arcanum Event": KH1LocationData("Neverland", 265_6097, "Reward", True), + "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Hollow Bastion", 265_6101, "Static", True), + "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Hollow Bastion", 265_6102, "Reward", True), + "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Hollow Bastion", 265_6103, "Reward", True), + "Hollow Bastion Defeat Riku II Ragnarok Event": KH1LocationData("Hollow Bastion", 265_6104, "Reward", True), + "Hollow Bastion Defeat Behemoth Omega Arts Event": KH1LocationData("Hollow Bastion", 265_6105, "Reward", True), + "Hollow Bastion Speak to Princesses Fire Event": KH1LocationData("Hollow Bastion", 265_6106, "Static", True), + "End of the World Defeat Chernabog Superglide Event": KH1LocationData("End of the World", 265_6111, "Reward", True), + "Neverland Seal Keyhole Navi-G Piece Event": KH1LocationData("Neverland", 265_6112, "Static", True), + "Traverse Town Secret Waterway Navi Gummi Event": KH1LocationData("Traverse Town", 265_6113, "Static", True), - "Traverse Town Mail Postcard 01 Event": KH1LocationData("Traverse Town", 265_6120), - "Traverse Town Mail Postcard 02 Event": KH1LocationData("Traverse Town", 265_6121), - "Traverse Town Mail Postcard 03 Event": KH1LocationData("Traverse Town", 265_6122), - "Traverse Town Mail Postcard 04 Event": KH1LocationData("Traverse Town", 265_6123), - "Traverse Town Mail Postcard 05 Event": KH1LocationData("Traverse Town", 265_6124), - "Traverse Town Mail Postcard 06 Event": KH1LocationData("Traverse Town", 265_6125), - "Traverse Town Mail Postcard 07 Event": KH1LocationData("Traverse Town", 265_6126), - "Traverse Town Mail Postcard 08 Event": KH1LocationData("Traverse Town", 265_6127), - "Traverse Town Mail Postcard 09 Event": KH1LocationData("Traverse Town", 265_6128), - "Traverse Town Mail Postcard 10 Event": KH1LocationData("Traverse Town", 265_6129), + "Traverse Town Mail Postcard 01 Event": KH1LocationData("Traverse Town", 265_6120, "Reward"), + "Traverse Town Mail Postcard 02 Event": KH1LocationData("Traverse Town", 265_6121, "Reward"), + "Traverse Town Mail Postcard 03 Event": KH1LocationData("Traverse Town", 265_6122, "Reward"), + "Traverse Town Mail Postcard 04 Event": KH1LocationData("Traverse Town", 265_6123, "Reward"), + "Traverse Town Mail Postcard 05 Event": KH1LocationData("Traverse Town", 265_6124, "Reward"), + "Traverse Town Mail Postcard 06 Event": KH1LocationData("Traverse Town", 265_6125, "Reward"), + "Traverse Town Mail Postcard 07 Event": KH1LocationData("Traverse Town", 265_6126, "Reward"), + "Traverse Town Mail Postcard 08 Event": KH1LocationData("Traverse Town", 265_6127, "Reward"), + "Traverse Town Mail Postcard 09 Event": KH1LocationData("Traverse Town", 265_6128, "Reward"), + "Traverse Town Mail Postcard 10 Event": KH1LocationData("Traverse Town", 265_6129, "Reward"), - "Traverse Town Defeat Opposite Armor Aero Event": KH1LocationData("Traverse Town", 265_6131), + "Traverse Town Defeat Opposite Armor Aero Event": KH1LocationData("Traverse Town", 265_6131, "Static", True), + "Traverse Town Defeat Opposite Armor Navi-G Piece Event": KH1LocationData("Traverse Town", 265_6132, "Static", True), - "Atlantica Undersea Gorge Blizzard Clam": KH1LocationData("Atlantica", 265_6201), - "Atlantica Undersea Gorge Ocean Floor Clam": KH1LocationData("Atlantica", 265_6202), - "Atlantica Undersea Valley Higher Cave Clam": KH1LocationData("Atlantica", 265_6203), - "Atlantica Undersea Valley Lower Cave Clam": KH1LocationData("Atlantica", 265_6204), - "Atlantica Undersea Valley Fire Clam": KH1LocationData("Atlantica", 265_6205), - "Atlantica Undersea Valley Wall Clam": KH1LocationData("Atlantica", 265_6206), - "Atlantica Undersea Valley Pillar Clam": KH1LocationData("Atlantica", 265_6207), - "Atlantica Undersea Valley Ocean Floor Clam": KH1LocationData("Atlantica", 265_6208), - "Atlantica Triton's Palace Thunder Clam": KH1LocationData("Atlantica", 265_6209), - "Atlantica Triton's Palace Wall Right Clam": KH1LocationData("Atlantica", 265_6210), - "Atlantica Triton's Palace Near Path Clam": KH1LocationData("Atlantica", 265_6211), - "Atlantica Triton's Palace Wall Left Clam": KH1LocationData("Atlantica", 265_6212), - "Atlantica Cavern Nook Clam": KH1LocationData("Atlantica", 265_6213), - "Atlantica Below Deck Clam": KH1LocationData("Atlantica", 265_6214), - "Atlantica Undersea Garden Clam": KH1LocationData("Atlantica", 265_6215), - "Atlantica Undersea Cave Clam": KH1LocationData("Atlantica", 265_6216), + "Atlantica Undersea Gorge Blizzard Clam": KH1LocationData("Atlantica", 265_6201, "Static"), + "Atlantica Undersea Gorge Ocean Floor Clam": KH1LocationData("Atlantica", 265_6202, "Static"), + "Atlantica Undersea Valley Higher Cave Clam": KH1LocationData("Atlantica", 265_6203, "Static"), + "Atlantica Undersea Valley Lower Cave Clam": KH1LocationData("Atlantica", 265_6204, "Static"), + "Atlantica Undersea Valley Fire Clam": KH1LocationData("Atlantica", 265_6205, "Static"), + "Atlantica Undersea Valley Wall Clam": KH1LocationData("Atlantica", 265_6206, "Static"), + "Atlantica Undersea Valley Pillar Clam": KH1LocationData("Atlantica", 265_6207, "Static"), + "Atlantica Undersea Valley Ocean Floor Clam": KH1LocationData("Atlantica", 265_6208, "Static"), + "Atlantica Triton's Palace Thunder Clam": KH1LocationData("Atlantica", 265_6209, "Static"), + "Atlantica Triton's Palace Wall Right Clam": KH1LocationData("Atlantica", 265_6210, "Static"), + "Atlantica Triton's Palace Near Path Clam": KH1LocationData("Atlantica", 265_6211, "Static"), + "Atlantica Triton's Palace Wall Left Clam": KH1LocationData("Atlantica", 265_6212, "Static"), + "Atlantica Cavern Nook Clam": KH1LocationData("Atlantica", 265_6213, "Static"), + "Atlantica Below Deck Clam": KH1LocationData("Atlantica", 265_6214, "Static"), + "Atlantica Undersea Garden Clam": KH1LocationData("Atlantica", 265_6215, "Static"), + "Atlantica Undersea Cave Clam": KH1LocationData("Atlantica", 265_6216, "Static"), - #"Traverse Town Magician's Study Turn in Naturespark": KH1LocationData("Traverse Town", 265_6300), - #"Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Traverse Town", 265_6301), - #"Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Traverse Town", 265_6302), - #"Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Traverse Town", 265_6303), - "Traverse Town Geppetto's House Geppetto Reward 1": KH1LocationData("Traverse Town", 265_6304), - "Traverse Town Geppetto's House Geppetto Reward 2": KH1LocationData("Traverse Town", 265_6305), - "Traverse Town Geppetto's House Geppetto Reward 3": KH1LocationData("Traverse Town", 265_6306), - "Traverse Town Geppetto's House Geppetto Reward 4": KH1LocationData("Traverse Town", 265_6307), - "Traverse Town Geppetto's House Geppetto Reward 5": KH1LocationData("Traverse Town", 265_6308), - "Traverse Town Geppetto's House Geppetto All Summons Reward": KH1LocationData("Traverse Town", 265_6309), - "Traverse Town Geppetto's House Talk to Pinocchio": KH1LocationData("Traverse Town", 265_6310), - "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Traverse Town", 265_6311), - "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Traverse Town", 265_6312), - "Traverse Town Magician's Study Obtained All LV3 Magic": KH1LocationData("Traverse Town", 265_6313), - "Traverse Town Piano Room Return 10 Puppies": KH1LocationData("Traverse Town", 265_6314), - "Traverse Town Piano Room Return 20 Puppies": KH1LocationData("Traverse Town", 265_6315), - "Traverse Town Piano Room Return 30 Puppies": KH1LocationData("Traverse Town", 265_6316), - "Traverse Town Piano Room Return 40 Puppies": KH1LocationData("Traverse Town", 265_6317), - "Traverse Town Piano Room Return 50 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6318), - "Traverse Town Piano Room Return 50 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6319), - "Traverse Town Piano Room Return 60 Puppies": KH1LocationData("Traverse Town", 265_6320), - "Traverse Town Piano Room Return 70 Puppies": KH1LocationData("Traverse Town", 265_6321), - "Traverse Town Piano Room Return 80 Puppies": KH1LocationData("Traverse Town", 265_6322), - "Traverse Town Piano Room Return 90 Puppies": KH1LocationData("Traverse Town", 265_6324), - "Traverse Town Piano Room Return 99 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6326), - "Traverse Town Piano Room Return 99 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6327), - "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Olympus Coliseum", 265_6032), #Had to change the way we send this check, not changing location_id - "Olympus Coliseum Defeat Sephiroth One-Winged Angel Event": KH1LocationData("Olympus Coliseum", 265_6328), - "Olympus Coliseum Defeat Ice Titan Diamond Dust Event": KH1LocationData("Olympus Coliseum", 265_6329), - "Olympus Coliseum Gates Purple Jar After Defeating Hades": KH1LocationData("Olympus Coliseum", 265_6330), - "Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times": KH1LocationData("Halloween Town", 265_6331), - #"Neverland Clock Tower 01:00 Door": KH1LocationData("Neverland", 265_6332), - #"Neverland Clock Tower 02:00 Door": KH1LocationData("Neverland", 265_6333), - #"Neverland Clock Tower 03:00 Door": KH1LocationData("Neverland", 265_6334), - #"Neverland Clock Tower 04:00 Door": KH1LocationData("Neverland", 265_6335), - #"Neverland Clock Tower 05:00 Door": KH1LocationData("Neverland", 265_6336), - #"Neverland Clock Tower 06:00 Door": KH1LocationData("Neverland", 265_6337), - #"Neverland Clock Tower 07:00 Door": KH1LocationData("Neverland", 265_6338), - #"Neverland Clock Tower 08:00 Door": KH1LocationData("Neverland", 265_6339), - #"Neverland Clock Tower 09:00 Door": KH1LocationData("Neverland", 265_6340), - #"Neverland Clock Tower 10:00 Door": KH1LocationData("Neverland", 265_6341), - #"Neverland Clock Tower 11:00 Door": KH1LocationData("Neverland", 265_6342), - #"Neverland Clock Tower 12:00 Door": KH1LocationData("Neverland", 265_6343), - "Neverland Hold Aero Chest": KH1LocationData("Neverland", 265_6344), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 1": KH1LocationData("100 Acre Wood", 265_6345), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 2": KH1LocationData("100 Acre Wood", 265_6346), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 3": KH1LocationData("100 Acre Wood", 265_6347), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 4": KH1LocationData("100 Acre Wood", 265_6348), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 5": KH1LocationData("100 Acre Wood", 265_6349), - "100 Acre Wood Pooh's House Owl Cheer": KH1LocationData("100 Acre Wood", 265_6350), - "100 Acre Wood Convert Torn Page 1": KH1LocationData("100 Acre Wood", 265_6351), - "100 Acre Wood Convert Torn Page 2": KH1LocationData("100 Acre Wood", 265_6352), - "100 Acre Wood Convert Torn Page 3": KH1LocationData("100 Acre Wood", 265_6353), - "100 Acre Wood Convert Torn Page 4": KH1LocationData("100 Acre Wood", 265_6354), - "100 Acre Wood Convert Torn Page 5": KH1LocationData("100 Acre Wood", 265_6355), - "100 Acre Wood Pooh's House Start Fire": KH1LocationData("100 Acre Wood", 265_6356), - "100 Acre Wood Pooh's Room Cabinet": KH1LocationData("100 Acre Wood", 265_6357), - "100 Acre Wood Pooh's Room Chimney": KH1LocationData("100 Acre Wood", 265_6358), - "100 Acre Wood Bouncing Spot Break Log": KH1LocationData("100 Acre Wood", 265_6359), - "100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh": KH1LocationData("100 Acre Wood", 265_6360), - "Deep Jungle Camp Hi-Potion Experiment": KH1LocationData("Deep Jungle", 265_6361), - "Deep Jungle Camp Ether Experiment": KH1LocationData("Deep Jungle", 265_6362), - "Deep Jungle Camp Replication Experiment": KH1LocationData("Deep Jungle", 265_6363), - "Deep Jungle Cliff Save Gorillas": KH1LocationData("Deep Jungle", 265_6364), - "Deep Jungle Tree House Save Gorillas": KH1LocationData("Deep Jungle", 265_6365), - "Deep Jungle Camp Save Gorillas": KH1LocationData("Deep Jungle", 265_6366), - "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Deep Jungle", 265_6367), - "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Deep Jungle", 265_6368), - "Olympus Coliseum Olympia Chest": KH1LocationData("Olympus Coliseum", 265_6369), - "Deep Jungle Jungle Slider 10 Fruits": KH1LocationData("Deep Jungle", 265_6370), - "Deep Jungle Jungle Slider 20 Fruits": KH1LocationData("Deep Jungle", 265_6371), - "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Deep Jungle", 265_6372), - "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Deep Jungle", 265_6373), - "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Deep Jungle", 265_6374), - "Traverse Town 1st District Speak with Cid Event": KH1LocationData("Traverse Town", 265_6375), - "Wonderland Bizarre Room Read Book": KH1LocationData("Wonderland", 265_6376), - "Olympus Coliseum Coliseum Gates Green Trinity": KH1LocationData("Olympus Coliseum", 265_6377), - "Agrabah Defeat Kurt Zisa Zantetsuken Event": KH1LocationData("Agrabah", 265_6378), - "Hollow Bastion Defeat Unknown EXP Necklace Event": KH1LocationData("Hollow Bastion", 265_6379), - "Olympus Coliseum Coliseum Gates Hero's License Event": KH1LocationData("Olympus Coliseum", 265_6380), - "Atlantica Sunken Ship Crystal Trident Event": KH1LocationData("Atlantica", 265_6381), - "Halloween Town Graveyard Forget-Me-Not Event": KH1LocationData("Halloween Town", 265_6382), - "Deep Jungle Tent Protect-G Event": KH1LocationData("Deep Jungle", 265_6383), - "Deep Jungle Cavern of Hearts Navi-G Piece Event": KH1LocationData("Deep Jungle", 265_6384), - "Wonderland Bizarre Room Navi-G Piece Event": KH1LocationData("Wonderland", 265_6385), - "Olympus Coliseum Coliseum Gates Entry Pass Event": KH1LocationData("Olympus Coliseum", 265_6386), + #"Traverse Town Magician's Study Turn in Naturespark": KH1LocationData("Traverse Town", 265_6300, "Static"), + #"Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Traverse Town", 265_6301, "Static"), + #"Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Traverse Town", 265_6302, "Static"), + #"Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Traverse Town", 265_6303, "Reward"), + "Traverse Town Geppetto's House Geppetto Reward 1": KH1LocationData("Traverse Town", 265_6304, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 4": KH1LocationData("Traverse Town", 265_6305, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 3": KH1LocationData("Traverse Town", 265_6306, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 5": KH1LocationData("Traverse Town", 265_6307, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 2": KH1LocationData("Traverse Town", 265_6308, "Static", True), + "Traverse Town Geppetto's House Geppetto All Summons Reward": KH1LocationData("Traverse Town", 265_6309, "Static", True), + "Traverse Town Geppetto's House Talk to Pinocchio": KH1LocationData("Traverse Town", 265_6310, "Static", True), + "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Traverse Town", 265_6311, "Reward"), + "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Traverse Town", 265_6312, "Reward"), + "Traverse Town Magician's Study Obtained All LV3 Magic": KH1LocationData("Traverse Town", 265_6313, "Reward"), + "Traverse Town Piano Room Return 10 Puppies": KH1LocationData("Traverse Town", 265_6314, "Static"), + "Traverse Town Piano Room Return 20 Puppies": KH1LocationData("Traverse Town", 265_6315, "Static"), + "Traverse Town Piano Room Return 30 Puppies": KH1LocationData("Traverse Town", 265_6316, "Static"), + "Traverse Town Piano Room Return 40 Puppies": KH1LocationData("Traverse Town", 265_6317, "Reward"), + "Traverse Town Piano Room Return 50 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6318, "Static"), + "Traverse Town Piano Room Return 50 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6319, "Reward"), + "Traverse Town Piano Room Return 60 Puppies": KH1LocationData("Traverse Town", 265_6320, "Reward"), + "Traverse Town Piano Room Return 70 Puppies": KH1LocationData("Traverse Town", 265_6321, "Reward"), + "Traverse Town Piano Room Return 80 Puppies": KH1LocationData("Traverse Town", 265_6322, "Static"), + "Traverse Town Piano Room Return 90 Puppies": KH1LocationData("Traverse Town", 265_6324, "Reward"), + "Traverse Town Piano Room Return 99 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6326, "Static"), + "Traverse Town Piano Room Return 99 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6327, "Static"), + "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Olympus Coliseum", 265_6032, "Reward", True), #Had to change the way we send this check, not changing location_id + "Olympus Coliseum Defeat Sephiroth One-Winged Angel Event": KH1LocationData("Olympus Coliseum", 265_6328, "Reward", True), + "Olympus Coliseum Defeat Ice Titan Diamond Dust Event": KH1LocationData("Olympus Coliseum", 265_6329, "Reward", True), + "Olympus Coliseum Gates Purple Jar After Defeating Hades": KH1LocationData("Olympus Coliseum", 265_6330, "Static", True), + "Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times": KH1LocationData("Halloween Town", 265_6331, "Static"), + "Neverland Clock Tower 01:00 Door": KH1LocationData("Neverland", 265_6332, "Static", True), + "Neverland Clock Tower 02:00 Door": KH1LocationData("Neverland", 265_6333, "Static", True), + "Neverland Clock Tower 03:00 Door": KH1LocationData("Neverland", 265_6334, "Static", True), + "Neverland Clock Tower 04:00 Door": KH1LocationData("Neverland", 265_6335, "Static", True), + "Neverland Clock Tower 05:00 Door": KH1LocationData("Neverland", 265_6336, "Static", True), + "Neverland Clock Tower 06:00 Door": KH1LocationData("Neverland", 265_6337, "Static", True), + "Neverland Clock Tower 07:00 Door": KH1LocationData("Neverland", 265_6338, "Static", True), + "Neverland Clock Tower 08:00 Door": KH1LocationData("Neverland", 265_6339, "Static", True), + "Neverland Clock Tower 09:00 Door": KH1LocationData("Neverland", 265_6340, "Static", True), + "Neverland Clock Tower 10:00 Door": KH1LocationData("Neverland", 265_6341, "Static", True), + "Neverland Clock Tower 11:00 Door": KH1LocationData("Neverland", 265_6342, "Static", True), + "Neverland Clock Tower 12:00 Door": KH1LocationData("Neverland", 265_6343, "Static", True), + "Neverland Hold Aero Chest": KH1LocationData("Neverland", 265_6344, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 1": KH1LocationData("100 Acre Wood", 265_6345, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 2": KH1LocationData("100 Acre Wood", 265_6346, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 3": KH1LocationData("100 Acre Wood", 265_6347, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 4": KH1LocationData("100 Acre Wood", 265_6348, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 5": KH1LocationData("100 Acre Wood", 265_6349, "Static"), + "100 Acre Wood Pooh's House Owl Cheer": KH1LocationData("100 Acre Wood", 265_6350, "Reward"), + "100 Acre Wood Convert Torn Page 1": KH1LocationData("100 Acre Wood", 265_6351, "Reward"), + "100 Acre Wood Convert Torn Page 2": KH1LocationData("100 Acre Wood", 265_6352, "Reward"), + "100 Acre Wood Convert Torn Page 3": KH1LocationData("100 Acre Wood", 265_6353, "Static"), + "100 Acre Wood Convert Torn Page 4": KH1LocationData("100 Acre Wood", 265_6354, "Reward"), + "100 Acre Wood Convert Torn Page 5": KH1LocationData("100 Acre Wood", 265_6355, "Reward"), + "100 Acre Wood Pooh's House Start Fire": KH1LocationData("100 Acre Wood", 265_6356, "Static"), + "100 Acre Wood Pooh's Room Cabinet": KH1LocationData("100 Acre Wood", 265_6357, "Static"), + "100 Acre Wood Pooh's Room Chimney": KH1LocationData("100 Acre Wood", 265_6358, "Static"), + "100 Acre Wood Bouncing Spot Break Log": KH1LocationData("100 Acre Wood", 265_6359, "Static"), + "100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh": KH1LocationData("100 Acre Wood", 265_6360, "Static"), + "Deep Jungle Camp Hi-Potion Experiment": KH1LocationData("Deep Jungle", 265_6361, "Static"), + "Deep Jungle Camp Ether Experiment": KH1LocationData("Deep Jungle", 265_6362, "Static"), + "Deep Jungle Camp Replication Experiment": KH1LocationData("Deep Jungle", 265_6363, "Static"), + "Deep Jungle Cliff Save Gorillas": KH1LocationData("Deep Jungle", 265_6364, "Static"), + "Deep Jungle Tree House Save Gorillas": KH1LocationData("Deep Jungle", 265_6365, "Static"), + "Deep Jungle Camp Save Gorillas": KH1LocationData("Deep Jungle", 265_6366, "Static"), + "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Deep Jungle", 265_6367, "Static"), + "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Deep Jungle", 265_6368, "Static"), + "Olympus Coliseum Olympia Chest": KH1LocationData("Olympus Coliseum", 265_6369, "Reward", True), + "Deep Jungle Jungle Slider 10 Fruits": KH1LocationData("Deep Jungle", 265_6370, "Reward", True), + "Deep Jungle Jungle Slider 20 Fruits": KH1LocationData("Deep Jungle", 265_6371, "Reward", True), + "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Deep Jungle", 265_6372, "Reward", True), + "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Deep Jungle", 265_6373, "Reward", True), + "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Deep Jungle", 265_6374, "Reward", True), + #"Traverse Town 1st District Speak with Cid Event": KH1LocationData("Traverse Town", 265_6375, "Static"), + "Wonderland Bizarre Room Read Book": KH1LocationData("Wonderland", 265_6376, "Static"), + "Olympus Coliseum Coliseum Gates Green Trinity": KH1LocationData("Olympus Coliseum", 265_6377, "Static"), + "Agrabah Defeat Kurt Zisa Zantetsuken Event": KH1LocationData("Agrabah", 265_6378, "Reward", True), + "Hollow Bastion Defeat Unknown EXP Necklace Event": KH1LocationData("Hollow Bastion", 265_6379, "Reward", True), + "Olympus Coliseum Coliseum Gates Hero's License Event": KH1LocationData("Olympus Coliseum", 265_6380, "Static", True), + "Atlantica Sunken Ship Crystal Trident Event": KH1LocationData("Atlantica", 265_6381, "Static"), + "Halloween Town Graveyard Forget-Me-Not Event": KH1LocationData("Halloween Town", 265_6382, "Static"), + "Deep Jungle Tent Protect-G Event": KH1LocationData("Deep Jungle", 265_6383, "Static"), + "Deep Jungle Cavern of Hearts Navi-G Piece Event": KH1LocationData("Deep Jungle", 265_6384, "Static", True), + "Wonderland Bizarre Room Navi-G Piece Event": KH1LocationData("Wonderland", 265_6385, "Static", True), + "Olympus Coliseum Coliseum Gates Entry Pass Event": KH1LocationData("Olympus Coliseum", 265_6386, "Static"), - "Traverse Town Synth Log": KH1LocationData("Traverse Town", 265_6401), - "Traverse Town Synth Cloth": KH1LocationData("Traverse Town", 265_6402), - "Traverse Town Synth Rope": KH1LocationData("Traverse Town", 265_6403), - "Traverse Town Synth Seagull Egg": KH1LocationData("Traverse Town", 265_6404), - "Traverse Town Synth Fish": KH1LocationData("Traverse Town", 265_6405), - "Traverse Town Synth Mushroom": KH1LocationData("Traverse Town", 265_6406), + "Traverse Town Synth 15 Items": KH1LocationData("Traverse Town", 265_6400, "Reward"), + "Traverse Town Synth Item 01": KH1LocationData("Traverse Town", 265_6401, "Synth"), + "Traverse Town Synth Item 02": KH1LocationData("Traverse Town", 265_6402, "Synth"), + "Traverse Town Synth Item 03": KH1LocationData("Traverse Town", 265_6403, "Synth"), + "Traverse Town Synth Item 04": KH1LocationData("Traverse Town", 265_6404, "Synth"), + "Traverse Town Synth Item 05": KH1LocationData("Traverse Town", 265_6405, "Synth"), + "Traverse Town Synth Item 06": KH1LocationData("Traverse Town", 265_6406, "Synth"), + "Traverse Town Synth Item 06": KH1LocationData("Traverse Town", 265_6406, "Synth"), + "Traverse Town Synth Item 07": KH1LocationData("Traverse Town", 265_6407, "Synth"), + "Traverse Town Synth Item 08": KH1LocationData("Traverse Town", 265_6408, "Synth"), + "Traverse Town Synth Item 09": KH1LocationData("Traverse Town", 265_6409, "Synth"), + "Traverse Town Synth Item 10": KH1LocationData("Traverse Town", 265_6410, "Synth"), + "Traverse Town Synth Item 11": KH1LocationData("Traverse Town", 265_6411, "Synth"), + "Traverse Town Synth Item 12": KH1LocationData("Traverse Town", 265_6412, "Synth"), + "Traverse Town Synth Item 13": KH1LocationData("Traverse Town", 265_6413, "Synth"), + "Traverse Town Synth Item 14": KH1LocationData("Traverse Town", 265_6414, "Synth"), + "Traverse Town Synth Item 15": KH1LocationData("Traverse Town", 265_6415, "Synth"), + "Traverse Town Synth Item 16": KH1LocationData("Traverse Town", 265_6416, "Synth"), + "Traverse Town Synth Item 17": KH1LocationData("Traverse Town", 265_6417, "Synth"), + "Traverse Town Synth Item 18": KH1LocationData("Traverse Town", 265_6418, "Synth"), + "Traverse Town Synth Item 19": KH1LocationData("Traverse Town", 265_6419, "Synth"), + "Traverse Town Synth Item 20": KH1LocationData("Traverse Town", 265_6420, "Synth"), + "Traverse Town Synth Item 21": KH1LocationData("Traverse Town", 265_6421, "Synth"), + "Traverse Town Synth Item 22": KH1LocationData("Traverse Town", 265_6422, "Synth"), + "Traverse Town Synth Item 23": KH1LocationData("Traverse Town", 265_6423, "Synth"), + "Traverse Town Synth Item 24": KH1LocationData("Traverse Town", 265_6424, "Synth"), + "Traverse Town Synth Item 25": KH1LocationData("Traverse Town", 265_6425, "Synth"), + "Traverse Town Synth Item 26": KH1LocationData("Traverse Town", 265_6426, "Synth"), + "Traverse Town Synth Item 27": KH1LocationData("Traverse Town", 265_6427, "Synth"), + "Traverse Town Synth Item 28": KH1LocationData("Traverse Town", 265_6428, "Synth"), + "Traverse Town Synth Item 29": KH1LocationData("Traverse Town", 265_6429, "Synth"), + "Traverse Town Synth Item 30": KH1LocationData("Traverse Town", 265_6430, "Synth"), + "Traverse Town Synth Item 31": KH1LocationData("Traverse Town", 265_6431, "Synth"), + "Traverse Town Synth Item 32": KH1LocationData("Traverse Town", 265_6432, "Synth"), + "Traverse Town Synth Item 33": KH1LocationData("Traverse Town", 265_6433, "Synth"), - "Traverse Town Item Shop Postcard": KH1LocationData("Traverse Town", 265_6500), - "Traverse Town 1st District Safe Postcard": KH1LocationData("Traverse Town", 265_6501), - "Traverse Town Gizmo Shop Postcard 1": KH1LocationData("Traverse Town", 265_6502), - "Traverse Town Gizmo Shop Postcard 2": KH1LocationData("Traverse Town", 265_6503), - "Traverse Town Item Workshop Postcard": KH1LocationData("Traverse Town", 265_6504), - "Traverse Town 3rd District Balcony Postcard": KH1LocationData("Traverse Town", 265_6505), - "Traverse Town Geppetto's House Postcard": KH1LocationData("Traverse Town", 265_6506), - "Halloween Town Lab Torn Page": KH1LocationData("Halloween Town", 265_6508), - "Hollow Bastion Entrance Hall Emblem Piece (Flame)": KH1LocationData("Hollow Bastion", 265_6516), - "Hollow Bastion Entrance Hall Emblem Piece (Chest)": KH1LocationData("Hollow Bastion", 265_6517), - "Hollow Bastion Entrance Hall Emblem Piece (Statue)": KH1LocationData("Hollow Bastion", 265_6518), - "Hollow Bastion Entrance Hall Emblem Piece (Fountain)": KH1LocationData("Hollow Bastion", 265_6519), - #"Traverse Town 1st District Leon Gift": KH1LocationData("Traverse Town", 265_6520), - #"Traverse Town 1st District Aerith Gift": KH1LocationData("Traverse Town", 265_6521), - "Hollow Bastion Library Speak to Belle Divine Rose": KH1LocationData("Hollow Bastion", 265_6522), - "Hollow Bastion Library Speak to Aerith Cure": KH1LocationData("Hollow Bastion", 265_6523), + "Traverse Town Item Shop Postcard": KH1LocationData("Traverse Town", 265_6500, "Static"), + "Traverse Town 1st District Safe Postcard": KH1LocationData("Traverse Town", 265_6501, "Static"), + "Traverse Town Gizmo Shop Postcard 1": KH1LocationData("Traverse Town", 265_6502, "Static"), + "Traverse Town Gizmo Shop Postcard 2": KH1LocationData("Traverse Town", 265_6503, "Static"), + "Traverse Town Item Workshop Postcard": KH1LocationData("Traverse Town", 265_6504, "Static"), + "Traverse Town 3rd District Balcony Postcard": KH1LocationData("Traverse Town", 265_6505, "Static"), + "Traverse Town Geppetto's House Postcard": KH1LocationData("Traverse Town", 265_6506, "Static", True), + "Halloween Town Lab Torn Page": KH1LocationData("Halloween Town", 265_6508, "Static"), + "Hollow Bastion Entrance Hall Emblem Piece (Flame)": KH1LocationData("Hollow Bastion", 265_6516, "Static", True), + "Hollow Bastion Entrance Hall Emblem Piece (Chest)": KH1LocationData("Hollow Bastion", 265_6517, "Static", True), + "Hollow Bastion Entrance Hall Emblem Piece (Statue)": KH1LocationData("Hollow Bastion", 265_6518, "Static", True), + "Hollow Bastion Entrance Hall Emblem Piece (Fountain)": KH1LocationData("Hollow Bastion", 265_6519, "Static", True), + "Traverse Town 1st District Leon Gift": KH1LocationData("Traverse Town", 265_6520, "Reward"), + #"Traverse Town 1st District Aerith Gift": KH1LocationData("Traverse Town", 265_6521, "Reward"), + "Hollow Bastion Library Speak to Belle Divine Rose": KH1LocationData("Hollow Bastion", 265_6522, "Reward", True), + "Hollow Bastion Library Speak to Aerith Cure": KH1LocationData("Hollow Bastion", 265_6523, "Static", True), - "Agrabah Defeat Jafar Genie Ansem's Report 1": KH1LocationData("Agrabah", 265_7018), - "Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Hollow Bastion", 265_7017), - "Atlantica Defeat Ursula II Ansem's Report 3": KH1LocationData("Atlantica", 265_7016), - "Hollow Bastion Speak with Aerith Ansem's Report 4": KH1LocationData("Hollow Bastion", 265_7015), - "Hollow Bastion Defeat Maleficent Ansem's Report 5": KH1LocationData("Hollow Bastion", 265_7014), - "Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Hollow Bastion", 265_7013), - "Halloween Town Defeat Oogie Boogie Ansem's Report 7": KH1LocationData("Halloween Town", 265_7012), - "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Olympus Coliseum", 265_7011), - "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Neverland", 265_7028), - "Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Hollow Bastion", 265_7027), - "Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Agrabah", 265_7026), - "Olympus Coliseum Defeat Sephiroth Ansem's Report 12": KH1LocationData("Olympus Coliseum", 265_7025), - "Hollow Bastion Defeat Unknown Ansem's Report 13": KH1LocationData("Hollow Bastion", 265_7024), - "Level 001": KH1LocationData("Levels", 265_8001), - "Level 002": KH1LocationData("Levels", 265_8002), - "Level 003": KH1LocationData("Levels", 265_8003), - "Level 004": KH1LocationData("Levels", 265_8004), - "Level 005": KH1LocationData("Levels", 265_8005), - "Level 006": KH1LocationData("Levels", 265_8006), - "Level 007": KH1LocationData("Levels", 265_8007), - "Level 008": KH1LocationData("Levels", 265_8008), - "Level 009": KH1LocationData("Levels", 265_8009), - "Level 010": KH1LocationData("Levels", 265_8010), - "Level 011": KH1LocationData("Levels", 265_8011), - "Level 012": KH1LocationData("Levels", 265_8012), - "Level 013": KH1LocationData("Levels", 265_8013), - "Level 014": KH1LocationData("Levels", 265_8014), - "Level 015": KH1LocationData("Levels", 265_8015), - "Level 016": KH1LocationData("Levels", 265_8016), - "Level 017": KH1LocationData("Levels", 265_8017), - "Level 018": KH1LocationData("Levels", 265_8018), - "Level 019": KH1LocationData("Levels", 265_8019), - "Level 020": KH1LocationData("Levels", 265_8020), - "Level 021": KH1LocationData("Levels", 265_8021), - "Level 022": KH1LocationData("Levels", 265_8022), - "Level 023": KH1LocationData("Levels", 265_8023), - "Level 024": KH1LocationData("Levels", 265_8024), - "Level 025": KH1LocationData("Levels", 265_8025), - "Level 026": KH1LocationData("Levels", 265_8026), - "Level 027": KH1LocationData("Levels", 265_8027), - "Level 028": KH1LocationData("Levels", 265_8028), - "Level 029": KH1LocationData("Levels", 265_8029), - "Level 030": KH1LocationData("Levels", 265_8030), - "Level 031": KH1LocationData("Levels", 265_8031), - "Level 032": KH1LocationData("Levels", 265_8032), - "Level 033": KH1LocationData("Levels", 265_8033), - "Level 034": KH1LocationData("Levels", 265_8034), - "Level 035": KH1LocationData("Levels", 265_8035), - "Level 036": KH1LocationData("Levels", 265_8036), - "Level 037": KH1LocationData("Levels", 265_8037), - "Level 038": KH1LocationData("Levels", 265_8038), - "Level 039": KH1LocationData("Levels", 265_8039), - "Level 040": KH1LocationData("Levels", 265_8040), - "Level 041": KH1LocationData("Levels", 265_8041), - "Level 042": KH1LocationData("Levels", 265_8042), - "Level 043": KH1LocationData("Levels", 265_8043), - "Level 044": KH1LocationData("Levels", 265_8044), - "Level 045": KH1LocationData("Levels", 265_8045), - "Level 046": KH1LocationData("Levels", 265_8046), - "Level 047": KH1LocationData("Levels", 265_8047), - "Level 048": KH1LocationData("Levels", 265_8048), - "Level 049": KH1LocationData("Levels", 265_8049), - "Level 050": KH1LocationData("Levels", 265_8050), - "Level 051": KH1LocationData("Levels", 265_8051), - "Level 052": KH1LocationData("Levels", 265_8052), - "Level 053": KH1LocationData("Levels", 265_8053), - "Level 054": KH1LocationData("Levels", 265_8054), - "Level 055": KH1LocationData("Levels", 265_8055), - "Level 056": KH1LocationData("Levels", 265_8056), - "Level 057": KH1LocationData("Levels", 265_8057), - "Level 058": KH1LocationData("Levels", 265_8058), - "Level 059": KH1LocationData("Levels", 265_8059), - "Level 060": KH1LocationData("Levels", 265_8060), - "Level 061": KH1LocationData("Levels", 265_8061), - "Level 062": KH1LocationData("Levels", 265_8062), - "Level 063": KH1LocationData("Levels", 265_8063), - "Level 064": KH1LocationData("Levels", 265_8064), - "Level 065": KH1LocationData("Levels", 265_8065), - "Level 066": KH1LocationData("Levels", 265_8066), - "Level 067": KH1LocationData("Levels", 265_8067), - "Level 068": KH1LocationData("Levels", 265_8068), - "Level 069": KH1LocationData("Levels", 265_8069), - "Level 070": KH1LocationData("Levels", 265_8070), - "Level 071": KH1LocationData("Levels", 265_8071), - "Level 072": KH1LocationData("Levels", 265_8072), - "Level 073": KH1LocationData("Levels", 265_8073), - "Level 074": KH1LocationData("Levels", 265_8074), - "Level 075": KH1LocationData("Levels", 265_8075), - "Level 076": KH1LocationData("Levels", 265_8076), - "Level 077": KH1LocationData("Levels", 265_8077), - "Level 078": KH1LocationData("Levels", 265_8078), - "Level 079": KH1LocationData("Levels", 265_8079), - "Level 080": KH1LocationData("Levels", 265_8080), - "Level 081": KH1LocationData("Levels", 265_8081), - "Level 082": KH1LocationData("Levels", 265_8082), - "Level 083": KH1LocationData("Levels", 265_8083), - "Level 084": KH1LocationData("Levels", 265_8084), - "Level 085": KH1LocationData("Levels", 265_8085), - "Level 086": KH1LocationData("Levels", 265_8086), - "Level 087": KH1LocationData("Levels", 265_8087), - "Level 088": KH1LocationData("Levels", 265_8088), - "Level 089": KH1LocationData("Levels", 265_8089), - "Level 090": KH1LocationData("Levels", 265_8090), - "Level 091": KH1LocationData("Levels", 265_8091), - "Level 092": KH1LocationData("Levels", 265_8092), - "Level 093": KH1LocationData("Levels", 265_8093), - "Level 094": KH1LocationData("Levels", 265_8094), - "Level 095": KH1LocationData("Levels", 265_8095), - "Level 096": KH1LocationData("Levels", 265_8096), - "Level 097": KH1LocationData("Levels", 265_8097), - "Level 098": KH1LocationData("Levels", 265_8098), - "Level 099": KH1LocationData("Levels", 265_8099), - "Level 100": KH1LocationData("Levels", 265_8100), - "Complete Phil Cup": KH1LocationData("Olympus Coliseum", 265_9001), - "Complete Phil Cup Solo": KH1LocationData("Olympus Coliseum", 265_9002), - "Complete Phil Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9003), - "Complete Pegasus Cup": KH1LocationData("Olympus Coliseum", 265_9004), - "Complete Pegasus Cup Solo": KH1LocationData("Olympus Coliseum", 265_9005), - "Complete Pegasus Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9006), - "Complete Hercules Cup": KH1LocationData("Olympus Coliseum", 265_9007), - "Complete Hercules Cup Solo": KH1LocationData("Olympus Coliseum", 265_9008), - "Complete Hercules Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9009), - "Complete Hades Cup": KH1LocationData("Olympus Coliseum", 265_9010), - "Complete Hades Cup Solo": KH1LocationData("Olympus Coliseum", 265_9011), - "Complete Hades Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9012), - "Hades Cup Defeat Cloud and Leon Event": KH1LocationData("Olympus Coliseum", 265_9013), - "Hades Cup Defeat Yuffie Event": KH1LocationData("Olympus Coliseum", 265_9014), - "Hades Cup Defeat Cerberus Event": KH1LocationData("Olympus Coliseum", 265_9015), - "Hades Cup Defeat Behemoth Event": KH1LocationData("Olympus Coliseum", 265_9016), - "Hades Cup Defeat Hades Event": KH1LocationData("Olympus Coliseum", 265_9017), - "Hercules Cup Defeat Cloud Event": KH1LocationData("Olympus Coliseum", 265_9018), - "Hercules Cup Yellow Trinity Event": KH1LocationData("Olympus Coliseum", 265_9019), - "Final Ansem": KH1LocationData("Final", 265_9999) + "Traverse Town 1st District Blue Trinity by Exit Door": KH1LocationData("Traverse Town", 265_6600, "Prize"), + "Traverse Town 3rd District Blue Trinity": KH1LocationData("Traverse Town", 265_6601, "Prize"), + "Traverse Town Magician's Study Blue Trinity": KH1LocationData("Traverse Town", 265_6602, "Prize"), + "Wonderland Lotus Forest Blue Trinity in Alcove": KH1LocationData("Wonderland", 265_6603, "Prize"), + "Wonderland Lotus Forest Blue Trinity by Moving Boulder": KH1LocationData("Wonderland", 265_6604, "Prize"), + "Agrabah Bazaar Blue Trinity": KH1LocationData("Agrabah", 265_6605, "Prize"), + "Monstro Mouth Blue Trinity": KH1LocationData("Monstro", 265_6606, "Prize", True), + "Monstro Chamber 5 Blue Trinity": KH1LocationData("Monstro", 265_6607, "Prize"), + "Hollow Bastion Great Crest Blue Trinity": KH1LocationData("Hollow Bastion", 265_6608, "Prize", True), + "Hollow Bastion Dungeon Blue Trinity": KH1LocationData("Hollow Bastion", 265_6609, "Prize", True), + "Deep Jungle Treetop Green Trinity": KH1LocationData("Deep Jungle", 265_6610, "Prize"), + "Agrabah Cave of Wonders Treasure Room Red Trinity": KH1LocationData("Agrabah", 265_6611, "Prize", True), + "Monstro Throat Blue Trinity": KH1LocationData("Monstro", 265_6612, "Prize", True), + "Wonderland Bizarre Room Examine Flower Pot": KH1LocationData("Wonderland", 265_6613, "Prize"), + "Wonderland Lotus Forest Red Flowers on the Main Path": KH1LocationData("Wonderland", 265_6614, "Prize"), + "Wonderland Lotus Forest Yellow Flowers in Middle Clearing and Through Painting": KH1LocationData("Wonderland", 265_6615, "Prize"), + "Wonderland Lotus Forest Yellow Elixir Flower Through Painting": KH1LocationData("Wonderland", 265_6616, "Prize"), + "Wonderland Lotus Forest Red Flower Raise Lily Pads": KH1LocationData("Wonderland", 265_6617, "Prize"), + "Wonderland Tea Party Garden Left Cushioned Chair": KH1LocationData("Wonderland", 265_6618, "Prize"), + "Wonderland Tea Party Garden Left Pink Chair": KH1LocationData("Wonderland", 265_6619, "Prize"), + "Wonderland Tea Party Garden Right Yellow Chair": KH1LocationData("Wonderland", 265_6620, "Prize"), + "Wonderland Tea Party Garden Left Gray Chair": KH1LocationData("Wonderland", 265_6621, "Prize"), + "Wonderland Tea Party Garden Right Brown Chair": KH1LocationData("Wonderland", 265_6622, "Prize"), + "Hollow Bastion Lift Stop from Waterway Examine Node": KH1LocationData("Hollow Bastion", 265_6623, "Prize", True), + + "Destiny Islands Seashore Capture Fish 1 (Day 2)": KH1LocationData("Destiny Islands", 265_6700, "Static"), + "Destiny Islands Seashore Capture Fish 2 (Day 2)": KH1LocationData("Destiny Islands", 265_6701, "Static"), + "Destiny Islands Seashore Capture Fish 3 (Day 2)": KH1LocationData("Destiny Islands", 265_6702, "Static"), + "Destiny Islands Seashore Gather Seagull Egg (Day 2)": KH1LocationData("Destiny Islands", 265_6703, "Static"), + "Destiny Islands Seashore Log on Riku's Island (Day 1)": KH1LocationData("Destiny Islands", 265_6704, "Static"), + "Destiny Islands Seashore Log under Bridge (Day 1)": KH1LocationData("Destiny Islands", 265_6705, "Static"), + "Destiny Islands Seashore Gather Cloth (Day 1)": KH1LocationData("Destiny Islands", 265_6706, "Static"), + "Destiny Islands Seashore Gather Rope (Day 1)": KH1LocationData("Destiny Islands", 265_6707, "Static"), + #"Destiny Islands Seashore Deliver Kairi Items (Day 1)": KH1LocationData("Destiny Islands", 265_6710, "Static"), + "Destiny Islands Secret Place Gather Mushroom (Day 2)": KH1LocationData("Destiny Islands", 265_6711, "Static"), + "Destiny Islands Cove Gather Mushroom Near Zip Line (Day 2)": KH1LocationData("Destiny Islands", 265_6712, "Static"), + "Destiny Islands Cove Gather Mushroom in Small Cave (Day 2)": KH1LocationData("Destiny Islands", 265_6713, "Static"), + "Destiny Islands Cove Talk to Kairi (Day 2)": KH1LocationData("Destiny Islands", 265_6714, "Static"), + "Destiny Islands Gather Drinking Water (Day 2)": KH1LocationData("Destiny Islands", 265_6715, "Static"), + #"Destiny Islands Cove Deliver Kairi Items (Day 2)": KH1LocationData("Destiny Islands", 265_6716, "Static"), + + "Donald Starting Accessory 1": KH1LocationData("Traverse Town", 265_6800, "Starting Accessory"), + "Donald Starting Accessory 2": KH1LocationData("Traverse Town", 265_6801, "Starting Accessory"), + "Goofy Starting Accessory 1": KH1LocationData("Traverse Town", 265_6802, "Starting Accessory"), + "Goofy Starting Accessory 2": KH1LocationData("Traverse Town", 265_6803, "Starting Accessory"), + "Tarzan Starting Accessory 1": KH1LocationData("Deep Jungle", 265_6804, "Starting Accessory"), + "Aladdin Starting Accessory 1": KH1LocationData("Agrabah", 265_6805, "Starting Accessory"), + "Aladdin Starting Accessory 2": KH1LocationData("Agrabah", 265_6806, "Starting Accessory"), + "Ariel Starting Accessory 1": KH1LocationData("Atlantica", 265_6807, "Starting Accessory"), + "Ariel Starting Accessory 2": KH1LocationData("Atlantica", 265_6808, "Starting Accessory"), + "Ariel Starting Accessory 3": KH1LocationData("Atlantica", 265_6809, "Starting Accessory"), + "Jack Starting Accessory 1": KH1LocationData("Halloween Town", 265_6810, "Starting Accessory"), + "Jack Starting Accessory 2": KH1LocationData("Halloween Town", 265_6811, "Starting Accessory"), + "Peter Pan Starting Accessory 1": KH1LocationData("Neverland", 265_6812, "Starting Accessory"), + "Peter Pan Starting Accessory 2": KH1LocationData("Neverland", 265_6813, "Starting Accessory"), + "Beast Starting Accessory 1": KH1LocationData("Hollow Bastion", 265_6814, "Starting Accessory"), + + "Agrabah Defeat Jafar Genie Ansem's Report 1": KH1LocationData("Agrabah", 265_7018, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Hollow Bastion", 265_7017, "Static", True), + "Atlantica Defeat Ursula II Ansem's Report 3": KH1LocationData("Atlantica", 265_7016, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 4": KH1LocationData("Hollow Bastion", 265_7015, "Static", True), + "Hollow Bastion Defeat Maleficent Ansem's Report 5": KH1LocationData("Hollow Bastion", 265_7014, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Hollow Bastion", 265_7013, "Static", True), + "Halloween Town Defeat Oogie Boogie Ansem's Report 7": KH1LocationData("Halloween Town", 265_7012, "Static", True), + "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Olympus Coliseum", 265_7011, "Static", True), + "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Neverland", 265_7028, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Hollow Bastion", 265_7027, "Static", True), + "Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Agrabah", 265_7026, "Static", True), + "Olympus Coliseum Defeat Sephiroth Ansem's Report 12": KH1LocationData("Olympus Coliseum", 265_7025, "Static", True), + "Hollow Bastion Defeat Unknown Ansem's Report 13": KH1LocationData("Hollow Bastion", 265_7024, "Static", True), + #"Level 001 (Slot 1)": KH1LocationData("Levels", 265_8001, "Level Slot 1"), + "Level 002 (Slot 1)": KH1LocationData("Levels", 265_8002, "Level Slot 1"), + "Level 003 (Slot 1)": KH1LocationData("Levels", 265_8003, "Level Slot 1"), + "Level 004 (Slot 1)": KH1LocationData("Levels", 265_8004, "Level Slot 1"), + "Level 005 (Slot 1)": KH1LocationData("Levels", 265_8005, "Level Slot 1"), + "Level 006 (Slot 1)": KH1LocationData("Levels", 265_8006, "Level Slot 1"), + "Level 007 (Slot 1)": KH1LocationData("Levels", 265_8007, "Level Slot 1"), + "Level 008 (Slot 1)": KH1LocationData("Levels", 265_8008, "Level Slot 1"), + "Level 009 (Slot 1)": KH1LocationData("Levels", 265_8009, "Level Slot 1"), + "Level 010 (Slot 1)": KH1LocationData("Levels", 265_8010, "Level Slot 1"), + "Level 011 (Slot 1)": KH1LocationData("Levels", 265_8011, "Level Slot 1"), + "Level 012 (Slot 1)": KH1LocationData("Levels", 265_8012, "Level Slot 1"), + "Level 013 (Slot 1)": KH1LocationData("Levels", 265_8013, "Level Slot 1"), + "Level 014 (Slot 1)": KH1LocationData("Levels", 265_8014, "Level Slot 1"), + "Level 015 (Slot 1)": KH1LocationData("Levels", 265_8015, "Level Slot 1"), + "Level 016 (Slot 1)": KH1LocationData("Levels", 265_8016, "Level Slot 1"), + "Level 017 (Slot 1)": KH1LocationData("Levels", 265_8017, "Level Slot 1"), + "Level 018 (Slot 1)": KH1LocationData("Levels", 265_8018, "Level Slot 1"), + "Level 019 (Slot 1)": KH1LocationData("Levels", 265_8019, "Level Slot 1"), + "Level 020 (Slot 1)": KH1LocationData("Levels", 265_8020, "Level Slot 1"), + "Level 021 (Slot 1)": KH1LocationData("Levels", 265_8021, "Level Slot 1"), + "Level 022 (Slot 1)": KH1LocationData("Levels", 265_8022, "Level Slot 1"), + "Level 023 (Slot 1)": KH1LocationData("Levels", 265_8023, "Level Slot 1"), + "Level 024 (Slot 1)": KH1LocationData("Levels", 265_8024, "Level Slot 1"), + "Level 025 (Slot 1)": KH1LocationData("Levels", 265_8025, "Level Slot 1"), + "Level 026 (Slot 1)": KH1LocationData("Levels", 265_8026, "Level Slot 1"), + "Level 027 (Slot 1)": KH1LocationData("Levels", 265_8027, "Level Slot 1"), + "Level 028 (Slot 1)": KH1LocationData("Levels", 265_8028, "Level Slot 1"), + "Level 029 (Slot 1)": KH1LocationData("Levels", 265_8029, "Level Slot 1"), + "Level 030 (Slot 1)": KH1LocationData("Levels", 265_8030, "Level Slot 1"), + "Level 031 (Slot 1)": KH1LocationData("Levels", 265_8031, "Level Slot 1"), + "Level 032 (Slot 1)": KH1LocationData("Levels", 265_8032, "Level Slot 1"), + "Level 033 (Slot 1)": KH1LocationData("Levels", 265_8033, "Level Slot 1"), + "Level 034 (Slot 1)": KH1LocationData("Levels", 265_8034, "Level Slot 1"), + "Level 035 (Slot 1)": KH1LocationData("Levels", 265_8035, "Level Slot 1"), + "Level 036 (Slot 1)": KH1LocationData("Levels", 265_8036, "Level Slot 1"), + "Level 037 (Slot 1)": KH1LocationData("Levels", 265_8037, "Level Slot 1"), + "Level 038 (Slot 1)": KH1LocationData("Levels", 265_8038, "Level Slot 1"), + "Level 039 (Slot 1)": KH1LocationData("Levels", 265_8039, "Level Slot 1"), + "Level 040 (Slot 1)": KH1LocationData("Levels", 265_8040, "Level Slot 1"), + "Level 041 (Slot 1)": KH1LocationData("Levels", 265_8041, "Level Slot 1"), + "Level 042 (Slot 1)": KH1LocationData("Levels", 265_8042, "Level Slot 1"), + "Level 043 (Slot 1)": KH1LocationData("Levels", 265_8043, "Level Slot 1"), + "Level 044 (Slot 1)": KH1LocationData("Levels", 265_8044, "Level Slot 1"), + "Level 045 (Slot 1)": KH1LocationData("Levels", 265_8045, "Level Slot 1"), + "Level 046 (Slot 1)": KH1LocationData("Levels", 265_8046, "Level Slot 1"), + "Level 047 (Slot 1)": KH1LocationData("Levels", 265_8047, "Level Slot 1"), + "Level 048 (Slot 1)": KH1LocationData("Levels", 265_8048, "Level Slot 1"), + "Level 049 (Slot 1)": KH1LocationData("Levels", 265_8049, "Level Slot 1"), + "Level 050 (Slot 1)": KH1LocationData("Levels", 265_8050, "Level Slot 1"), + "Level 051 (Slot 1)": KH1LocationData("Levels", 265_8051, "Level Slot 1"), + "Level 052 (Slot 1)": KH1LocationData("Levels", 265_8052, "Level Slot 1"), + "Level 053 (Slot 1)": KH1LocationData("Levels", 265_8053, "Level Slot 1"), + "Level 054 (Slot 1)": KH1LocationData("Levels", 265_8054, "Level Slot 1"), + "Level 055 (Slot 1)": KH1LocationData("Levels", 265_8055, "Level Slot 1"), + "Level 056 (Slot 1)": KH1LocationData("Levels", 265_8056, "Level Slot 1"), + "Level 057 (Slot 1)": KH1LocationData("Levels", 265_8057, "Level Slot 1"), + "Level 058 (Slot 1)": KH1LocationData("Levels", 265_8058, "Level Slot 1"), + "Level 059 (Slot 1)": KH1LocationData("Levels", 265_8059, "Level Slot 1"), + "Level 060 (Slot 1)": KH1LocationData("Levels", 265_8060, "Level Slot 1"), + "Level 061 (Slot 1)": KH1LocationData("Levels", 265_8061, "Level Slot 1"), + "Level 062 (Slot 1)": KH1LocationData("Levels", 265_8062, "Level Slot 1"), + "Level 063 (Slot 1)": KH1LocationData("Levels", 265_8063, "Level Slot 1"), + "Level 064 (Slot 1)": KH1LocationData("Levels", 265_8064, "Level Slot 1"), + "Level 065 (Slot 1)": KH1LocationData("Levels", 265_8065, "Level Slot 1"), + "Level 066 (Slot 1)": KH1LocationData("Levels", 265_8066, "Level Slot 1"), + "Level 067 (Slot 1)": KH1LocationData("Levels", 265_8067, "Level Slot 1"), + "Level 068 (Slot 1)": KH1LocationData("Levels", 265_8068, "Level Slot 1"), + "Level 069 (Slot 1)": KH1LocationData("Levels", 265_8069, "Level Slot 1"), + "Level 070 (Slot 1)": KH1LocationData("Levels", 265_8070, "Level Slot 1"), + "Level 071 (Slot 1)": KH1LocationData("Levels", 265_8071, "Level Slot 1"), + "Level 072 (Slot 1)": KH1LocationData("Levels", 265_8072, "Level Slot 1"), + "Level 073 (Slot 1)": KH1LocationData("Levels", 265_8073, "Level Slot 1"), + "Level 074 (Slot 1)": KH1LocationData("Levels", 265_8074, "Level Slot 1"), + "Level 075 (Slot 1)": KH1LocationData("Levels", 265_8075, "Level Slot 1"), + "Level 076 (Slot 1)": KH1LocationData("Levels", 265_8076, "Level Slot 1"), + "Level 077 (Slot 1)": KH1LocationData("Levels", 265_8077, "Level Slot 1"), + "Level 078 (Slot 1)": KH1LocationData("Levels", 265_8078, "Level Slot 1"), + "Level 079 (Slot 1)": KH1LocationData("Levels", 265_8079, "Level Slot 1"), + "Level 080 (Slot 1)": KH1LocationData("Levels", 265_8080, "Level Slot 1"), + "Level 081 (Slot 1)": KH1LocationData("Levels", 265_8081, "Level Slot 1"), + "Level 082 (Slot 1)": KH1LocationData("Levels", 265_8082, "Level Slot 1"), + "Level 083 (Slot 1)": KH1LocationData("Levels", 265_8083, "Level Slot 1"), + "Level 084 (Slot 1)": KH1LocationData("Levels", 265_8084, "Level Slot 1"), + "Level 085 (Slot 1)": KH1LocationData("Levels", 265_8085, "Level Slot 1"), + "Level 086 (Slot 1)": KH1LocationData("Levels", 265_8086, "Level Slot 1"), + "Level 087 (Slot 1)": KH1LocationData("Levels", 265_8087, "Level Slot 1"), + "Level 088 (Slot 1)": KH1LocationData("Levels", 265_8088, "Level Slot 1"), + "Level 089 (Slot 1)": KH1LocationData("Levels", 265_8089, "Level Slot 1"), + "Level 090 (Slot 1)": KH1LocationData("Levels", 265_8090, "Level Slot 1"), + "Level 091 (Slot 1)": KH1LocationData("Levels", 265_8091, "Level Slot 1"), + "Level 092 (Slot 1)": KH1LocationData("Levels", 265_8092, "Level Slot 1"), + "Level 093 (Slot 1)": KH1LocationData("Levels", 265_8093, "Level Slot 1"), + "Level 094 (Slot 1)": KH1LocationData("Levels", 265_8094, "Level Slot 1"), + "Level 095 (Slot 1)": KH1LocationData("Levels", 265_8095, "Level Slot 1"), + "Level 096 (Slot 1)": KH1LocationData("Levels", 265_8096, "Level Slot 1"), + "Level 097 (Slot 1)": KH1LocationData("Levels", 265_8097, "Level Slot 1"), + "Level 098 (Slot 1)": KH1LocationData("Levels", 265_8098, "Level Slot 1"), + "Level 099 (Slot 1)": KH1LocationData("Levels", 265_8099, "Level Slot 1"), + "Level 100 (Slot 1)": KH1LocationData("Levels", 265_8100, "Level Slot 1"), + #"Level 001 (Slot 2)": KH1LocationData("Levels", 265_8101, "Level Slot 2"), + "Level 002 (Slot 2)": KH1LocationData("Levels", 265_8102, "Level Slot 2"), + "Level 003 (Slot 2)": KH1LocationData("Levels", 265_8103, "Level Slot 2"), + "Level 004 (Slot 2)": KH1LocationData("Levels", 265_8104, "Level Slot 2"), + "Level 005 (Slot 2)": KH1LocationData("Levels", 265_8105, "Level Slot 2"), + "Level 006 (Slot 2)": KH1LocationData("Levels", 265_8106, "Level Slot 2"), + "Level 007 (Slot 2)": KH1LocationData("Levels", 265_8107, "Level Slot 2"), + "Level 008 (Slot 2)": KH1LocationData("Levels", 265_8108, "Level Slot 2"), + "Level 009 (Slot 2)": KH1LocationData("Levels", 265_8109, "Level Slot 2"), + "Level 010 (Slot 2)": KH1LocationData("Levels", 265_8110, "Level Slot 2"), + "Level 011 (Slot 2)": KH1LocationData("Levels", 265_8111, "Level Slot 2"), + "Level 012 (Slot 2)": KH1LocationData("Levels", 265_8112, "Level Slot 2"), + "Level 013 (Slot 2)": KH1LocationData("Levels", 265_8113, "Level Slot 2"), + "Level 014 (Slot 2)": KH1LocationData("Levels", 265_8114, "Level Slot 2"), + "Level 015 (Slot 2)": KH1LocationData("Levels", 265_8115, "Level Slot 2"), + "Level 016 (Slot 2)": KH1LocationData("Levels", 265_8116, "Level Slot 2"), + "Level 017 (Slot 2)": KH1LocationData("Levels", 265_8117, "Level Slot 2"), + "Level 018 (Slot 2)": KH1LocationData("Levels", 265_8118, "Level Slot 2"), + "Level 019 (Slot 2)": KH1LocationData("Levels", 265_8119, "Level Slot 2"), + "Level 020 (Slot 2)": KH1LocationData("Levels", 265_8120, "Level Slot 2"), + "Level 021 (Slot 2)": KH1LocationData("Levels", 265_8121, "Level Slot 2"), + "Level 022 (Slot 2)": KH1LocationData("Levels", 265_8122, "Level Slot 2"), + "Level 023 (Slot 2)": KH1LocationData("Levels", 265_8123, "Level Slot 2"), + "Level 024 (Slot 2)": KH1LocationData("Levels", 265_8124, "Level Slot 2"), + "Level 025 (Slot 2)": KH1LocationData("Levels", 265_8125, "Level Slot 2"), + "Level 026 (Slot 2)": KH1LocationData("Levels", 265_8126, "Level Slot 2"), + "Level 027 (Slot 2)": KH1LocationData("Levels", 265_8127, "Level Slot 2"), + "Level 028 (Slot 2)": KH1LocationData("Levels", 265_8128, "Level Slot 2"), + "Level 029 (Slot 2)": KH1LocationData("Levels", 265_8129, "Level Slot 2"), + "Level 030 (Slot 2)": KH1LocationData("Levels", 265_8130, "Level Slot 2"), + "Level 031 (Slot 2)": KH1LocationData("Levels", 265_8131, "Level Slot 2"), + "Level 032 (Slot 2)": KH1LocationData("Levels", 265_8132, "Level Slot 2"), + "Level 033 (Slot 2)": KH1LocationData("Levels", 265_8133, "Level Slot 2"), + "Level 034 (Slot 2)": KH1LocationData("Levels", 265_8134, "Level Slot 2"), + "Level 035 (Slot 2)": KH1LocationData("Levels", 265_8135, "Level Slot 2"), + "Level 036 (Slot 2)": KH1LocationData("Levels", 265_8136, "Level Slot 2"), + "Level 037 (Slot 2)": KH1LocationData("Levels", 265_8137, "Level Slot 2"), + "Level 038 (Slot 2)": KH1LocationData("Levels", 265_8138, "Level Slot 2"), + "Level 039 (Slot 2)": KH1LocationData("Levels", 265_8139, "Level Slot 2"), + "Level 040 (Slot 2)": KH1LocationData("Levels", 265_8140, "Level Slot 2"), + "Level 041 (Slot 2)": KH1LocationData("Levels", 265_8141, "Level Slot 2"), + "Level 042 (Slot 2)": KH1LocationData("Levels", 265_8142, "Level Slot 2"), + "Level 043 (Slot 2)": KH1LocationData("Levels", 265_8143, "Level Slot 2"), + "Level 044 (Slot 2)": KH1LocationData("Levels", 265_8144, "Level Slot 2"), + "Level 045 (Slot 2)": KH1LocationData("Levels", 265_8145, "Level Slot 2"), + "Level 046 (Slot 2)": KH1LocationData("Levels", 265_8146, "Level Slot 2"), + "Level 047 (Slot 2)": KH1LocationData("Levels", 265_8147, "Level Slot 2"), + "Level 048 (Slot 2)": KH1LocationData("Levels", 265_8148, "Level Slot 2"), + "Level 049 (Slot 2)": KH1LocationData("Levels", 265_8149, "Level Slot 2"), + "Level 050 (Slot 2)": KH1LocationData("Levels", 265_8150, "Level Slot 2"), + "Level 051 (Slot 2)": KH1LocationData("Levels", 265_8151, "Level Slot 2"), + "Level 052 (Slot 2)": KH1LocationData("Levels", 265_8152, "Level Slot 2"), + "Level 053 (Slot 2)": KH1LocationData("Levels", 265_8153, "Level Slot 2"), + "Level 054 (Slot 2)": KH1LocationData("Levels", 265_8154, "Level Slot 2"), + "Level 055 (Slot 2)": KH1LocationData("Levels", 265_8155, "Level Slot 2"), + "Level 056 (Slot 2)": KH1LocationData("Levels", 265_8156, "Level Slot 2"), + "Level 057 (Slot 2)": KH1LocationData("Levels", 265_8157, "Level Slot 2"), + "Level 058 (Slot 2)": KH1LocationData("Levels", 265_8158, "Level Slot 2"), + "Level 059 (Slot 2)": KH1LocationData("Levels", 265_8159, "Level Slot 2"), + "Level 060 (Slot 2)": KH1LocationData("Levels", 265_8160, "Level Slot 2"), + "Level 061 (Slot 2)": KH1LocationData("Levels", 265_8161, "Level Slot 2"), + "Level 062 (Slot 2)": KH1LocationData("Levels", 265_8162, "Level Slot 2"), + "Level 063 (Slot 2)": KH1LocationData("Levels", 265_8163, "Level Slot 2"), + "Level 064 (Slot 2)": KH1LocationData("Levels", 265_8164, "Level Slot 2"), + "Level 065 (Slot 2)": KH1LocationData("Levels", 265_8165, "Level Slot 2"), + "Level 066 (Slot 2)": KH1LocationData("Levels", 265_8166, "Level Slot 2"), + "Level 067 (Slot 2)": KH1LocationData("Levels", 265_8167, "Level Slot 2"), + "Level 068 (Slot 2)": KH1LocationData("Levels", 265_8168, "Level Slot 2"), + "Level 069 (Slot 2)": KH1LocationData("Levels", 265_8169, "Level Slot 2"), + "Level 070 (Slot 2)": KH1LocationData("Levels", 265_8170, "Level Slot 2"), + "Level 071 (Slot 2)": KH1LocationData("Levels", 265_8171, "Level Slot 2"), + "Level 072 (Slot 2)": KH1LocationData("Levels", 265_8172, "Level Slot 2"), + "Level 073 (Slot 2)": KH1LocationData("Levels", 265_8173, "Level Slot 2"), + "Level 074 (Slot 2)": KH1LocationData("Levels", 265_8174, "Level Slot 2"), + "Level 075 (Slot 2)": KH1LocationData("Levels", 265_8175, "Level Slot 2"), + "Level 076 (Slot 2)": KH1LocationData("Levels", 265_8176, "Level Slot 2"), + "Level 077 (Slot 2)": KH1LocationData("Levels", 265_8177, "Level Slot 2"), + "Level 078 (Slot 2)": KH1LocationData("Levels", 265_8178, "Level Slot 2"), + "Level 079 (Slot 2)": KH1LocationData("Levels", 265_8179, "Level Slot 2"), + "Level 080 (Slot 2)": KH1LocationData("Levels", 265_8180, "Level Slot 2"), + "Level 081 (Slot 2)": KH1LocationData("Levels", 265_8181, "Level Slot 2"), + "Level 082 (Slot 2)": KH1LocationData("Levels", 265_8182, "Level Slot 2"), + "Level 083 (Slot 2)": KH1LocationData("Levels", 265_8183, "Level Slot 2"), + "Level 084 (Slot 2)": KH1LocationData("Levels", 265_8184, "Level Slot 2"), + "Level 085 (Slot 2)": KH1LocationData("Levels", 265_8185, "Level Slot 2"), + "Level 086 (Slot 2)": KH1LocationData("Levels", 265_8186, "Level Slot 2"), + "Level 087 (Slot 2)": KH1LocationData("Levels", 265_8187, "Level Slot 2"), + "Level 088 (Slot 2)": KH1LocationData("Levels", 265_8188, "Level Slot 2"), + "Level 089 (Slot 2)": KH1LocationData("Levels", 265_8189, "Level Slot 2"), + "Level 090 (Slot 2)": KH1LocationData("Levels", 265_8190, "Level Slot 2"), + "Level 091 (Slot 2)": KH1LocationData("Levels", 265_8191, "Level Slot 2"), + "Level 092 (Slot 2)": KH1LocationData("Levels", 265_8192, "Level Slot 2"), + "Level 093 (Slot 2)": KH1LocationData("Levels", 265_8193, "Level Slot 2"), + "Level 094 (Slot 2)": KH1LocationData("Levels", 265_8194, "Level Slot 2"), + "Level 095 (Slot 2)": KH1LocationData("Levels", 265_8195, "Level Slot 2"), + "Level 096 (Slot 2)": KH1LocationData("Levels", 265_8196, "Level Slot 2"), + "Level 097 (Slot 2)": KH1LocationData("Levels", 265_8197, "Level Slot 2"), + "Level 098 (Slot 2)": KH1LocationData("Levels", 265_8198, "Level Slot 2"), + "Level 099 (Slot 2)": KH1LocationData("Levels", 265_8199, "Level Slot 2"), + "Level 100 (Slot 2)": KH1LocationData("Levels", 265_8200, "Level Slot 2"), + "Complete Phil Cup": KH1LocationData("Olympus Coliseum", 265_9001, "Static", True), + "Complete Phil Cup Solo": KH1LocationData("Olympus Coliseum", 265_9002, "Reward", True), + "Complete Phil Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9003, "Reward", True), + "Complete Pegasus Cup": KH1LocationData("Olympus Coliseum", 265_9004, "Reward", True), + "Complete Pegasus Cup Solo": KH1LocationData("Olympus Coliseum", 265_9005, "Reward", True), + "Complete Pegasus Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9006, "Reward", True), + "Complete Hercules Cup": KH1LocationData("Olympus Coliseum", 265_9007, "Reward", True), + "Complete Hercules Cup Solo": KH1LocationData("Olympus Coliseum", 265_9008, "Reward", True), + "Complete Hercules Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9009, "Reward", True), + "Complete Hades Cup": KH1LocationData("Olympus Coliseum", 265_9010, "Reward", True), + "Complete Hades Cup Solo": KH1LocationData("Olympus Coliseum", 265_9011, "Reward", True), + "Complete Hades Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9012, "Reward", True), + "Hades Cup Defeat Cloud and Leon Event": KH1LocationData("Olympus Coliseum", 265_9013, "Reward", True), + "Hades Cup Defeat Yuffie Event": KH1LocationData("Olympus Coliseum", 265_9014, "Reward", True), + "Hades Cup Defeat Cerberus Event": KH1LocationData("Olympus Coliseum", 265_9015, "Static", True), + "Hades Cup Defeat Behemoth Event": KH1LocationData("Olympus Coliseum", 265_9016, "Static", True), + "Hades Cup Defeat Hades Event": KH1LocationData("Olympus Coliseum", 265_9017, "Static", True), + "Hercules Cup Defeat Cloud Event": KH1LocationData("Olympus Coliseum", 265_9018, "Reward", True), + "Hercules Cup Yellow Trinity Event": KH1LocationData("Olympus Coliseum", 265_9019, "Static", True) } -event_location_table: Dict[str, KH1LocationData] = {} +event_location_table: Dict[str, KH1LocationData] = { + "Final Ansem": KH1LocationData("Homecoming", 265_9999, "None", True) +} lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in location_table.items() if data.code} diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 7a79d5c1..1bdc478a 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -6,8 +6,9 @@ class StrengthIncrease(Range): """ Determines the number of Strength Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "STR Increases" range_start = 0 @@ -18,8 +19,9 @@ class DefenseIncrease(Range): """ Determines the number of Defense Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "DEF Increases" range_start = 0 @@ -30,8 +32,9 @@ class HPIncrease(Range): """ Determines the number of HP Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "HP Increases" range_start = 0 @@ -42,8 +45,9 @@ class APIncrease(Range): """ Determines the number of AP Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "AP Increases" range_start = 0 @@ -54,8 +58,9 @@ class MPIncrease(Range): """ Determines the number of MP Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "MP Increases" range_start = 0 @@ -66,8 +71,9 @@ class AccessorySlotIncrease(Range): """ Determines the number of Accessory Slot Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "Accessory Slot Increases" range_start = 0 @@ -78,8 +84,9 @@ class ItemSlotIncrease(Range): """ Determines the number of Item Slot Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "Item Slot Increases" range_start = 0 @@ -104,29 +111,45 @@ class SuperBosses(Toggle): """ display_name = "Super Bosses" -class Cups(Toggle): +class Cups(Choice): """ - Toggle whether to include checks behind completing Phil, Pegasus, Hercules, or Hades cups. - Please note that the cup items will still appear in the multiworld even if toggled off, as they are required to challenge Sephiroth. + Determines which cups have their locations added to the multiworld. + + Please note that the cup items will still appear in the multiworld even if set to off, as they are required to challenge Sephiroth. + + Off: All cup locations are removed + + Cups: Phil, Pegasus, and Hercules cups are included + + Hades Cup: Hades Cup is included in addition to Phil, Pegasus, and Hercules cups. If Super Bosses are enabled, then Ice Titan is included """ display_name = "Cups" + option_off = 0 + option_cups = 1 + option_hades_cup = 2 + default = 0 -class Goal(Choice): +class FinalRestDoorKey(Choice): """ - Determines when victory is achieved in your playthrough. + Determines what grants the player the Final Rest Door Key. Sephiroth: Defeat Sephiroth + Unknown: Defeat Unknown - Postcards: Turn in all 10 postcards in Traverse Town + + Postcards: Turn in an amount of postcards in Traverse Town + Final Ansem: Enter End of the World and defeat Ansem as normal - Puppies: Rescue and return all 99 puppies in Traverse Town + + Puppies: Rescue and return an amount of puppies in Traverse Town + Final Rest: Open the chest in End of the World Final Rest """ - display_name = "Goal" + display_name = "Final Rest Door Key" option_sephiroth = 0 option_unknown = 1 option_postcards = 2 - option_final_ansem = 3 + option_lucky_emblems = 3 option_puppies = 4 option_final_rest = 5 default = 3 @@ -135,89 +158,115 @@ class EndoftheWorldUnlock(Choice): """Determines how End of the World is unlocked. Item: You can receive an item called "End of the World" which unlocks the world - Reports: A certain amount of reports are required to unlock End of the World, which is defined in your options""" + + Lucky Emblems: A certain amount of lucky emblems are required to unlock End of the World, which is defined in your options""" display_name = "End of the World Unlock" option_item = 0 - option_reports = 1 + option_lucky_emblems = 1 default = 1 -class FinalRestDoor(Choice): - """Determines what conditions need to be met to manifest the door in Final Rest, allowing the player to challenge Ansem. +class RequiredPostcards(Range): + """ + If "Final Rest Door Key" is set to "Postcards", defines how many postcards are required. + """ + display_name = "Required Postcards" + default = 8 + range_start = 1 + range_end = 10 + +class RequiredPuppies(Choice): + """ + If "Final Rest Door Key" is set to "Puppies", defines how many puppies are required. + """ + display_name = "Required Puppies" + default = 80 + option_10 = 10 + option_20 = 20 + option_30 = 30 + option_40 = 40 + option_50 = 50 + option_60 = 60 + option_70 = 70 + option_80 = 80 + option_90 = 90 + option_99 = 99 + +class PuppyValue(Range): + """ + Determines how many dalmatian puppies are given when a puppy item is found. + """ + display_name = "Puppy Value" + default = 3 + range_start = 1 + range_end = 99 + +class RandomizePuppies(DefaultOnToggle): + """ + If OFF, the "Puppy" item is worth 3 puppies and puppies are placed in vanilla locations. - Reports: A certain number of Ansem's Reports are required, determined by the "Reports to Open Final Rest Door" option - Puppies: Having all 99 puppies is required - Postcards: Turning in all 10 postcards is required - Superbosses: Defeating Sephiroth, Unknown, Kurt Zisa, and Phantom are required + If ON, the "Puppy" item is worth an amount of puppies defined by "Puppy Value", and are shuffled randomly. """ - display_name = "Final Rest Door" - option_reports = 0 - option_puppies = 1 - option_postcards = 2 - option_superbosses = 3 - -class Puppies(Choice): - """ - Determines how dalmatian puppies are shuffled into the pool. - Full: All puppies are in one location - Triplets: Puppies are found in triplets just as they are in the base game - Individual: One puppy can be found per location - """ - display_name = "Puppies" - option_full = 0 - option_triplets = 1 - option_individual = 2 - default = 1 + display_name = "Randomize Puppies" class EXPMultiplier(NamedRange): """ Determines the multiplier to apply to EXP gained. """ display_name = "EXP Multiplier" - default = 16 - range_start = default // 4 + default = 16 * 4 + range_start = 16 // 4 range_end = 128 special_range_names = { - "0.25x": int(default // 4), - "0.5x": int(default // 2), - "1x": default, - "2x": default * 2, - "3x": default * 3, - "4x": default * 4, - "8x": default * 8, + "0.25x": int(16 // 4), + "0.5x": int(16 // 2), + "1x": 16, + "2x": 16 * 2, + "3x": 16 * 3, + "4x": 16 * 4, + "8x": 16 * 8, } -class RequiredReportsEotW(Range): +class RequiredLuckyEmblemsEotW(Range): """ - If End of the World Unlock is set to "Reports", determines the number of Ansem's Reports required to open End of the World. + If End of the World Unlock is set to "Lucky Emblems", determines the number of Lucky Emblems required. """ - display_name = "Reports to Open End of the World" - default = 4 + display_name = "Lucky Emblems to Open End of the World" + default = 7 range_start = 0 - range_end = 13 + range_end = 20 -class RequiredReportsDoor(Range): +class RequiredLuckyEmblemsDoor(Range): """ - If Final Rest Door is set to "Reports", determines the number of Ansem's Reports required to manifest the door in Final Rest to challenge Ansem. + If Final Rest Door Key is set to "Lucky Emblems", determines the number of Lucky Emblems required. """ - display_name = "Reports to Open Final Rest Door" - default = 4 + display_name = "Lucky Emblems to Open Final Rest Door" + default = 10 range_start = 0 - range_end = 13 + range_end = 20 -class ReportsInPool(Range): +class LuckyEmblemsInPool(Range): """ - Determines the number of Ansem's Reports in the item pool. + Determines the number of Lucky Emblems in the item pool. """ - display_name = "Reports in Pool" - default = 4 + display_name = "Lucky Emblems in Pool" + default = 13 range_start = 0 - range_end = 13 + range_end = 20 -class RandomizeKeybladeStats(DefaultOnToggle): +class KeybladeStats(Choice): """ Determines whether Keyblade stats should be randomized. + + Randomize: Randomly generates STR and MP bonuses for each keyblade between the defined minimums and maximums. + + Shuffle: Shuffles the stats of the vanilla keyblades amongst each other. + + Vanilla: Keyblade stats are unchanged. """ - display_name = "Randomize Keyblade Stats" + display_name = "Keyblade Stats" + option_randomize = 0 + option_shuffle = 1 + option_vanilla = 2 class KeybladeMinStrength(Range): """ @@ -237,6 +286,60 @@ class KeybladeMaxStrength(Range): range_start = 0 range_end = 20 +class KeybladeMinCritRateBonus(Range): + """ + Determines the minimum Crit Rate bonus a keyblade can have. + """ + display_name = "Keyblade Minimum Crit Rate Bonus" + default = 0 + range_start = 0 + range_end = 200 + +class KeybladeMaxCritRateBonus(Range): + """ + Determines the maximum Crit Rate bonus a keyblade can have. + """ + display_name = "Keyblade Maximum Crit Rate Bonus" + default = 200 + range_start = 0 + range_end = 200 + +class KeybladeMinCritSTRBonus(Range): + """ + Determines the minimum Crit STR bonus a keyblade can have. + """ + display_name = "Keyblade Minimum Crit Rate Bonus" + default = 0 + range_start = 0 + range_end = 16 + +class KeybladeMaxCritSTRBonus(Range): + """ + Determines the maximum Crit STR bonus a keyblade can have. + """ + display_name = "Keyblade Maximum Crit Rate Bonus" + default = 16 + range_start = 0 + range_end = 16 + +class KeybladeMinRecoil(Range): + """ + Determines the minimum recoil a keyblade can have. + """ + display_name = "Keyblade Minimum Recoil" + default = 1 + range_start = 1 + range_end = 90 + +class KeybladeMaxRecoil(Range): + """ + Determines the maximum recoil a keyblade can have. + """ + display_name = "Keyblade Maximum Recoil" + default = 90 + range_start = 1 + range_end = 90 + class KeybladeMinMP(Range): """ Determines the minimum MP bonus a keyblade can have. @@ -260,31 +363,43 @@ class LevelChecks(Range): Determines the maximum level for which checks can be obtained. """ display_name = "Level Checks" - default = 100 + default = 99 range_start = 0 - range_end = 100 + range_end = 99 class ForceStatsOnLevels(NamedRange): """ If this value is less than the value for Level Checks, this determines the minimum level from which only stat ups are obtained at level up locations. - For example, if you want to be able to find any multiworld item from levels 1-50, then just stat ups for levels 51-100, set this value to 51. + + For example, if you want to be able to find any multiworld item from levels 2-50, then just stat ups for levels 51-100, set this value to 51. """ display_name = "Force Stats on Level Starting From" - default = 1 - range_start = 1 + default = 2 + range_start = 2 range_end = 101 special_range_names = { "none": 101, "multiworld-to-level-50": 51, - "all": 1 + "all": 2 } class BadStartingWeapons(Toggle): """ - Forces Kingdom Key, Dream Sword, Dream Shield, and Dream Staff to have bad stats. + Forces Kingdom Key, Dream Sword, Dream Shield, and Dream Staff to have vanilla stats. """ display_name = "Bad Starting Weapons" +class DeathLink(Choice): + """ + If Sora is KO'ed, the other players with "Death Link" on will also be KO'ed. + The opposite is also true. + """ + display_name = "Death Link" + option_off = 0 + option_toggle = 1 + option_on = 2 + default = 0 + class DonaldDeathLink(Toggle): """ If Donald is KO'ed, so is Sora. If Death Link is toggled on in your client, this will send a death to everyone who enabled death link. @@ -300,35 +415,61 @@ class GoofyDeathLink(Toggle): class KeybladesUnlockChests(Toggle): """ If toggled on, the player is required to have a certain keyblade to open chests in certain worlds. + TT - Lionheart + WL - Lady Luck + OC - Olympia + DJ - Jungle King + AG - Three Wishes + MS - Wishing Star + HT - Pumpkinhead + NL - Fairy Harp + HB - Divine Rose + EotW - Oblivion - HAW - Oathkeeper + + HAW - Spellbinder + + DI - Oathkeeper Note: Does not apply to Atlantica, the emblem and carousel chests in Hollow Bastion, or the Aero chest in Neverland currently. """ display_name = "Keyblades Unlock Chests" -class InteractInBattle(Toggle): +class InteractInBattle(DefaultOnToggle): """ Allow Sora to talk to people, examine objects, and open chests in battle. """ display_name = "Interact in Battle" -class AdvancedLogic(Toggle): +class LogicDifficulty(Choice): """ - If on, logic may expect you to do advanced skips like using Combo Master, Dumbo, and other unusual methods to reach locations. - """ - display_name = "Advanced Logic" + Determines what the randomizer logic may expect you to do to reach certain locations. -class ExtraSharedAbilities(Toggle): + Beginner: Logic only expects what would be the natural solution in vanilla gameplay or similar, as well as a guarantee of tools for boss fights. + + Normal: Logic expects some clever use of abilities, exploration of options, and competent combat ability; generally does not require advanced knowledge. + + Proud: Logic expects advanced knowledge of tricks and obscure interactions, such as using Combo Master, Dumbo, and other unusual methods to reach locations. + + Minimal: Logic expects the bare minimum to get to locations; may require extensive grinding, beating fights with no tools, and performing very difficult or tedious tricks. + """ + display_name = "Logic Difficulty" + option_beginner = 0 + option_normal = 5 + option_proud = 10 + option_minimal = 15 + default = 5 + +class ExtraSharedAbilities(DefaultOnToggle): """ If on, adds extra shared abilities to the pool. These can stack, so multiple high jumps make you jump higher and multiple glides make you superglide faster. """ @@ -340,51 +481,361 @@ class EXPZeroInPool(Toggle): """ display_name = "EXP Zero in Pool" -class VanillaEmblemPieces(DefaultOnToggle): +class RandomizeEmblemPieces(Toggle): """ - If on, the Hollow Bastion emblem pieces are in their vanilla locations. + If off, the Hollow Bastion emblem pieces are in their vanilla locations. """ - display_name = "Vanilla Emblem Pieces" + display_name = "Randomize Emblem Pieces" + +class RandomizePostcards(Choice): + """ + Determines how Postcards are randomized + + All: All Postcards are randomized + + Chests: Only the 3 Postcards in chests are randomized + + Vanilla: Postcards are in their original location + """ + display_name = "Randomize Postcards" + option_all = 0 + option_chests = 1 + option_vanilla = 2 + +class JungleSlider(Toggle): + """ + Determines whether checks are behind the Jungle Slider minigame. + """ + display_name = "Jungle Slider" class StartingWorlds(Range): """ - Number of random worlds to start with in addition to Traverse Town, which is always available. Will only consider Atlantica if toggled, and will only consider End of the World if its unlock is set to "Item". + Number of random worlds to start with in addition to Traverse Town, which is always available. + + Will only consider Atlantica if toggled, and will only consider End of the World if its unlock is set to "Item". + + These are given by the server, and are received after connection. """ display_name = "Starting Worlds" - default = 0 + default = 4 range_start = 0 range_end = 10 + +class StartingTools(DefaultOnToggle): + """ + Determines whether you start with Scan and Dodge Roll. + + These are given by the server, and are received after connection. + """ + display_name = "Starting Tools" + +class RemoteItems(Choice): + """ + Determines if items can be placed on locations in your own world in such a way that will force them to be remote items. + + Off: When your items are placed in your world, they can only be placed in locations that they can be acquired without server connection (stats on levels, items in chests, etc). + + Allow: When your items are placed in your world, items that normally can't be placed in a location in-game are simply made remote (abilities on static events, etc). + + Full: All items are remote. Use this when doing something like a co-op seed. + """ + display_name = "Remote Items" + option_off = 0 + option_allow = 1 + option_full = 2 + default = 0 + +class Slot2LevelChecks(Range): + """ + Determines how many levels have an additional item. Usually, this item is an ability. + + If Remote Items is OFF, these checks will only contain abilities. + """ + display_name = "Slot 2 Level Checks" + default = 0 + range_start = 0 + range_end = 33 + +class ShortenGoMode(DefaultOnToggle): + """ + If on, the player warps to the final cutscene after defeating Ansem 1 > Darkside > Ansem 2, skipping World of Chaos. + """ + display_name = "Shorten Go Mode" + +class DestinyIslands(Toggle): + """ + If on, Adds a Destiny Islands item and a number of Raft Materials items to the pool. + + When "Destiny Islands" is found, Traverse Town will have an additional place to land - Seashore. + + "Raft Materials" allow progress into Day 2 and to Homecoming. The amount is defined in Day 2 Materials and Homecoming Materials. + """ + display_name = "Destiny Islands" + +class MythrilInPool(Range): + """ + Determines how much Mythril, one of the two synthesis items, is in the item pool. + + You need 16 to synth every recipe that requires it. + """ + display_name = "Mythril In Pool" + default = 20 + range_start = 16 + range_end = 30 + +class OrichalcumInPool(Range): + """ + Determines how much Orichalcum, one of the two synthesis items, is in the item pool. + + You need 17 to synth every recipe that requires it. + """ + display_name = "Mythril In Pool" + default = 20 + range_start = 17 + range_end = 30 + +class MythrilPrice(Range): + """ + Determines the cost of Mythril in each shop. + """ + display_name = "Mythril Price" + default = 500 + range_start = 100 + range_end = 5000 + +class OrichalcumPrice(Range): + """ + Determines the cost of Orichalcum in each shop. + """ + display_name = "Orichalcum Price" + default = 500 + range_start = 100 + range_end = 5000 + +class OneHP(Toggle): + """ + If on, forces Sora's max HP to 1 and removes the low health warning sound. + """ + display_name = "One HP" + +class FourByThree(Toggle): + """ + If on, changes the aspect ratio to 4 by 3. + """ + display_name = "4 by 3" + +class AutoAttack(Toggle): + """ + If on, you can combo by holding confirm. + """ + display_name = "Auto Attack" + +class BeepHack(Toggle): + """ + If on, removes low health warning sound. Works up to max health of 41. + """ + display_name = "Beep Hack" + +class ConsistentFinishers(Toggle): + """ + If on, 30% chance finishers are now 100% chance. + """ + display_name = "Consistent Finishers" + +class EarlySkip(DefaultOnToggle): + """ + If on, allows skipping cutscenes immediately that normally take time to be able to skip. + """ + display_name = "Early Skip" + +class FastCamera(Toggle): + """ + If on, speeds up camera movement and camera centering. + """ + display_name = "Fast Camera" + +class FasterAnimations(DefaultOnToggle): + """ + If on, speeds up animations during which you can't play. + """ + display_name = "Faster Animations" + +class Unlock0Volume(Toggle): + """ + If on, volume 1 mutes the audio channel. + """ + display_name = "Unlock 0 Volume" + +class Unskippable(DefaultOnToggle): + """ + If on, makes unskippable cutscenes skippable. + """ + display_name = "Unskippable" + +class AutoSave(DefaultOnToggle): + """ + If on, enables auto saving. + + Press L1+L2+R1+R2+D-Pad Left to instantly load continue state. + + Press L1+L2+R1+R2+D-Pad Right to instantly load autosave. + """ + display_name = "AutoSave" + +class WarpAnywhere(Toggle): + """ + If on, enables the player to warp at any time, even when not at a save point. + + Press L1+L2+R2+Select to open the Save/Warp menu at any time. + """ + display_name = "WarpAnywhere" + +class RandomizePartyMemberStartingAccessories(DefaultOnToggle): + """ + If on, the 10 accessories that some party members (Aladdin, Ariel, Jack, Peter Pan, Beast) start with are randomized. + + 10 random accessories will be distributed amongst any party member aside from Sora in their starting equipment. + """ + display_name = "Randomize Party Member Starting Accessories" + +class MaxLevelForSlot2LevelChecks(Range): + """ + Determines the max level for slot 2 level checks. + """ + display_name = "Max Level for Slot 2 Level Checks" + default = 50 + range_start = 2 + range_end = 100 + +class RandomizeAPCosts(Choice): + """ + Off: No randomization + Shuffle: Ability AP Costs will be shuffled amongst themselves. + + Randomize: Ability AP Costs will be randomized to the specified max and min. + + Distribute: Ability AP Costs will totalled and re-distributed randomly between the specified max and min. + """ + display_name = "Randomize AP Costs" + option_off = 0 + option_shuffle = 1 + option_randomize = 2 + option_distribute = 3 + default = 0 + +class MaxAPCost(Range): + """ + If Randomize AP Costs is set to Randomize or Distribute, this defined the max AP cost an ability can have. + """ + display_name = "Max AP Cost" + default = 5 + range_start = 4 + range_end = 9 + +class MinAPCost(Range): + """ + If Randomize AP Costs is set to Randomize or Distribute, this defined the min AP cost an ability can have. + """ + display_name = "Min AP Cost" + default = 0 + range_start = 0 + range_end = 2 + +class Day2Materials(Range): + """ + The amount of Raft Materials required to access Day 2. + """ + display_name = "Day 2 Materials" + default = 4 + range_start = 0 + range_end = 20 + +class HomecomingMaterials(Range): + """ + The amount of Raft Materials required to access Homecoming. + """ + display_name = "Homecoming Materials" + default = 10 + range_start = 0 + range_end = 20 + +class MaterialsInPool(Range): + """ + The amount of Raft Materials required to access Homecoming. + """ + display_name = "Materials in Pool" + default = 16 + range_start = 0 + range_end = 20 + +class StackingWorldItems(DefaultOnToggle): + """ + Multiple world items give you the world's associated key item. + + WL - Footprints + + OC - Entry Pass + + DJ - Slides + + HT - Forget-Me-Not and Jack-In-The-Box + + HB - Theon Vol. 6 + + Adds an extra world to the pool for each that has a key item (WL, OC, DJ, HT, HB). + + Forces Halloween Town Key Item Bundle ON. + """ + display_name = "Stacking World Items" + +class HalloweenTownKeyItemBundle(DefaultOnToggle): + """ + Obtaining the Forget-Me-Not automatically gives Jack-in-the-Box as well. + + Removes Jack-in-the-Box from the pool. + """ + display_name = "Halloween Town Key Item Bundle" @dataclass class KH1Options(PerGameCommonOptions): - goal: Goal + final_rest_door_key: FinalRestDoorKey end_of_the_world_unlock: EndoftheWorldUnlock - final_rest_door: FinalRestDoor - required_reports_eotw: RequiredReportsEotW - required_reports_door: RequiredReportsDoor - reports_in_pool: ReportsInPool + required_lucky_emblems_eotw: RequiredLuckyEmblemsEotW + required_lucky_emblems_door: RequiredLuckyEmblemsDoor + lucky_emblems_in_pool: LuckyEmblemsInPool + required_postcards: RequiredPostcards + required_puppies: RequiredPuppies super_bosses: SuperBosses atlantica: Atlantica hundred_acre_wood: HundredAcreWood cups: Cups - puppies: Puppies + randomize_puppies: RandomizePuppies + puppy_value: PuppyValue starting_worlds: StartingWorlds keyblades_unlock_chests: KeybladesUnlockChests interact_in_battle: InteractInBattle exp_multiplier: EXPMultiplier - advanced_logic: AdvancedLogic + logic_difficulty: LogicDifficulty extra_shared_abilities: ExtraSharedAbilities exp_zero_in_pool: EXPZeroInPool - vanilla_emblem_pieces: VanillaEmblemPieces + randomize_emblem_pieces: RandomizeEmblemPieces + randomize_postcards: RandomizePostcards donald_death_link: DonaldDeathLink goofy_death_link: GoofyDeathLink - randomize_keyblade_stats: RandomizeKeybladeStats + keyblade_stats: KeybladeStats bad_starting_weapons: BadStartingWeapons keyblade_min_str: KeybladeMinStrength keyblade_max_str: KeybladeMaxStrength + keyblade_min_crit_rate: KeybladeMinCritRateBonus + keyblade_max_crit_rate: KeybladeMaxCritRateBonus + keyblade_min_crit_str: KeybladeMinCritSTRBonus + keyblade_max_crit_str: KeybladeMaxCritSTRBonus + keyblade_min_recoil: KeybladeMinRecoil + keyblade_max_recoil: KeybladeMaxRecoil keyblade_min_mp: KeybladeMinMP keyblade_max_mp: KeybladeMaxMP level_checks: LevelChecks + slot_2_level_checks: Slot2LevelChecks force_stats_on_levels: ForceStatsOnLevels strength_increase: StrengthIncrease defense_increase: DefenseIncrease @@ -394,26 +845,68 @@ class KH1Options(PerGameCommonOptions): accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease start_inventory_from_pool: StartInventoryPool + jungle_slider: JungleSlider + starting_tools: StartingTools + remote_items: RemoteItems + shorten_go_mode: ShortenGoMode + death_link: DeathLink + destiny_islands: DestinyIslands + orichalcum_in_pool: OrichalcumInPool + orichalcum_price: OrichalcumPrice + mythril_in_pool: MythrilInPool + mythril_price: MythrilPrice + one_hp: OneHP + four_by_three: FourByThree + auto_attack: AutoAttack + beep_hack: BeepHack + consistent_finishers: ConsistentFinishers + early_skip: EarlySkip + fast_camera: FastCamera + faster_animations: FasterAnimations + unlock_0_volume: Unlock0Volume + unskippable: Unskippable + auto_save: AutoSave + warp_anywhere: WarpAnywhere + randomize_party_member_starting_accessories: RandomizePartyMemberStartingAccessories + max_level_for_slot_2_level_checks: MaxLevelForSlot2LevelChecks + randomize_ap_costs: RandomizeAPCosts + max_ap_cost: MaxAPCost + min_ap_cost: MinAPCost + day_2_materials: Day2Materials + homecoming_materials: HomecomingMaterials + materials_in_pool: MaterialsInPool + stacking_world_items: StackingWorldItems + halloween_town_key_item_bundle: HalloweenTownKeyItemBundle + kh1_option_groups = [ OptionGroup("Goal", [ - Goal, + FinalRestDoorKey, EndoftheWorldUnlock, - FinalRestDoor, - RequiredReportsDoor, - RequiredReportsEotW, - ReportsInPool, + RequiredLuckyEmblemsDoor, + RequiredLuckyEmblemsEotW, + LuckyEmblemsInPool, + RequiredPostcards, + RequiredPuppies, + DestinyIslands, + Day2Materials, + HomecomingMaterials, + MaterialsInPool, ]), OptionGroup("Locations", [ SuperBosses, Atlantica, Cups, HundredAcreWood, - VanillaEmblemPieces, + JungleSlider, + RandomizeEmblemPieces, + RandomizePostcards, ]), OptionGroup("Levels", [ EXPMultiplier, LevelChecks, + Slot2LevelChecks, + MaxLevelForSlot2LevelChecks, ForceStatsOnLevels, StrengthIncrease, DefenseIncrease, @@ -425,21 +918,58 @@ kh1_option_groups = [ ]), OptionGroup("Keyblades", [ KeybladesUnlockChests, - RandomizeKeybladeStats, + KeybladeStats, BadStartingWeapons, - KeybladeMaxStrength, KeybladeMinStrength, - KeybladeMaxMP, + KeybladeMaxStrength, + KeybladeMinCritRateBonus, + KeybladeMaxCritRateBonus, + KeybladeMinCritSTRBonus, + KeybladeMaxCritSTRBonus, + KeybladeMinRecoil, + KeybladeMaxRecoil, KeybladeMinMP, + KeybladeMaxMP, + ]), + OptionGroup("Synth", [ + OrichalcumInPool, + OrichalcumPrice, + MythrilInPool, + MythrilPrice, + ]), + OptionGroup("AP Costs", [ + RandomizeAPCosts, + MaxAPCost, + MinAPCost ]), OptionGroup("Misc", [ StartingWorlds, - Puppies, + StartingTools, + RandomizePuppies, + PuppyValue, InteractInBattle, - AdvancedLogic, + LogicDifficulty, ExtraSharedAbilities, + StackingWorldItems, + HalloweenTownKeyItemBundle, EXPZeroInPool, + RandomizePartyMemberStartingAccessories, + DeathLink, DonaldDeathLink, GoofyDeathLink, + RemoteItems, + ShortenGoMode, + OneHP, + FourByThree, + AutoAttack, + BeepHack, + ConsistentFinishers, + EarlySkip, + FastCamera, + FasterAnimations, + Unlock0Volume, + Unskippable, + AutoSave, + WarpAnywhere ]) ] diff --git a/worlds/kh1/Presets.py b/worlds/kh1/Presets.py index 77b43b76..33949a24 100644 --- a/worlds/kh1/Presets.py +++ b/worlds/kh1/Presets.py @@ -3,24 +3,33 @@ from typing import Any, Dict from .Options import * kh1_option_presets: Dict[str, Dict[str, Any]] = { - # Standard playthrough where your goal is to defeat Ansem, reaching him by acquiring enough reports. + # Standard playthrough where your goal is to defeat Ansem, reaching him by acquiring enough lucky emblems. "Final Ansem": { - "goal": Goal.option_final_ansem, - "end_of_the_world_unlock": EndoftheWorldUnlock.option_reports, - "final_rest_door": FinalRestDoor.option_reports, - "required_reports_eotw": 7, - "required_reports_door": 10, - "reports_in_pool": 13, + "final_rest_door_key": FinalRestDoorKey.option_lucky_emblems, + "end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems, + "required_lucky_emblems_eotw": 7, + "required_lucky_emblems_door": 10, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": True, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": False, "atlantica": False, "hundred_acre_wood": False, - "cups": False, - "vanilla_emblem_pieces": True, + "cups": Cups.option_off, + "jungle_slider": False, + "randomize_emblem_pieces": False, + "randomize_postcards": RandomizePostcards.option_all, - "exp_multiplier": 48, - "level_checks": 100, - "force_stats_on_levels": 1, + "exp_multiplier": 64, + "level_checks": 99, + "slot_2_level_checks": 33, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 24, "defense_increase": 24, "hp_increase": 23, @@ -30,40 +39,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 3, "keyblades_unlock_chests": False, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": False, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_triplets, - "starting_worlds": 0, - "interact_in_battle": False, - "advanced_logic": False, - "extra_shared_abilities": False, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 3, + "starting_worlds": 4, + "starting_tools": True, + "interact_in_battle": True, + "logic_difficulty": LogicDifficulty.option_normal, + "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": False, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": False, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False }, # Puppies are found individually, and the goal is to return them all. "Puppy Hunt": { - "goal": Goal.option_puppies, + "final_rest_door_key": FinalRestDoorKey.option_puppies, "end_of_the_world_unlock": EndoftheWorldUnlock.option_item, - "final_rest_door": FinalRestDoor.option_puppies, - "required_reports_eotw": 13, - "required_reports_door": 13, - "reports_in_pool": 13, + "required_lucky_emblems_eotw": 13, + "required_lucky_emblems_door": 13, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": False, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": False, "atlantica": False, "hundred_acre_wood": False, - "cups": False, - "vanilla_emblem_pieces": True, + "cups": Cups.option_off, + "jungle_slider": False, + "randomize_emblem_pieces": False, + "randomize_postcards": RandomizePostcards.option_all, - "exp_multiplier": 48, - "level_checks": 100, - "force_stats_on_levels": 1, + "exp_multiplier": 64, + "level_checks": 99, + "slot_2_level_checks": 33, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 24, "defense_increase": 24, "hp_increase": 23, @@ -73,40 +125,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 3, "keyblades_unlock_chests": False, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": False, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_individual, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 1, "starting_worlds": 0, - "interact_in_battle": False, - "advanced_logic": False, - "extra_shared_abilities": False, + "starting_tools": True, + "interact_in_battle": True, + "logic_difficulty": LogicDifficulty.option_normal, + "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": False, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": False, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False }, # Advanced playthrough with most settings on. "Advanced": { - "goal": Goal.option_final_ansem, - "end_of_the_world_unlock": EndoftheWorldUnlock.option_reports, - "final_rest_door": FinalRestDoor.option_reports, - "required_reports_eotw": 7, - "required_reports_door": 10, - "reports_in_pool": 13, + "final_rest_door_key": FinalRestDoorKey.option_lucky_emblems, + "end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems, + "required_lucky_emblems_eotw": 7, + "required_lucky_emblems_door": 10, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": True, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": True, "atlantica": True, "hundred_acre_wood": True, - "cups": True, - "vanilla_emblem_pieces": False, + "cups": Cups.option_off, + "jungle_slider": True, + "randomize_emblem_pieces": True, + "randomize_postcards": RandomizePostcards.option_all, - "exp_multiplier": 48, - "level_checks": 100, - "force_stats_on_levels": 1, + "exp_multiplier": 64, + "level_checks": 99, + "slot_2_level_checks": 33, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 24, "defense_increase": 24, "hp_increase": 23, @@ -116,40 +211,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 3, "keyblades_unlock_chests": True, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": True, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_triplets, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 3, "starting_worlds": 0, + "starting_tools": True, "interact_in_battle": True, - "advanced_logic": True, + "logic_difficulty": LogicDifficulty.option_proud, "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": True, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": False, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False }, # Playthrough meant to enhance the level 1 experience. "Level 1": { - "goal": Goal.option_final_ansem, - "end_of_the_world_unlock": EndoftheWorldUnlock.option_reports, - "final_rest_door": FinalRestDoor.option_reports, - "required_reports_eotw": 7, - "required_reports_door": 10, - "reports_in_pool": 13, + "final_rest_door_key": FinalRestDoorKey.option_lucky_emblems, + "end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems, + "required_lucky_emblems_eotw": 7, + "required_lucky_emblems_door": 10, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": True, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": False, "atlantica": False, "hundred_acre_wood": False, - "cups": False, - "vanilla_emblem_pieces": True, + "cups": Cups.option_off, + "jungle_slider": False, + "randomize_emblem_pieces": False, + "randomize_postcards": RandomizePostcards.option_all, "exp_multiplier": 16, "level_checks": 0, - "force_stats_on_levels": 101, + "slot_2_level_checks": 0, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 0, "defense_increase": 0, "hp_increase": 0, @@ -158,20 +296,54 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 5, "keyblades_unlock_chests": False, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": False, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_triplets, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 3, "starting_worlds": 0, - "interact_in_battle": False, - "advanced_logic": False, - "extra_shared_abilities": False, + "starting_tools": True, + "interact_in_battle": True, + "logic_difficulty": LogicDifficulty.option_normal, + "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": False, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": True, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False } } diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 6189adf2..ac622ce0 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,12 +9,16 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, options): +def create_regions(kh1world): + multiworld = kh1world.multiworld + player = kh1world.player + options = kh1world.options + regions: Dict[str, KH1RegionData] = { - "Menu": KH1RegionData([], ["Awakening", "Levels"]), - "Awakening": KH1RegionData([], ["Destiny Islands"]), - "Destiny Islands": KH1RegionData([], ["Traverse Town"]), - "Traverse Town": KH1RegionData([], ["World Map"]), + "Menu": KH1RegionData([], ["Awakening", "Levels", "World Map"]), + "Awakening": KH1RegionData([], []), + "Destiny Islands": KH1RegionData([], []), + "Traverse Town": KH1RegionData([], []), "Wonderland": KH1RegionData([], []), "Olympus Coliseum": KH1RegionData([], []), "Deep Jungle": KH1RegionData([], []), @@ -27,17 +31,27 @@ def create_regions(multiworld: MultiWorld, player: int, options): "End of the World": KH1RegionData([], []), "100 Acre Wood": KH1RegionData([], []), "Levels": KH1RegionData([], []), - "World Map": KH1RegionData([], ["Wonderland", "Olympus Coliseum", "Deep Jungle", + "Homecoming": KH1RegionData([], []), + "World Map": KH1RegionData([], ["Destiny Islands", "Traverse Town", + "Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", - "End of the World", "100 Acre Wood"]) + "End of the World", "100 Acre Wood", "Homecoming"]) } + + if not options.atlantica: + del regions["Atlantica"] + regions["World Map"].region_exits.remove("Atlantica") + if not options.destiny_islands: + del regions["Destiny Islands"] + regions["World Map"].region_exits.remove("Destiny Islands") # Set up locations regions["Agrabah"].locations.append("Agrabah Aladdin's House Main Street Entrance Chest") regions["Agrabah"].locations.append("Agrabah Aladdin's House Plaza Entrance Chest") regions["Agrabah"].locations.append("Agrabah Alley Chest") regions["Agrabah"].locations.append("Agrabah Bazaar Across Windows Chest") + regions["Agrabah"].locations.append("Agrabah Bazaar Blue Trinity") regions["Agrabah"].locations.append("Agrabah Bazaar High Corner Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Pillar Chest") @@ -59,6 +73,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Above Fire Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Across Platforms Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Red Trinity") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest") regions["Agrabah"].locations.append("Agrabah Defeat Jafar Blizzard Event") regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Ansem's Report 1") @@ -96,15 +111,11 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Center Chest") regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Left Chest") regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Right Chest") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 10 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 20 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 30 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 40 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 50 Fruits") regions["Deep Jungle"].locations.append("Deep Jungle Seal Keyhole Jungle King Event") regions["Deep Jungle"].locations.append("Deep Jungle Seal Keyhole Red Trinity Event") regions["Deep Jungle"].locations.append("Deep Jungle Tent Chest") regions["Deep Jungle"].locations.append("Deep Jungle Tent Protect-G Event") + regions["Deep Jungle"].locations.append("Deep Jungle Treetop Green Trinity") regions["Deep Jungle"].locations.append("Deep Jungle Tree House Beneath Tree House Chest") regions["Deep Jungle"].locations.append("Deep Jungle Tree House Rooftop Chest") regions["Deep Jungle"].locations.append("Deep Jungle Tree House Save Gorillas") @@ -138,7 +149,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["End of the World"].locations.append("End of the World World Terminus Atlantica Chest") regions["End of the World"].locations.append("End of the World World Terminus Deep Jungle Chest") regions["End of the World"].locations.append("End of the World World Terminus Halloween Town Chest") - #regions["End of the World"].locations.append("End of the World World Terminus Hollow Bastion Chest") + regions["End of the World"].locations.append("End of the World World Terminus Hollow Bastion Chest") regions["End of the World"].locations.append("End of the World World Terminus Neverland Chest") regions["End of the World"].locations.append("End of the World World Terminus Olympus Coliseum Chest") regions["End of the World"].locations.append("End of the World World Terminus Traverse Town Chest") @@ -181,6 +192,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Donald Cheer Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku II Ragnarok Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon Blue Trinity") regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon By Candles Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon Corner Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Chest)") @@ -192,6 +204,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Oblivion Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Steps Right Side Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest After Battle Platform Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest Blue Trinity") regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest Lower Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 1st Gravity Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 2nd Gravity Chest") @@ -203,6 +216,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Hollow Bastion"].locations.append("Hollow Bastion Library Speak to Belle Divine Rose") regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop from Waterway Examine Node") regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Library Node Gravity Chest") @@ -230,6 +244,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Monstro"].locations.append("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest") regions["Monstro"].locations.append("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest") regions["Monstro"].locations.append("Monstro Chamber 5 Atop Barrel Chest") + regions["Monstro"].locations.append("Monstro Chamber 5 Blue Trinity") regions["Monstro"].locations.append("Monstro Chamber 5 Low 1st Chest") regions["Monstro"].locations.append("Monstro Chamber 5 Low 2nd Chest") regions["Monstro"].locations.append("Monstro Chamber 5 Platform Chest") @@ -240,26 +255,28 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Monstro"].locations.append("Monstro Chamber 6 White Trinity Chest") regions["Monstro"].locations.append("Monstro Defeat Parasite Cage I Goofy Cheer Event") regions["Monstro"].locations.append("Monstro Defeat Parasite Cage II Stop Event") + regions["Monstro"].locations.append("Monstro Mouth Blue Trinity") regions["Monstro"].locations.append("Monstro Mouth Boat Deck Chest") regions["Monstro"].locations.append("Monstro Mouth Green Trinity Top of Boat Chest") regions["Monstro"].locations.append("Monstro Mouth High Platform Across from Boat Chest") regions["Monstro"].locations.append("Monstro Mouth High Platform Boat Side Chest") regions["Monstro"].locations.append("Monstro Mouth High Platform Near Teeth Chest") regions["Monstro"].locations.append("Monstro Mouth Near Ship Chest") + regions["Monstro"].locations.append("Monstro Throat Blue Trinity") regions["Neverland"].locations.append("Neverland Cabin Chest") regions["Neverland"].locations.append("Neverland Captain's Cabin Chest") - #regions["Neverland"].locations.append("Neverland Clock Tower 01:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 02:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 03:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 04:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 05:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 06:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 07:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 08:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 09:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 10:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 11:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 12:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 01:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 02:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 03:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 04:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 05:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 06:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 07:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 08:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 09:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 10:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 11:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 12:00 Door") regions["Neverland"].locations.append("Neverland Clock Tower Chest") regions["Neverland"].locations.append("Neverland Defeat Anti Sora Raven's Claw Event") regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Arcanum Event") @@ -276,6 +293,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Neverland"].locations.append("Neverland Pirate Ship Deck White Trinity Chest") regions["Neverland"].locations.append("Neverland Seal Keyhole Fairy Harp Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") + regions["Neverland"].locations.append("Neverland Seal Keyhole Navi-G Piece Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Clear Phil's Training Thunder Event") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Cloud Sonic Blade Event") @@ -292,14 +310,16 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town 1st District Accessory Shop Roof Chest") #regions["Traverse Town"].locations.append("Traverse Town 1st District Aerith Gift") regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity Balcony Chest") + regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity by Exit Door") regions["Traverse Town"].locations.append("Traverse Town 1st District Candle Puzzle Chest") - #regions["Traverse Town"].locations.append("Traverse Town 1st District Leon Gift") + regions["Traverse Town"].locations.append("Traverse Town 1st District Leon Gift") regions["Traverse Town"].locations.append("Traverse Town 1st District Safe Postcard") - regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") + #regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") regions["Traverse Town"].locations.append("Traverse Town 2nd District Boots and Shoes Awning Chest") regions["Traverse Town"].locations.append("Traverse Town 2nd District Gizmo Shop Facade Chest") regions["Traverse Town"].locations.append("Traverse Town 2nd District Rooftop Chest") regions["Traverse Town"].locations.append("Traverse Town 3rd District Balcony Postcard") + regions["Traverse Town"].locations.append("Traverse Town 3rd District Blue Trinity") regions["Traverse Town"].locations.append("Traverse Town Accessory Shop Chest") regions["Traverse Town"].locations.append("Traverse Town Alleyway Balcony Chest") regions["Traverse Town"].locations.append("Traverse Town Alleyway Behind Crates Chest") @@ -310,6 +330,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Dodge Roll Event") regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Fire Event") regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Aero Event") + regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Navi-G Piece Event") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Chest") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto All Summons Reward") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 1") @@ -329,6 +350,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Item Workshop Right Chest") regions["Traverse Town"].locations.append("Traverse Town Kairi Secret Waterway Oathkeeper Event") regions["Traverse Town"].locations.append("Traverse Town Leon Secret Waterway Earthshine Event") + regions["Traverse Town"].locations.append("Traverse Town Magician's Study Blue Trinity") regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All Arts Items") regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All LV1 Magic") regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All LV3 Magic") @@ -357,26 +379,62 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 99 Puppies Reward 1") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 99 Puppies Reward 2") regions["Traverse Town"].locations.append("Traverse Town Red Room Chest") + regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Navi Gummi Event") regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Near Stairs Chest") regions["Traverse Town"].locations.append("Traverse Town Secret Waterway White Trinity Chest") - regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") - regions["Traverse Town"].locations.append("Traverse Town Synth Fish") - regions["Traverse Town"].locations.append("Traverse Town Synth Log") - regions["Traverse Town"].locations.append("Traverse Town Synth Mushroom") - regions["Traverse Town"].locations.append("Traverse Town Synth Rope") - regions["Traverse Town"].locations.append("Traverse Town Synth Seagull Egg") + regions["Traverse Town"].locations.append("Traverse Town Synth 15 Items") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 01") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 02") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 03") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 04") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 05") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 06") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 07") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 08") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 09") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 10") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 11") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 12") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 13") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 14") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 15") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 16") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 17") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 18") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 19") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 20") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 21") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 22") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 23") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 24") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 25") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 26") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 27") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 28") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 29") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 30") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 31") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 32") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 33") + regions["Wonderland"].locations.append("Wonderland Bizarre Room Examine Flower Pot") regions["Wonderland"].locations.append("Wonderland Bizarre Room Green Trinity Chest") regions["Wonderland"].locations.append("Wonderland Bizarre Room Lamp Chest") regions["Wonderland"].locations.append("Wonderland Bizarre Room Navi-G Piece Event") regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Blizzard Event") regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Ifrit's Horn Event") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Blue Trinity in Alcove") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Blue Trinity by Moving Boulder") regions["Wonderland"].locations.append("Wonderland Lotus Forest Corner Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Glide Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Nut Chest") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Red Flower Raise Lily Pads") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Red Flowers on the Main Path") regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting Thunder Plant Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting White Trinity Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Thunder Plant Chest") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Yellow Elixir Flower Through Painting") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Yellow Flowers in Middle Clearing and Through Painting") regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Left Red Chest") regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Right Blue Chest") regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Right Red Chest") @@ -388,6 +446,11 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Wonderland"].locations.append("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest") regions["Wonderland"].locations.append("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest") regions["Wonderland"].locations.append("Wonderland Tea Party Garden Bear and Clock Puzzle Chest") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Cushioned Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Gray Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Pink Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Right Brown Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Right Yellow Chair") if options.hundred_acre_wood: regions["100 Acre Wood"].locations.append("100 Acre Wood Meadow Inside Log Chest") regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Left Cliff Chest") @@ -440,7 +503,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Atlantica"].locations.append("Atlantica Undersea Cave Clam") regions["Atlantica"].locations.append("Atlantica Sunken Ship Crystal Trident Event") regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Ansem's Report 3") - if options.cups: + if options.cups.current_key != "off": regions["Olympus Coliseum"].locations.append("Complete Phil Cup") regions["Olympus Coliseum"].locations.append("Complete Phil Cup Solo") regions["Olympus Coliseum"].locations.append("Complete Phil Cup Time Trial") @@ -450,50 +513,84 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Olympus Coliseum"].locations.append("Complete Hercules Cup") regions["Olympus Coliseum"].locations.append("Complete Hercules Cup Solo") regions["Olympus Coliseum"].locations.append("Complete Hercules Cup Time Trial") - regions["Olympus Coliseum"].locations.append("Complete Hades Cup") - regions["Olympus Coliseum"].locations.append("Complete Hades Cup Solo") - regions["Olympus Coliseum"].locations.append("Complete Hades Cup Time Trial") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cloud and Leon Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Yuffie Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cerberus Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Behemoth Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Hades Event") regions["Olympus Coliseum"].locations.append("Hercules Cup Defeat Cloud Event") regions["Olympus Coliseum"].locations.append("Hercules Cup Yellow Trinity Event") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Olympia Chest") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Ice Titan Diamond Dust Event") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Gates Purple Jar After Defeating Hades") + if options.cups.current_key == "hades_cup": + regions["Olympus Coliseum"].locations.append("Complete Hades Cup") + regions["Olympus Coliseum"].locations.append("Complete Hades Cup Solo") + regions["Olympus Coliseum"].locations.append("Complete Hades Cup Time Trial") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cloud and Leon Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Yuffie Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cerberus Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Behemoth Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Hades Event") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Gates Purple Jar After Defeating Hades") + if options.cups.current_key == "hades_cup" and options.super_bosses: + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Ice Titan Diamond Dust Event") if options.super_bosses: regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event") regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") - if options.super_bosses or options.goal.current_key == "sephiroth": + if options.super_bosses or options.final_rest_door_key.current_key == "sephiroth": regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") - if options.super_bosses or options.goal.current_key == "unknown": + if options.super_bosses or options.final_rest_door_key.current_key == "unknown": regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event") - for i in range(options.level_checks): - regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0')) - if options.goal.current_key == "final_ansem": - regions["End of the World"].locations.append("Final Ansem") + if options.jungle_slider: + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 10 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 20 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 30 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 40 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 50 Fruits") + for i in range(1,options.level_checks+1): + regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0') + " (Slot 1)") + if i+1 in kh1world.get_slot_2_levels(): + regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0') + " (Slot 2)") + if options.destiny_islands: + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 1 (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 2 (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 3 (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Seagull Egg (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Log on Riku's Island (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Log under Bridge (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Cloth (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Rope (Day 1)") + #regions["Destiny Islands"].locations.append("Destiny Islands Seashore Deliver Kairi Items (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Secret Place Gather Mushroom (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Cove Gather Mushroom Near Zip Line (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Cove Gather Mushroom in Small Cave (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Cove Talk to Kairi (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Gather Drinking Water (Day 2)") + #regions["Destiny Islands"].locations.append("Destiny Islands Cove Deliver Kairi Items (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Chest") + regions["Homecoming"].locations.append("Final Ansem") + + for location in kh1world.get_starting_accessory_locations(): + regions[location_table[location].category].locations.append(location) # Set up the regions correctly. for name, data in regions.items(): multiworld.regions.append(create_region(multiworld, player, name, data)) - -def connect_entrances(multiworld: MultiWorld, player: int): +def connect_entrances(kh1world): + multiworld = kh1world.multiworld + player = kh1world.player + options = kh1world.options + multiworld.get_entrance("Awakening", player).connect(multiworld.get_region("Awakening", player)) - multiworld.get_entrance("Destiny Islands", player).connect(multiworld.get_region("Destiny Islands", player)) + if options.destiny_islands: + multiworld.get_entrance("Destiny Islands", player).connect(multiworld.get_region("Destiny Islands", player)) multiworld.get_entrance("Traverse Town", player).connect(multiworld.get_region("Traverse Town", player)) multiworld.get_entrance("Wonderland", player).connect(multiworld.get_region("Wonderland", player)) multiworld.get_entrance("Olympus Coliseum", player).connect(multiworld.get_region("Olympus Coliseum", player)) multiworld.get_entrance("Deep Jungle", player).connect(multiworld.get_region("Deep Jungle", player)) multiworld.get_entrance("Agrabah", player).connect(multiworld.get_region("Agrabah", player)) multiworld.get_entrance("Monstro", player).connect(multiworld.get_region("Monstro", player)) - multiworld.get_entrance("Atlantica", player).connect(multiworld.get_region("Atlantica", player)) + if options.atlantica: + multiworld.get_entrance("Atlantica", player).connect(multiworld.get_region("Atlantica", player)) multiworld.get_entrance("Halloween Town", player).connect(multiworld.get_region("Halloween Town", player)) multiworld.get_entrance("Neverland", player).connect(multiworld.get_region("Neverland", player)) multiworld.get_entrance("Hollow Bastion", player).connect(multiworld.get_region("Hollow Bastion", player)) @@ -501,7 +598,7 @@ def connect_entrances(multiworld: MultiWorld, player: int): multiworld.get_entrance("100 Acre Wood", player).connect(multiworld.get_region("100 Acre Wood", player)) multiworld.get_entrance("World Map", player).connect(multiworld.get_region("World Map", player)) multiworld.get_entrance("Levels", player).connect(multiworld.get_region("Levels", player)) - + multiworld.get_entrance("Homecoming", player).connect(multiworld.get_region("Homecoming", player)) def create_region(multiworld: MultiWorld, player: int, name: str, data: KH1RegionData): region = Region(name, player, multiworld) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 130238e5..54a94326 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,41 +1,69 @@ from BaseClasses import CollectionState -from worlds.generic.Rules import add_rule +from worlds.generic.Rules import add_rule, add_item_rule from math import ceil +from BaseClasses import ItemClassification +from .Data import WORLD_KEY_ITEMS, LOGIC_BEGINNER, LOGIC_NORMAL, LOGIC_PROUD, LOGIC_MINIMAL -SINGLE_PUPPIES = ["Puppy " + str(i).rjust(2,"0") for i in range(1,100)] -TRIPLE_PUPPIES = ["Puppies " + str(3*(i-1)+1).rjust(2, "0") + "-" + str(3*(i-1)+3).rjust(2, "0") for i in range(1,34)] -TORN_PAGES = ["Torn Page " + str(i) for i in range(1,6)] -WORLDS = ["Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", "End of the World"] -KEYBLADES = ["Lady Luck", "Olympia", "Jungle King", "Three Wishes", "Wishing Star", "Crabclaw", "Pumpkinhead", "Fairy Harp", "Divine Rose", "Oblivion"] +from .Locations import KH1Location, location_table +from .Items import KH1Item, item_table -def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keyblades_unlock_chests: bool) -> bool: - worlds_acquired = 0.0 - for i in range(len(WORLDS)): - if state.has(WORLDS[i], player): - worlds_acquired = worlds_acquired + 0.5 - if (state.has(WORLDS[i], player) and (not keyblades_unlock_chests or state.has(KEYBLADES[i], player))) or (state.has(WORLDS[i], player) and WORLDS[i] == "Atlantica"): - worlds_acquired = worlds_acquired + 0.5 - return worlds_acquired >= num_of_worlds +WORLDS = ["Destiny Islands", "Traverse Town", "Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", "End of the World", "100 Acre Wood"] +KEYBLADES = ["Oathkeeper", "Lionheart", "Lady Luck", "Olympia", "Jungle King", "Three Wishes", "Wishing Star", "Crabclaw", "Pumpkinhead", "Fairy Harp", "Divine Rose", "Oblivion", "Spellbinder"] +BROKEN_KEYBLADE_LOCKING_LOCATIONS = [ + "End of the World Final Dimension 2nd Chest", + "End of the World Final Dimension 4th Chest", + "End of the World Final Dimension 7th Chest", + "End of the World Final Dimension 8th Chest", + "End of the World Final Dimension 10th Chest", + "Neverland Hold Aero Chest", + "Hollow Bastion Library 1st Floor Turn the Carousel Chest", + "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest", + "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest", + "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest", + "Hollow Bastion Entrance Hall Emblem Piece (Chest)", + "Atlantica Sunken Ship In Flipped Boat Chest", + "Atlantica Sunken Ship Seabed Chest", + "Atlantica Sunken Ship Inside Ship Chest", + "Atlantica Ariel's Grotto High Chest", + "Atlantica Ariel's Grotto Middle Chest", + "Atlantica Ariel's Grotto Low Chest", + "Atlantica Ursula's Lair Use Fire on Urchin Chest", + "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest", + "Atlantica Triton's Palace White Trinity Chest", + "Atlantica Sunken Ship Crystal Trident Event" +] -def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bool) -> bool: +def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keyblades_unlock_chests: bool, logic_difficulty: int, hundred_acre_wood: bool) -> bool: + if logic_difficulty >= LOGIC_MINIMAL: + return True + else: + worlds_acquired = 0.0 + for i in range(len(WORLDS)): + if WORLDS[i] == "Traverse Town": + worlds_acquired = worlds_acquired + 0.5 + if not keyblades_unlock_chests or state.has(KEYBLADES[i], player): + worlds_acquired = worlds_acquired + 0.5 + elif WORLDS[i] == "100 Acre Wood" and hundred_acre_wood: + if state.has("Progressive Fire", player): + worlds_acquired = worlds_acquired + 0.5 + if not keyblades_unlock_chests or state.has(KEYBLADES[i], player): + worlds_acquired = worlds_acquired + 0.5 + elif state.has(WORLDS[i], player): + worlds_acquired = worlds_acquired + 0.5 + if not keyblades_unlock_chests or state.has(KEYBLADES[i], player): + worlds_acquired = worlds_acquired + 0.5 + return worlds_acquired >= num_of_worlds + +def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bool, logic_difficulty: int, hundred_acre_wood: bool) -> bool: return state.has_all({ "Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Statue)", "Emblem Piece (Fountain)", - "Hollow Bastion"}, player) and has_x_worlds(state, player, 5, keyblades_unlock_chests) + "Hollow Bastion"}, player) and has_x_worlds(state, player, 6, keyblades_unlock_chests, logic_difficulty, hundred_acre_wood) -def has_puppies_all(state: CollectionState, player: int, puppies_required: int) -> bool: - return state.has("All Puppies", player) - -def has_puppies_triplets(state: CollectionState, player: int, puppies_required: int) -> bool: - return state.has_from_list_unique(TRIPLE_PUPPIES, player, ceil(puppies_required / 3)) - -def has_puppies_individual(state: CollectionState, player: int, puppies_required: int) -> bool: - return state.has_from_list_unique(SINGLE_PUPPIES, player, puppies_required) - -def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> bool: - return state.count_from_list_unique(TORN_PAGES, player) >= pages_required +def has_puppies(state: CollectionState, player: int, puppies_required: int, puppy_value: int) -> bool: + return (state.count("Puppy", player) * puppy_value) >= puppies_required def has_all_arts(state: CollectionState, player: int) -> bool: return state.has_all({"Fire Arts", "Blizzard Arts", "Thunder Arts", "Cure Arts", "Gravity Arts", "Stop Arts", "Aero Arts"}, player) @@ -53,198 +81,248 @@ def has_all_magic_lvx(state: CollectionState, player: int, level) -> bool: "Progressive Aero": level, "Progressive Stop": level}, player) -def has_offensive_magic(state: CollectionState, player: int) -> bool: - return state.has_any({"Progressive Fire", "Progressive Blizzard", "Progressive Thunder", "Progressive Gravity", "Progressive Stop"}, player) - -def has_reports(state: CollectionState, player: int, eotw_required_reports: int) -> bool: - return state.has_group_unique("Reports", player, eotw_required_reports) - -def has_final_rest_door(state: CollectionState, player: int, final_rest_door_requirement: str, final_rest_door_required_reports: int, keyblades_unlock_chests: bool, puppies_choice: str): - if final_rest_door_requirement == "reports": - return state.has_group_unique("Reports", player, final_rest_door_required_reports) - if final_rest_door_requirement == "puppies": - if puppies_choice == "individual": - return has_puppies_individual(state, player, 99) - if puppies_choice == "triplets": - return has_puppies_triplets(state, player, 99) - return has_puppies_all(state, player, 99) - if final_rest_door_requirement == "postcards": - return state.has("Postcard", player, 10) - if final_rest_door_requirement == "superbosses": - return ( - state.has_all({"Olympus Coliseum", "Neverland", "Agrabah", "Hollow Bastion", "Green Trinity", "Phil Cup", "Pegasus Cup", "Hercules Cup", "Entry Pass"}, player) - and has_emblems(state, player, keyblades_unlock_chests) - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_x_worlds(state, player, 7, keyblades_unlock_chests) - ) - -def has_defensive_tools(state: CollectionState, player: int) -> bool: +def has_offensive_magic(state: CollectionState, player: int, logic_difficulty: int) -> bool: return ( + state.has_any({"Progressive Fire", "Progressive Blizzard"}, player) + or (logic_difficulty > LOGIC_NORMAL and state.has_any({"Progressive Thunder", "Progressive Gravity"}, player)) + or (logic_difficulty > LOGIC_PROUD and state.has("Progressive Stop", player)) + ) + +def has_lucky_emblems(state: CollectionState, player: int, required_amt: int) -> bool: + return state.has("Lucky Emblem", player, required_amt) + +def has_final_rest_door(state: CollectionState, player: int, final_rest_door_requirement: str, final_rest_door_required_lucky_emblems: int): + if final_rest_door_requirement == "lucky_emblems": + return state.has("Lucky Emblem", player, final_rest_door_required_lucky_emblems) + else: + return state.has("Final Door Key", player) + +def has_defensive_tools(state: CollectionState, player: int, logic_difficulty: int) -> bool: + if logic_difficulty >= LOGIC_MINIMAL: + return True + else: + return ( state.has_all_counts({"Progressive Cure": 2, "Leaf Bracer": 1, "Dodge Roll": 1}, player) and state.has_any_count({"Second Chance": 1, "MP Rage": 1, "Progressive Aero": 2}, player) ) +def has_basic_tools(state: CollectionState, player: int) -> bool: + return ( + state.has_all({"Dodge Roll", "Progressive Cure"}, player) + and state.has_any({"Combo Master", "Strike Raid", "Sonic Blade", "Counterattack"}, player) + and state.has_any({"Leaf Bracer", "Second Chance", "Guard"}, player) + and has_offensive_magic(state, player, 6) + ) + def can_dumbo_skip(state: CollectionState, player: int) -> bool: return ( state.has("Dumbo", player) and state.has_group("Magic", player) ) -def has_oogie_manor(state: CollectionState, player: int, advanced_logic: bool) -> bool: +def has_oogie_manor(state: CollectionState, player: int, logic_difficulty: int) -> bool: return ( - state.has("Progressive Fire", player) - or (advanced_logic and state.has("High Jump", player, 2)) - or (advanced_logic and state.has("High Jump", player) and state.has("Progressive Glide", player)) + state.has("Progressive Fire", player) + or (logic_difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (logic_difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2) or (state.has_all({"High Jump", "Progressive Glide"}, player))) + or (logic_difficulty > LOGIC_PROUD and state.has_any({"High Jump", "Progressive Glide"}, player)) ) +def has_item_workshop(state: CollectionState, player: int, logic_difficulty: int) -> bool: + return ( + state.has("Green Trinity", player) + or (logic_difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) + ) + +def has_parasite_cage(state: CollectionState, player: int, logic_difficulty: int, worlds: bool) -> bool: + return ( + state.has("Monstro", player) + and + ( + state.has("High Jump", player) + or (logic_difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + ) + and worlds + ) + +def has_key_item(state: CollectionState, player: int, key_item: str, stacking_world_items: bool, halloween_town_key_item_bundle: bool, difficulty: int, keyblades_unlock_chests: bool): + return ( + ( + state.has(key_item, player) + or (stacking_world_items and state.has(WORLD_KEY_ITEMS[key_item], player, 2)) + or (key_item == "Jack-In-The-Box" and state.has("Forget-Me-Not", player) and halloween_town_key_item_bundle) + ) + # Adding this to make sure that if a beginner logic player is playing with keyblade locking, + # anything that would require the Crystal Trident should expect the player to be able to + # open the Crystal Trident chest. + and (key_item != "Crystal Trident" or difficulty > LOGIC_BEGINNER or not keyblades_unlock_chests or state.has("Crabclaw", player)) + ) + def set_rules(kh1world): - multiworld = kh1world.multiworld - player = kh1world.player - options = kh1world.options - eotw_required_reports = kh1world.determine_reports_required_to_open_end_of_the_world() - final_rest_door_required_reports = kh1world.determine_reports_required_to_open_final_rest_door() - final_rest_door_requirement = kh1world.options.final_rest_door.current_key - - has_puppies = has_puppies_individual - if kh1world.options.puppies == "triplets": - has_puppies = has_puppies_triplets - elif kh1world.options.puppies == "full": - has_puppies = has_puppies_all + multiworld = kh1world.multiworld + player = kh1world.player + options = kh1world.options + eotw_required_lucky_emblems = kh1world.determine_lucky_emblems_required_to_open_end_of_the_world() + final_rest_door_required_lucky_emblems = kh1world.determine_lucky_emblems_required_to_open_final_rest_door() + final_rest_door_requirement = kh1world.options.final_rest_door_key.current_key + day_2_materials = kh1world.options.day_2_materials.value + homecoming_materials = kh1world.options.homecoming_materials.value + difficulty = kh1world.options.logic_difficulty.value # difficulty > 0 is Normal or higher; difficulty > 5 is Proud or higher; difficulty > 10 is Minimal and higher; others are for if another difficulty is added + stacking_world_items = kh1world.options.stacking_world_items.value + halloween_town_key_item_bundle = kh1world.options.halloween_town_key_item_bundle.value + end_of_the_world_unlock = kh1world.options.end_of_the_world_unlock.current_key + hundred_acre_wood = kh1world.options.hundred_acre_wood + add_rule(kh1world.get_location("Traverse Town 1st District Candle Puzzle Chest"), lambda state: state.has("Progressive Blizzard", player)) + add_rule(kh1world.get_location("Traverse Town 1st District Accessory Shop Roof Chest"), # this check could justifiably require high jump for Beginners + lambda state: state.has("High Jump", player)) or difficulty > LOGIC_BEGINNER add_rule(kh1world.get_location("Traverse Town Mystical House Yellow Trinity Chest"), lambda state: ( state.has("Progressive Fire", player) and ( state.has("Yellow Trinity", player) - or (options.advanced_logic and state.has("High Jump", player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player)) ) )) add_rule(kh1world.get_location("Traverse Town Secret Waterway White Trinity Chest"), lambda state: state.has("White Trinity", player)) add_rule(kh1world.get_location("Traverse Town Geppetto's House Chest"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: (has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)))) add_rule(kh1world.get_location("Traverse Town Item Workshop Right Chest"), - lambda state: ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - )) + lambda state: (has_item_workshop(state, player, difficulty))) + add_rule(kh1world.get_location("Traverse Town Item Workshop Left Chest"), + lambda state: (has_item_workshop(state, player, difficulty))) add_rule(kh1world.get_location("Traverse Town 1st District Blue Trinity Balcony Chest"), lambda state: ( (state.has("Blue Trinity", player) and state.has("Progressive Glide", player)) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Traverse Town Mystical House Glide Chest"), lambda state: ( + state.has("Progressive Fire", player) + and ( state.has("Progressive Glide", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and ( - (state.has("High Jump", player) and state.has("Yellow Trinity", player)) - or state.has("High Jump", player, 2) + state.has("High Jump", player, 3) + or + ( + state.has("Combo Master", player) + and + ( + state.has("High Jump", player, 2) + or + ( + state.has("High Jump", player) + and state.has("Air Combo Plus", player, 2) + #or state.has("Yellow Trinity", player) + ) + ) + ) ) - and state.has("Combo Master", player) ) or ( - options.advanced_logic - and state.has("Mermaid Kick", player) + difficulty > LOGIC_PROUD + and + ( + state.has("Mermaid Kick", player) + or state.has("Combo Master", player) and (state.has("High Jump", player) or state.has("Air Combo Plus", player, 2)) + ) ) ) - and state.has("Progressive Fire", player) )) add_rule(kh1world.get_location("Traverse Town Alleyway Behind Crates Chest"), lambda state: state.has("Red Trinity", player)) - add_rule(kh1world.get_location("Traverse Town Item Workshop Left Chest"), - lambda state: ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - )) add_rule(kh1world.get_location("Wonderland Rabbit Hole Green Trinity Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest"), - lambda state: has_x_worlds(state, player, 5, options.keyblades_unlock_chests)) + lambda state: ( + has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_NORMAL and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + or difficulty > LOGIC_PROUD + )) + add_rule(kh1world.get_location("Wonderland Bizarre Room Green Trinity Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Left Red Chest"), lambda state: ( - state.has("Footprints", player) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) or state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Blue Chest"), lambda state: ( - state.has("Footprints", player) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) or state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Red Chest"), lambda state: ( - state.has("Footprints", player) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) or state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Thunder Plant Chest"), lambda state: ( - state.has_all({ - "Progressive Thunder", - "Footprints"}, player) + state.has("Progressive Thunder", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest"), lambda state: ( - state.has_all({ - "Progressive Thunder", - "Footprints"}, player) + state.has("Progressive Thunder", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Glide Chest"), lambda state: ( state.has("Progressive Glide", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and (state.has("High Jump", player) or can_dumbo_skip(state, player)) - and state.has("Footprints", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Corner Chest"), lambda state: ( - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - ) - or options.advanced_logic + state.has_all({"High Jump", "Progressive Glide"}, player) + or difficulty > LOGIC_BEGINNER and state.has_any({"High Jump","Progressive Glide"}, player) + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Wonderland Bizarre Room Lamp Chest"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest"), lambda state: ( state.has("Progressive Glide", player) or ( - state.has("High Jump", player, 2) - and state.has("Footprints", player) + difficulty > LOGIC_BEGINNER + and state.has("High Jump", player, 2) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) ) or ( - options.advanced_logic - and state.has_all({ - "High Jump", - "Footprints"}, player) + difficulty > LOGIC_NORMAL + and (state.has("High Jump", player) or can_dumbo_skip(state, player)) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest"), @@ -252,289 +330,330 @@ def set_rules(kh1world): state.has("Progressive Glide", player) or ( - state.has("High Jump", player, 2) - and state.has("Footprints", player) + difficulty > LOGIC_BEGINNER + and state.has("High Jump", player, 2) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) ) or ( - options.advanced_logic - and state.has_all({ - "High Jump", - "Footprints"}, player) + difficulty > LOGIC_NORMAL + and (state.has("High Jump", player) or can_dumbo_skip(state, player)) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest"), lambda state: ( - - state.has("Footprints", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) )) add_rule(kh1world.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest"), lambda state: ( state.has("Progressive Glide", player) or ( - state.has("High Jump", player, 3) - and state.has("Footprints", player) + difficulty > LOGIC_BEGINNER + and state.has("High Jump", player, 3) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) ) or ( - options.advanced_logic - and state.has_all({ - "High Jump", - "Footprints", - "Combo Master"}, player) + difficulty > LOGIC_NORMAL + and + ( + ( + state.has_all({"High Jump", "Combo Master"}, player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or (state.has("High Jump", player, 2) and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + ) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest"), lambda state: ( - state.has_all({ - "White Trinity", - "Footprints"}, player) + state.has("White Trinity", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Right Chest"), lambda state: ( - - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or options.advanced_logic + state.has_all({"High Jump", "Progressive Glide"}, player) + or + ( + difficulty > LOGIC_BEGINNER + and (state.has("High Jump", player) + or state.has("Progressive Glide", player)) + ) + or + difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Deep Jungle Climbing Trees Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Deep Jungle Cavern of Hearts White Trinity Chest"), lambda state: ( - state.has_all({ - "White Trinity", - "Slides"}, player) + state.has("White Trinity", player) + and has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Deep Jungle Camp Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Low Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Middle Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Wall Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Middle Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Tree House Rooftop Chest"), + lambda state: ( + state.has("High Jump", player) + or difficulty > LOGIC_NORMAL + )) add_rule(kh1world.get_location("Deep Jungle Tree House Suspended Boat Chest"), lambda state: ( state.has("Progressive Glide", player) - or options.advanced_logic + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest"), lambda state: ( state.has("High Jump", player) - or state.has("Progressive Glide", player) - or (options.advanced_logic and can_dumbo_skip(state, player)) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) )) add_rule(kh1world.get_location("Agrabah Palace Gates High Opposite Palace Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) + or difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Agrabah Palace Gates High Close to Palace Chest"), lambda state: ( + state.has_all({"High Jump", "Progressive Glide"}, player) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or ( - state.has_all({ - "High Jump", - "Progressive Glide"}, player) - or + difficulty > LOGIC_NORMAL + and ( - options.advanced_logic - and - ( - state.has("Combo Master", player) - or can_dumbo_skip(state, player) - ) + state.has("High Jump", player, 2) + or state.has("Progressive Glide", player) + or state.has_all({"High Jump", "Combo Master"}, player) ) ) - or state.has("High Jump", player, 3) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has("Combo Master", player)) # can_dumbo_skip(state, player) )) add_rule(kh1world.get_location("Agrabah Storage Green Trinity Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest"), lambda state: ( state.has("Progressive Glide", player) - or (options.advanced_logic and state.has("Combo Master", player)) - or (options.advanced_logic and can_dumbo_skip(state, player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or + ( + difficulty > LOGIC_NORMAL + and + ( + state.has("Combo Master", player) + or can_dumbo_skip(state, player) + or state.has("High Jump", player) + ) + ) + or difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest"), lambda state: ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or options.advanced_logic + state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Right Chest"), lambda state: ( state.has("Yellow Trinity", player) - or state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Left Chest"), lambda state: ( state.has("Yellow Trinity", player) - or state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest"), lambda state: state.has("White Trinity", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Other Platform Chest"), - lambda state: ( - state.has_all(("High Jump", "Progressive Glide"), player) - or (options.advanced_logic and state.has("Combo Master", player)) - )) add_rule(kh1world.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_NORMAL + )) + add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest"), + lambda state: state.has_any({"High Jump", "Progressive Glide"}, player) or difficulty > LOGIC_BEGINNER) + add_rule(kh1world.get_location("Monstro Chamber 6 Other Platform Chest"), + lambda state: ( + state.has_all({"High Jump","Progressive Glide"}, player) + or + ( + difficulty > LOGIC_NORMAL + and + ( + state.has("Combo Master", player) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) + ) + ) + or + difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), lambda state: ( - state.has_all(("High Jump", "Progressive Glide"), player) - or (options.advanced_logic and state.has("Combo Master", player)) + state.has_all({"High Jump","Progressive Glide"}, player) + or + ( + difficulty > LOGIC_NORMAL + and + ( + state.has("Combo Master", player) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) + ) + ) + or + difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Halloween Town Moonlight Hill White Trinity Chest"), lambda state: ( - state.has_all({ - "White Trinity", - "Forget-Me-Not"}, player) + state.has("White Trinity", player) + and has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Halloween Town Bridge Under Bridge"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Halloween Town Boneyard Tombstone Puzzle Chest"), - lambda state: state.has("Forget-Me-Not", player)) + lambda state: has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Halloween Town Bridge Right of Gate Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and ( state.has("Progressive Glide", player) - or options.advanced_logic + or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player)) + or difficulty > LOGIC_PROUD ) )) add_rule(kh1world.get_location("Halloween Town Cemetery Behind Grave Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Cemetery By Cat Shape Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Cemetery Between Graves Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or has_basic_tools or state.has("Progressive Glide", player)) + # difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2) + # difficulty > LOGIC_NORMAL and state.has("Combo Master", player) or state.has("High Jump", player) + # difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or has_basic_tools or state.has_all({"High Jump", "Progressive Glide"})) )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Hollow Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not", - "Red Trinity"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and state.has("Red Trinity", player) )) add_rule(kh1world.get_location("Halloween Town Guillotine Square High Tower Chest"), lambda state: ( - state.has("High Jump", player) - or (options.advanced_logic and can_dumbo_skip(state, player)) - or (options.advanced_logic and state.has("Progressive Glide", player)) + state.has_all({"High Jump", "Progressive Glide"}, player) + or (difficulty > LOGIC_BEGINNER and (state.has("High Jump", player) or state.has("Progressive Glide", player))) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) )) add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest"), lambda state: ( ( state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) ) and ( state.has("Progressive Glide", player) - or (options.advanced_logic and state.has("Combo Master", player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("Combo Master", player)) ) )) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Entrance Steps Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - )) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Inside Entrance Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - )) - add_rule(kh1world.get_location("Halloween Town Bridge Left of Gate Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and - ( - state.has("Progressive Glide", player) - or state.has("High Jump", player) - or options.advanced_logic - ) - )) - add_rule(kh1world.get_location("Halloween Town Cemetery By Striped Grave Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) - )) add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest"), lambda state: ( ( state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) ) and ( state.has("Progressive Glide", player) - or (options.advanced_logic and state.has("Combo Master", player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("Combo Master", player)) ) )) + add_rule(kh1world.get_location("Halloween Town Oogie's Manor Entrance Steps Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + )) + add_rule(kh1world.get_location("Halloween Town Oogie's Manor Inside Entrance Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + )) + add_rule(kh1world.get_location("Halloween Town Bridge Left of Gate Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and + ( + state.has("Progressive Glide", player) + or state.has("High Jump", player) + or difficulty > LOGIC_NORMAL + ) + )) + add_rule(kh1world.get_location("Halloween Town Cemetery By Striped Grave Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) + )) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest"), @@ -548,37 +667,47 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Monstro Mouth High Platform Boat Side Chest"), lambda state: ( state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Monstro Mouth High Platform Across from Boat Chest"), lambda state: ( state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Monstro Mouth Green Trinity Top of Boat Chest"), lambda state: ( ( state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) ) and state.has("Green Trinity", player) )) + add_rule(kh1world.get_location("Monstro Mouth Near Ship Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"High Jump","Progressive Glide"}, player) or has_basic_tools)) + add_rule(kh1world.get_location("Monstro Chamber 2 Platform Chest"), + lambda state: ( + state.has_any({"High Jump","Progressive Glide"}, player) + or difficulty > LOGIC_BEGINNER + )) add_rule(kh1world.get_location("Monstro Chamber 5 Platform Chest"), - lambda state: state.has("High Jump", player)) + lambda state: ( + state.has("High Jump", player) + or difficulty > LOGIC_NORMAL + )) add_rule(kh1world.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_BEGINNER )) add_rule(kh1world.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_BEGINNER )) add_rule(kh1world.get_location("Monstro Chamber 5 Atop Barrel Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Neverland Pirate Ship Deck White Trinity Chest"), lambda state: ( @@ -598,27 +727,23 @@ def set_rules(kh1world): lambda state: ( state.has("Green Trinity", player) or state.has("Progressive Glide", player) - or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) )) add_rule(kh1world.get_location("Neverland Clock Tower Chest"), - lambda state: ( - state.has("Green Trinity", player) - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - )) + lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Neverland Hold Flight 2nd Chest"), lambda state: ( state.has("Green Trinity", player) or state.has("Progressive Glide", player) - or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) )) add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Green Chest"), lambda state: state.has("Yellow Trinity", player)) add_rule(kh1world.get_location("Neverland Captain's Cabin Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), #might be possible with CM and 2ACP lambda state: ( state.has("High Jump", player) or state.has("Progressive Glide", player) @@ -633,87 +758,99 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Hollow Bastion Rising Falls High Platform Chest"), lambda state: ( state.has("Progressive Glide", player) - or (state.has("Progressive Blizzard", player) and has_emblems(state, player, options.keyblades_unlock_chests)) - or (options.advanced_logic and state.has("Combo Master", player)) + or (state.has("Progressive Blizzard", player) and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player) or state.has("Combo Master", player))) + or difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Hollow Bastion Castle Gates Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) and ( - has_emblems(state, player, options.keyblades_unlock_chests) - or (options.advanced_logic and state.has("High Jump", player, 2) and state.has("Progressive Glide", player)) - or (options.advanced_logic and can_dumbo_skip(state, player) and state.has("Progressive Glide", player)) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player)) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) ) )) add_rule(kh1world.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - or state.has("High Jump", player, 2) - or (options.advanced_logic and can_dumbo_skip(state, player)) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player))) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) )) add_rule(kh1world.get_location("Hollow Bastion Castle Gates High Pillar Chest"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - or state.has("High Jump", player, 2) - or (options.advanced_logic and can_dumbo_skip(state, player)) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player))) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) )) + add_rule(kh1world.get_location("Hollow Bastion Base Level Platform Near Entrance Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"Progressive Glide", "High Jump"}, player))) add_rule(kh1world.get_location("Hollow Bastion Great Crest Lower Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Great Crest After Battle Platform Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion High Tower 2nd Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hollow Bastion High Tower 1st Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest"), lambda state: state.has("Progressive Gravity", player)) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and state.has_all({ - "Progressive Glide", - "Progressive Gravity"}, player) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and state.has("Progressive Gravity", player) + and (difficulty > LOGIC_BEGINNER or state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest"), lambda state: state.has("Progressive Gravity", player)) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and + ( + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player)) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) + ) )) add_rule(kh1world.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest"), lambda state: ( (state.has("Progressive Blizzard", player) and state.has("High Jump", player)) - or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) )) add_rule(kh1world.get_location("Hollow Bastion Grand Hall Steps Right Side Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Grand Hall Oblivion Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Grand Hall Left of Gate Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest"), lambda state: ( state.has("High Jump", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) ) )) add_rule(kh1world.get_location("Hollow Bastion Rising Falls White Trinity Chest"), @@ -721,84 +858,87 @@ def set_rules(kh1world): add_rule(kh1world.get_location("End of the World Giant Crevasse 5th Chest"), lambda state: ( state.has("Progressive Glide", player) + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("End of the World Giant Crevasse 1st Chest"), lambda state: ( state.has("High Jump", player) or state.has("Progressive Glide", player) + or difficulty > LOGIC_PROUD )) + add_rule(kh1world.get_location("End of the World Giant Crevasse 2nd Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"High Jump", "Progressive Glide"}, player))) + add_rule(kh1world.get_location("End of the World Giant Crevasse 3rd Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"High Jump", "Progressive Glide"}, player))) add_rule(kh1world.get_location("End of the World Giant Crevasse 4th Chest"), lambda state: ( + state.has("Progressive Glide", player) + or ( - options.advanced_logic - and state.has("High Jump", player) - and state.has("Combo Master", player) + difficulty > LOGIC_NORMAL + and + ( + state.has_all({"High Jump", "Combo Master"}, player) + or state.has("High Jump", player, 2) + ) ) - or state.has("Progressive Glide", player) )) add_rule(kh1world.get_location("End of the World World Terminus Agrabah Chest"), lambda state: ( state.has("High Jump", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player) and state.has("Progressive Glide", player) - ) + ) #difficulty > LOGIC_PROUD and (can_dumbo_skip(state, player) or state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Monstro Chamber 6 White Trinity Chest"), lambda state: state.has("White Trinity", player)) add_rule(kh1world.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) and state.has("Hollow Bastion", player) - and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) + add_rule(kh1world.get_location("Traverse Town Secret Waterway Navi Gummi Event"), + lambda state: ( + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and state.has("Hollow Bastion", player) + and has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Deep Jungle Defeat Sabor White Fang Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Defeat Clayton Cure Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Seal Keyhole Jungle King Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Seal Keyhole Red Trinity Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event"), - lambda state: state.has("Entry Pass", player)) + lambda state: has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Olympus Coliseum Cloud Sonic Blade Event"), - lambda state: state.has("Entry Pass", player)) + lambda state: has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Defeat Trickmaster Blizzard Event"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Monstro Defeat Parasite Cage II Stop Event"), - lambda state: ( - state.has("High Jump", player) - or - ( - options.advanced_logic - and state.has("Progressive Glide", player) - ) - )) + lambda state: (has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)))) add_rule(kh1world.get_location("Halloween Town Defeat Oogie Boogie Holy Circlet Event"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Defeat Oogie's Manor Gravity Event"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Seal Keyhole Pumpkinhead Event"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Neverland Defeat Anti Sora Raven's Claw Event"), lambda state: state.has("Green Trinity", player)) @@ -810,18 +950,20 @@ def set_rules(kh1world): lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Neverland Seal Keyhole Glide Event"), lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Neverland Seal Keyhole Navi-G Piece Event"), + lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Neverland Defeat Captain Hook Ars Arcanum Event"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Riku II Ragnarok Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Behemoth Omega Arts Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Speak to Princesses Fire Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Traverse Town Mail Postcard 01 Event"), lambda state: state.has("Postcard", player)) add_rule(kh1world.get_location("Traverse Town Mail Postcard 02 Event"), @@ -844,130 +986,76 @@ def set_rules(kh1world): lambda state: state.has("Postcard", player, 10)) add_rule(kh1world.get_location("Traverse Town Defeat Opposite Armor Aero Event"), lambda state: state.has("Red Trinity", player)) + add_rule(kh1world.get_location("Traverse Town Defeat Opposite Armor Navi-G Piece Event"), + lambda state: state.has("Red Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not", - "Progressive Fire"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Neverland Defeat Hook Ansem's Report 9"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 1"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 2"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 3"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 4"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 5"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) + lambda state: + has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) and has_all_summons(state, player) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Traverse Town Geppetto's House Talk to Pinocchio"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Magician's Study Obtained All Arts Items"), lambda state: ( has_all_magic_lvx(state, player, 1) and has_all_arts(state, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, 0, hundred_acre_wood) #due to the softlock potential, I'm forcing it to logic normally instead of allowing the bypass )) add_rule(kh1world.get_location("Traverse Town Magician's Study Obtained All LV1 Magic"), lambda state: has_all_magic_lvx(state, player, 1)) add_rule(kh1world.get_location("Traverse Town Magician's Study Obtained All LV3 Magic"), lambda state: has_all_magic_lvx(state, player, 3)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 10 Puppies"), - lambda state: has_puppies(state, player, 10)) + lambda state: has_puppies(state, player, 10, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 20 Puppies"), - lambda state: has_puppies(state, player, 20)) + lambda state: has_puppies(state, player, 20, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 30 Puppies"), - lambda state: has_puppies(state, player, 30)) + lambda state: has_puppies(state, player, 30, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 40 Puppies"), - lambda state: has_puppies(state, player, 40)) + lambda state: has_puppies(state, player, 40, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 50 Puppies Reward 1"), - lambda state: has_puppies(state, player, 50)) + lambda state: has_puppies(state, player, 50, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 50 Puppies Reward 2"), - lambda state: has_puppies(state, player, 50)) + lambda state: has_puppies(state, player, 50, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 60 Puppies"), - lambda state: has_puppies(state, player, 60)) + lambda state: has_puppies(state, player, 60, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 70 Puppies"), - lambda state: has_puppies(state, player, 70)) + lambda state: has_puppies(state, player, 70, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 80 Puppies"), - lambda state: has_puppies(state, player, 80)) + lambda state: has_puppies(state, player, 80, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 90 Puppies"), - lambda state: has_puppies(state, player, 90)) + lambda state: has_puppies(state, player, 90, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1"), - lambda state: has_puppies(state, player, 99)) + lambda state: has_puppies(state, player, 99, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2"), - lambda state: has_puppies(state, player, 99)) + lambda state: has_puppies(state, player, 99, options.puppy_value.value)) add_rule(kh1world.get_location("Neverland Hold Aero Chest"), lambda state: state.has("Yellow Trinity", player)) add_rule(kh1world.get_location("Deep Jungle Camp Hi-Potion Experiment"), @@ -977,258 +1065,312 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Deep Jungle Camp Replication Experiment"), lambda state: state.has("Progressive Blizzard", player)) add_rule(kh1world.get_location("Deep Jungle Cliff Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Tree House Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Camp Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Bamboo Thicket Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Climbing Trees Save Gorillas"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 10 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 20 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 30 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 40 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 50 Fruits"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Bizarre Room Read Book"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Green Trinity"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Hero's License Event"), - lambda state: state.has("Entry Pass", player)) + lambda state: has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Cavern of Hearts Navi-G Piece Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Bizarre Room Navi-G Piece Event"), - lambda state: state.has("Footprints", player)) - add_rule(kh1world.get_location("Traverse Town Synth Log"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Traverse Town Synth 15 Items"), lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Cloth"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Rope"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Seagull Egg"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Fish"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Mushroom"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) + min(state.count("Orichalcum", player),9) + min(state.count("Mythril", player),9) >= 15 + and has_item_workshop(state, player, difficulty) )) + for i in range(33): + add_rule(kh1world.get_location("Traverse Town Synth Item " + str(i+1).rjust(2,'0')), + lambda state: ( + state.has("Orichalcum", player, 17) + and state.has("Mythril", player, 16) + and has_item_workshop(state, player, difficulty) + )) + add_item_rule(kh1world.get_location("Traverse Town Synth Item " + str(i+1).rjust(2,'0')), + lambda i: (i.player != player or i.name not in ["Orichalcum", "Mythril"])) add_rule(kh1world.get_location("Traverse Town Gizmo Shop Postcard 1"), lambda state: state.has("Progressive Thunder", player)) add_rule(kh1world.get_location("Traverse Town Gizmo Shop Postcard 2"), lambda state: state.has("Progressive Thunder", player)) add_rule(kh1world.get_location("Traverse Town Item Workshop Postcard"), - lambda state: ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - )) + lambda state: (has_item_workshop(state, player, difficulty))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Postcard"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)"), lambda state: ( ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) ) and state.has("Progressive Fire", player) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has("Progressive Glide", player) or state.has("Progressive Thunder", player) - or options.advanced_logic + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)"), lambda state: ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) )) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)"), lambda state: ( ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) ) and state.has("Red Trinity", player) )) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)"), lambda state: ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) )) add_rule(kh1world.get_location("Hollow Bastion Library Speak to Belle Divine Rose"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Library Speak to Aerith Cure"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + add_rule(kh1world.get_location("Traverse Town 1st District Blue Trinity by Exit Door"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Traverse Town 3rd District Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Traverse Town Magician's Study Blue Trinity"), + lambda state: ( + state.has_all({ + "Blue Trinity", + "Progressive Fire"}, player) + )) + add_rule(kh1world.get_location("Wonderland Lotus Forest Blue Trinity in Alcove"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Wonderland Lotus Forest Blue Trinity by Moving Boulder"), + lambda state: ( + state.has("Blue Trinity", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + )) + add_rule(kh1world.get_location("Agrabah Bazaar Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Monstro Mouth Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Monstro Throat Blue Trinity"), + lambda state: ( + state.has("Blue Trinity", player) + and has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + )) + add_rule(kh1world.get_location("Monstro Chamber 5 Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Hollow Bastion Great Crest Blue Trinity"), + lambda state: ( + state.has("Blue Trinity", player) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) + add_rule(kh1world.get_location("Hollow Bastion Dungeon Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Deep Jungle Treetop Green Trinity"), + lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Red Trinity"), + lambda state: state.has("Red Trinity", player)) + add_rule(kh1world.get_location("Wonderland Bizarre Room Examine Flower Pot"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Wonderland Lotus Forest Yellow Elixir Flower Through Painting"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Wonderland Lotus Forest Red Flower Raise Lily Pads"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Left Cushioned Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Left Pink Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Right Yellow Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Left Gray Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Right Brown Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Hollow Bastion Lift Stop from Waterway Examine Node"), + lambda state: ( + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player)) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) + )) + for i in range(1,13): + add_rule(kh1world.get_location("Neverland Clock Tower " + str(i).rjust(2, "0") + ":00 Door"), + lambda state: state.has("Green Trinity", player)) if options.hundred_acre_wood: add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or (difficulty > LOGIC_PROUD and state.has("Combo Master", player)) ) )) add_rule(kh1world.get_location("100 Acre Wood Pooh's House Owl Cheer"), - lambda state: has_torn_pages(state, player, 5)) + lambda state: state.has("Torn Page", player, 5)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 1"), - lambda state: has_torn_pages(state, player, 1)) + lambda state: state.has("Torn Page", player, 1)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 2"), - lambda state: has_torn_pages(state, player, 2)) + lambda state: state.has("Torn Page", player, 2)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 3"), - lambda state: has_torn_pages(state, player, 3)) + lambda state: state.has("Torn Page", player, 3)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 4"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 5"), - lambda state: has_torn_pages(state, player, 5)) + lambda state: state.has("Torn Page", player, 5)) add_rule(kh1world.get_location("100 Acre Wood Pooh's House Start Fire"), - lambda state: has_torn_pages(state, player, 3)) + lambda state: state.has("Torn Page", player, 3)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Break Log"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) if options.atlantica: add_rule(kh1world.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest"), lambda state: ( - state.has_all({ - "Progressive Fire", - "Crystal Trident"}, player) + state.has("Progressive Fire", player) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Triton's Palace White Trinity Chest"), lambda state: state.has("White Trinity", player)) add_rule(kh1world.get_location("Atlantica Defeat Ursula I Mermaid Kick Event"), lambda state: ( - has_offensive_magic(state, player) - and state.has("Crystal Trident", player) + has_offensive_magic(state, player, difficulty) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Defeat Ursula II Thunder Event"), lambda state: ( state.has("Mermaid Kick", player) - and has_offensive_magic(state, player) - and state.has("Crystal Trident", player) + and has_offensive_magic(state, player, difficulty) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Seal Keyhole Crabclaw Event"), lambda state: ( state.has("Mermaid Kick", player) - and has_offensive_magic(state, player) - and state.has("Crystal Trident", player) + and has_offensive_magic(state, player, difficulty) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Undersea Gorge Blizzard Clam"), lambda state: state.has("Progressive Blizzard", player)) @@ -1237,721 +1379,411 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Atlantica Triton's Palace Thunder Clam"), lambda state: state.has("Progressive Thunder", player)) add_rule(kh1world.get_location("Atlantica Cavern Nook Clam"), - lambda state: state.has("Crystal Trident", player)) + lambda state: has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Atlantica Defeat Ursula II Ansem's Report 3"), lambda state: ( - state.has_all({ - "Mermaid Kick", - "Crystal Trident"}, player) - and has_offensive_magic(state, player) - )) - if options.cups: - add_rule(kh1world.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + state.has("Mermaid Kick", player) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_offensive_magic(state, player, difficulty) )) + if options.cups.current_key != "off": + if options.cups.current_key == "hades_cup": + add_rule(kh1world.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) add_rule(kh1world.get_location("Complete Phil Cup"), lambda state: ( - state.has_all({ - "Phil Cup", - "Entry Pass"}, player) + state.has("Phil Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Phil Cup Solo"), lambda state: ( - state.has_all({ - "Phil Cup", - "Entry Pass"}, player) + state.has("Phil Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Phil Cup Time Trial"), lambda state: ( - state.has_all({ - "Phil Cup", - "Entry Pass"}, player) + state.has("Phil Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Pegasus Cup"), lambda state: ( - state.has_all({ - "Pegasus Cup", - "Entry Pass"}, player) + state.has("Pegasus Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Pegasus Cup Solo"), lambda state: ( - state.has_all({ - "Pegasus Cup", - "Entry Pass"}, player) + state.has("Pegasus Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Pegasus Cup Time Trial"), lambda state: ( - state.has_all({ - "Pegasus Cup", - "Entry Pass"}, player) + state.has("Pegasus Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Hercules Cup"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Complete Hercules Cup Solo"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Complete Hercules Cup Time Trial"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - )) - add_rule(kh1world.get_location("Complete Hades Cup"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Complete Hades Cup Solo"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Complete Hades Cup Time Trial"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Cloud and Leon Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Yuffie Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Cerberus Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Behemoth Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Hades Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hercules Cup Defeat Cloud Event"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hercules Cup Yellow Trinity Event"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - )) - add_rule(kh1world.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass", - "Guard"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) + if options.cups.current_key == "hades_cup": + add_rule(kh1world.get_location("Complete Hades Cup"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Complete Hades Cup Solo"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Complete Hades Cup Time Trial"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Cloud and Leon Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Yuffie Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Cerberus Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Behemoth Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Hades Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + if options.cups.current_key == "hades_cup" and options.super_bosses: + add_rule(kh1world.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and (state.has("Guard", player) or difficulty > LOGIC_PROUD) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) add_rule(kh1world.get_location("Olympus Coliseum Olympia Chest"), lambda state: ( state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - )) + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) if options.super_bosses: add_rule(kh1world.get_location("Neverland Defeat Phantom Stop Event"), lambda state: ( state.has("Green Trinity", player) - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and + ( + has_all_magic_lvx(state, player, 3) + or (difficulty > LOGIC_BEGINNER and has_all_magic_lvx(state, player, 2)) + or (difficulty > LOGIC_NORMAL and state.has_all({"Progressive Fire", "Progressive Blizzard", "Progressive Thunder", "Progressive Stop"}, player)) + or + ( + difficulty > LOGIC_PROUD + and state.has_any({"Progressive Fire","Progressive Blizzard"}, player) + and state.has_any({"Progressive Fire","Progressive Thunder"}, player) + and state.has_any({"Progressive Thunder","Progressive Blizzard"}, player) + and state.has("Progressive Stop", player) + ) + ) + and (state.has("Leaf Bracer", player) or difficulty > LOGIC_NORMAL) )) add_rule(kh1world.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and state.has("Progressive Blizzard", player, 3) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and + ( + state.has("Progressive Blizzard", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has_any_count({"Progressive Blizzard": 2, "Progressive Fire": 3,"Progressive Thunder": 3, "Progressive Gravity": 3}, player)) + or (difficulty > LOGIC_NORMAL and (state.has_any_count({"Progressive Blizzard": 1, "Progressive Fire": 2, "Progressive Thunder": 2, "Progressive Gravity": 2}, player))) + or (difficulty > LOGIC_PROUD and (state.has_any({"Progressive Fire", "Progressive Thunder", "Progressive Gravity"}, player) or (state.has_group("Magic", player) and state.has_all({"Mushu", "Genie", "Dumbo"}, player)))) + ) )) add_rule(kh1world.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) and state.has("Progressive Blizzard", player, 3) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and + ( + state.has("Progressive Blizzard", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has_any_count({"Progressive Blizzard": 2, "Progressive Fire": 3,"Progressive Thunder": 3, "Progressive Gravity": 3}, player)) + or (difficulty > LOGIC_NORMAL and (state.has_any_count({"Progressive Blizzard": 1, "Progressive Fire": 2, "Progressive Thunder": 2, "Progressive Gravity": 2}, player))) + or (difficulty > LOGIC_PROUD and (state.has_any({"Progressive Fire", "Progressive Thunder", "Progressive Gravity"}, player) or (state.has_group("Magic", player) and state.has_all({"Mushu", "Genie", "Dumbo"}, player)))) + ) )) - if options.super_bosses or options.goal.current_key == "sephiroth": + if options.super_bosses or options.final_rest_door_key.current_key == "sephiroth": add_rule(kh1world.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12"), lambda state: ( state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) )) add_rule(kh1world.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event"), lambda state: ( state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) )) - if options.super_bosses or options.goal.current_key == "unknown": + if options.super_bosses or options.final_rest_door_key.current_key == "unknown": add_rule(kh1world.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or state.has("Progressive Gravity", player)) )) add_rule(kh1world.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or state.has("Progressive Gravity", player)) )) - for i in range(options.level_checks): - add_rule(kh1world.get_location("Level " + str(i+1).rjust(3,'0')), + if options.jungle_slider: + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 10 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 20 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 30 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 40 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 50 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + if options.destiny_islands: + add_rule(kh1world.get_location("Destiny Islands Seashore Capture Fish 1 (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Seashore Capture Fish 2 (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Seashore Capture Fish 3 (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Seashore Gather Seagull Egg (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Secret Place Gather Mushroom (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Cove Gather Mushroom Near Zip Line (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Cove Gather Mushroom in Small Cave (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + #add_rule(kh1world.get_location("Destiny Islands Seashore Deliver Kairi Items (Day 1)"), + # lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Secret Place Gather Mushroom (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Cove Talk to Kairi (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Gather Drinking Water (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Chest"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + #add_rule(kh1world.get_location("Destiny Islands Cove Deliver Kairi Items (Day 2)"), + # lambda state: state.has("Raft Materials", player, homecoming_materials)) + for i in range(1,options.level_checks+1): + add_rule(kh1world.get_location("Level " + str(i+1).rjust(3,'0') + " (Slot 1)"), lambda state, level_num=i: ( - has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests) + has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) - if options.goal.current_key == "final_ansem": - add_rule(kh1world.get_location("Final Ansem"), - lambda state: ( - has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports, options.keyblades_unlock_chests, options.puppies) - )) - if options.keyblades_unlock_chests: - add_rule(kh1world.get_location("Traverse Town 1st District Candle Puzzle Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 1st District Accessory Shop Roof Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 2nd District Rooftop Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 2nd District Gizmo Shop Facade Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Balcony Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Blue Room Awning Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Corner Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Green Room Clock Puzzle Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Green Room Table Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Red Room Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Mystical House Yellow Trinity Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Accessory Shop Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Secret Waterway White Trinity Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Geppetto's House Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Item Workshop Right Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 1st District Blue Trinity Balcony Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Mystical House Glide Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Behind Crates Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Item Workshop Left Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Secret Waterway Near Stairs Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Green Trinity Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 1 Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 2 Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Bizarre Room Green Trinity Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Left Red Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Blue Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Red Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Thunder Plant Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Glide Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Nut Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Corner Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Bizarre Room Lamp Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Deep Jungle Tree House Beneath Tree House Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tree House Rooftop Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Center Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Left Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Right Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Vines Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Vines 2 Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Climbing Trees Blue Trinity Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tunnel Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Cavern of Hearts White Trinity Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Camp Blue Trinity Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tent Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Low Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Middle Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Wall Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Middle Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Cliff Right Cliff Left Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Cliff Right Cliff Right Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tree House Suspended Boat Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Agrabah Plaza By Storage Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Plaza Raised Terrace Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Plaza Top Corner Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Alley Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Bazaar Across Windows Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Bazaar High Corner Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Main Street Right Palace Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Main Street High Above Alley Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Palace Gates Low Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Palace Gates High Opposite Palace Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Palace Gates High Close to Palace Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Storage Green Trinity Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Storage Behind Barrel Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance Left Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hall High Left Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Above Fire Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Relic Chamber Stairs Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Bridge Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Right Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Left Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Aladdin's House Main Street Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Aladdin's House Plaza Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Other Platform Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Low Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Halloween Town Moonlight Hill White Trinity Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Bridge Under Bridge"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Boneyard Tombstone Puzzle Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Bridge Right of Gate Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery Behind Grave Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery By Cat Shape Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery Between Graves Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Hollow Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square High Tower Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Entrance Steps Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Inside Entrance Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Bridge Left of Gate Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery By Striped Grave Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Left Behind Columns Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Blizzaga Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Monstro Mouth Boat Deck Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth High Platform Boat Side Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth High Platform Across from Boat Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth Near Ship Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth Green Trinity Top of Boat Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 2 Ground Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 2 Platform Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Platform Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Ground Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth High Platform Near Teeth Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Atop Barrel Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Low 2nd Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Low 1st Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Neverland Pirate Ship Deck White Trinity Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Pirate Ship Crows Nest Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Right Blue Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Left Blue Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Galley Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Cabin Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Flight 1st Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Clock Tower Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Flight 2nd Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Green Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Captain's Cabin Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Water's Surface Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Under Water 1st Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls High Platform Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Castle Gates Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Castle Gates High Pillar Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Great Crest Lower Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Great Crest After Battle Platform Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion High Tower 2nd Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion High Tower 1st Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Library Top of Bookshelf Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Base Level Platform Near Entrance Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Base Level Near Crystal Switch Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Waterway Near Save Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Dungeon By Candles Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Dungeon Corner Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Grand Hall Steps Right Side Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Grand Hall Oblivion Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Grand Hall Left of Gate Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls White Trinity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 1st Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 2nd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 3rd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 4th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 5th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 6th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 10th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 9th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 8th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 7th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 3rd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 5th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 1st Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 4th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 2nd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Traverse Town Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Wonderland Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Olympus Coliseum Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Deep Jungle Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Agrabah Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Halloween Town Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Neverland Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus 100 Acre Wood Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Rest Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 White Trinity Chest"), - lambda state: state.has("Oblivion", player)) - if options.hundred_acre_wood: - add_rule(kh1world.get_location("100 Acre Wood Meadow Inside Log Chest"), - lambda state: state.has("Oathkeeper", player)) - add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest"), - lambda state: state.has("Oathkeeper", player)) - add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), - lambda state: state.has("Oathkeeper", player)) - add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), - lambda state: state.has("Oathkeeper", player)) - + if i+1 in kh1world.get_slot_2_levels(): + add_rule(kh1world.get_location("Level " + str(i+1).rjust(3,'0') + " (Slot 2)"), + lambda state, level_num=i: ( + has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) + add_rule(kh1world.get_location("Final Ansem"), + lambda state: ( + has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) # In logic, player is strong enough + and + ( + ( # Can DI Finish + state.has("Destiny Islands", player) + and state.has("Raft Materials", player, homecoming_materials) + ) + or + ( + ( # Has access to EotW + ( + has_lucky_emblems(state, player, eotw_required_lucky_emblems) + and end_of_the_world_unlock == "lucky_emblems" + ) + or state.has("End of the World", player) + ) + and has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_lucky_emblems) # Can open the Door + ) + ) + and has_defensive_tools(state, player, difficulty) + )) + for location in location_table.keys(): + try: + kh1world.get_location(location) + except KeyError: + continue + if difficulty == LOGIC_BEGINNER and location_table[location].behind_boss: + add_rule(kh1world.get_location(location), + lambda state: has_basic_tools(state, player)) + if options.remote_items.current_key == "off": + if location_table[location].type == "Static": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or item_table[i.name].type == "Item")) + if location_table[location].type == "Level Slot 1": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or item_table[i.name].category in ["Level Up", "Limited Level Up"])) + if location_table[location].type == "Level Slot 2": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or (item_table[i.name].category in ["Level Up", "Limited Level Up"] or item_table[i.name].type == "Ability"))) + if location_table[location].type == "Synth": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or (item_table[i.name].type == "Item"))) + if location_table[location].type == "Prize": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or (item_table[i.name].type == "Item"))) + if options.keyblades_unlock_chests: + if location_table[location].type == "Chest" or location in BROKEN_KEYBLADE_LOCKING_LOCATIONS: + location_world = location_table[location].category + location_required_keyblade = KEYBLADES[WORLDS.index(location_world)] + if location not in BROKEN_KEYBLADE_LOCKING_LOCATIONS: + add_rule(kh1world.get_location(location), + lambda state, location_required_keyblade = location_required_keyblade: state.has(location_required_keyblade, player)) + else: + add_rule(kh1world.get_location(location), + lambda state, location_required_keyblade = location_required_keyblade: state.has(location_required_keyblade, player) or difficulty > LOGIC_BEGINNER) + + if options.destiny_islands: + add_rule(kh1world.get_entrance("Destiny Islands"), + lambda state: state.has("Destiny Islands", player)) add_rule(kh1world.get_entrance("Wonderland"), - lambda state: state.has("Wonderland", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Wonderland", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Olympus Coliseum"), - lambda state: state.has("Olympus Coliseum", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Olympus Coliseum", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Deep Jungle"), - lambda state: state.has("Deep Jungle", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Deep Jungle", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Agrabah"), - lambda state: state.has("Agrabah", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Agrabah", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Monstro"), - lambda state: state.has("Monstro", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Monstro", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) if options.atlantica: add_rule(kh1world.get_entrance("Atlantica"), - lambda state: state.has("Atlantica", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Atlantica", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Halloween Town"), - lambda state: state.has("Halloween Town", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Halloween Town", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Neverland"), - lambda state: state.has("Neverland", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests)) + lambda state: state.has("Neverland", player) and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Hollow Bastion"), - lambda state: state.has("Hollow Bastion", player) and has_x_worlds(state, player, 5, options.keyblades_unlock_chests)) + lambda state: state.has("Hollow Bastion", player) and has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("End of the World"), - lambda state: has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and (has_reports(state, player, eotw_required_reports) or state.has("End of the World", player))) + lambda state: has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) and ((has_lucky_emblems(state, player, eotw_required_lucky_emblems) and end_of_the_world_unlock == "lucky_emblems") or state.has("End of the World", player))) add_rule(kh1world.get_entrance("100 Acre Wood"), lambda state: state.has("Progressive Fire", player)) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index ac0afca5..f14f6ea3 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -1,23 +1,29 @@ import logging +import re from typing import List +from math import ceil from BaseClasses import Tutorial from worlds.AutoWorld import WebWorld, World from .Items import KH1Item, KH1ItemData, event_item_table, get_items_by_category, item_table, item_name_groups -from .Locations import KH1Location, location_table, get_locations_by_category, location_name_groups +from .Locations import KH1Location, location_table, get_locations_by_type, location_name_groups from .Options import KH1Options, kh1_option_groups from .Regions import connect_entrances, create_regions from .Rules import set_rules from .Presets import kh1_option_presets -from worlds.LauncherComponents import Component, components, Type, launch as launch_component - +from worlds.LauncherComponents import Component, components, Type, launch as launch_component, icon_paths +from .GenerateJSON import generate_json +from .Data import VANILLA_KEYBLADE_STATS, VANILLA_PUPPY_LOCATIONS, CHAR_TO_KH, VANILLA_ABILITY_AP_COSTS, WORLD_KEY_ITEMS +from worlds.LauncherComponents import Component, components, Type, launch_subprocess def launch_client(): from .Client import launch launch_component(launch, name="KH1 Client") -components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT)) +components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT, icon="kh1_heart")) + +icon_paths["kh1_heart"] = f"ap:{__name__}/icons/kh1_heart.png" class KH1Web(WebWorld): @@ -54,6 +60,19 @@ class KH1World(World): fillers.update(get_items_by_category("Item")) fillers.update(get_items_by_category("Camping")) fillers.update(get_items_by_category("Stat Ups")) + slot_2_levels: list[int] + keyblade_stats: list[dict[str, int]] + starting_accessory_locations: list[str] + starting_accessories: list[str] + ap_costs: list[dict[str, str | int | bool]] + + def __init__(self, multiworld, player): + super(KH1World, self).__init__(multiworld, player) + self.slot_2_levels = None + self.keyblade_stats = None + self.starting_accessory_locations = None + self.starting_accessories = None + self.ap_costs = None def create_items(self): self.place_predetermined_items() @@ -63,12 +82,29 @@ class KH1World(World): possible_starting_worlds = ["Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Halloween Town", "Neverland", "Hollow Bastion"] if self.options.atlantica: possible_starting_worlds.append("Atlantica") + if self.options.destiny_islands: + possible_starting_worlds.append("Destiny Islands") if self.options.end_of_the_world_unlock == "item": possible_starting_worlds.append("End of the World") starting_worlds = self.random.sample(possible_starting_worlds, min(self.options.starting_worlds.value, len(possible_starting_worlds))) for starting_world in starting_worlds: self.multiworld.push_precollected(self.create_item(starting_world)) + # Handle starting tools + starting_tools = [] + if self.options.starting_tools: + starting_tools = ["Scan", "Dodge Roll"] + self.multiworld.push_precollected(self.create_item("Scan")) + self.multiworld.push_precollected(self.create_item("Dodge Roll")) + + # Handle starting party member accessories + starting_party_member_accessories = [] + starting_party_member_locations = [] + starting_party_member_locations = self.get_starting_accessory_locations() + starting_party_member_accessories = self.get_starting_accessories() + for i in range(len(starting_party_member_locations)): + self.get_location(self.starting_accessory_locations[i]).place_locked_item(self.create_item(self.starting_accessories[i])) + item_pool: List[KH1Item] = [] possible_level_up_item_pool = [] level_up_item_pool = [] @@ -94,19 +130,26 @@ class KH1World(World): # Fill remaining pool with items from other pool self.random.shuffle(possible_level_up_item_pool) - level_up_item_pool = level_up_item_pool + possible_level_up_item_pool[:(100 - len(level_up_item_pool))] - - level_up_locations = list(get_locations_by_category("Levels").keys()) + level_up_item_pool = level_up_item_pool + possible_level_up_item_pool[:(99 - len(level_up_item_pool))] + + level_up_locations = list(get_locations_by_type("Level Slot 1").keys()) self.random.shuffle(level_up_item_pool) - current_level_for_placing_stats = self.options.force_stats_on_levels.value - while len(level_up_item_pool) > 0 and current_level_for_placing_stats <= self.options.level_checks: - self.get_location(level_up_locations[current_level_for_placing_stats - 1]).place_locked_item(self.create_item(level_up_item_pool.pop())) - current_level_for_placing_stats += 1 + current_level_index_for_placing_stats = self.options.force_stats_on_levels.value - 2 # Level 2 is index 0, Level 3 is index 1, etc + if self.options.remote_items.current_key == "off" and self.options.force_stats_on_levels.value != 2: + logging.info(f"{self.player_name}'s value {self.options.force_stats_on_levels.value} for force_stats_on_levels was changed\n" + f"Set to 2 as remote_items if \"off\"") + self.options.force_stats_on_levels.value = 2 + current_level_index_for_placing_stats = 0 + while len(level_up_item_pool) > 0 and current_level_index_for_placing_stats < self.options.level_checks: # With all levels in location pool, 99 level ups so need to go index 0-98 + self.get_location(level_up_locations[current_level_index_for_placing_stats]).place_locked_item(self.create_item(level_up_item_pool.pop())) + current_level_index_for_placing_stats += 1 + + # Calculate prefilled locations and items - prefilled_items = [] - if self.options.vanilla_emblem_pieces: - prefilled_items = prefilled_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] + exclude_items = ["Final Door Key", "Lucky Emblem"] + if not self.options.randomize_emblem_pieces: + exclude_items = exclude_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] total_locations = len(self.multiworld.get_unfilled_locations(self.player)) @@ -117,27 +160,29 @@ class KH1World(World): quantity = data.max_quantity if data.category not in non_filler_item_categories: continue - if name in starting_worlds: + if name in starting_worlds or name in starting_tools or name in starting_party_member_accessories: continue - if data.category == "Puppies": - if self.options.puppies == "triplets" and "-" in name: - item_pool += [self.create_item(name) for _ in range(quantity)] - if self.options.puppies == "individual" and "Puppy" in name: - item_pool += [self.create_item(name) for _ in range(0, quantity)] - if self.options.puppies == "full" and name == "All Puppies": - item_pool += [self.create_item(name) for _ in range(0, quantity)] + if self.options.stacking_world_items and name in WORLD_KEY_ITEMS.keys() and name not in ("Crystal Trident", "Jack-In-The-Box"): # Handling these special cases separately + item_pool += [self.create_item(WORLD_KEY_ITEMS[name]) for _ in range(0, 1)] + elif self.options.halloween_town_key_item_bundle and name == "Jack-In-The-Box": + continue + elif name == "Puppy": + if self.options.randomize_puppies: + item_pool += [self.create_item(name) for _ in range(ceil(99/self.options.puppy_value.value))] elif name == "Atlantica": if self.options.atlantica: item_pool += [self.create_item(name) for _ in range(0, quantity)] elif name == "Mermaid Kick": - if self.options.atlantica: - if self.options.extra_shared_abilities: - item_pool += [self.create_item(name) for _ in range(0, 2)] - else: - item_pool += [self.create_item(name) for _ in range(0, quantity)] + if self.options.atlantica and self.options.extra_shared_abilities: + item_pool += [self.create_item(name) for _ in range(0, 2)] + else: + item_pool += [self.create_item(name) for _ in range(0, quantity)] elif name == "Crystal Trident": if self.options.atlantica: - item_pool += [self.create_item(name) for _ in range(0, quantity)] + if self.options.stacking_world_items: + item_pool += [self.create_item(WORLD_KEY_ITEMS[name]) for _ in range(0, 1)] + else: + item_pool += [self.create_item(name) for _ in range(0, quantity)] elif name == "High Jump": if self.options.extra_shared_abilities: item_pool += [self.create_item(name) for _ in range(0, 3)] @@ -154,11 +199,26 @@ class KH1World(World): elif name == "EXP Zero": if self.options.exp_zero_in_pool: item_pool += [self.create_item(name) for _ in range(0, quantity)] - elif name not in prefilled_items: + elif name == "Postcard": + if self.options.randomize_postcards.current_key == "chests": + item_pool += [self.create_item(name) for _ in range(0, 3)] + if self.options.randomize_postcards.current_key == "all": + item_pool += [self.create_item(name) for _ in range(0, quantity)] + elif name == "Orichalcum": + item_pool += [self.create_item(name) for _ in range(0, self.options.orichalcum_in_pool.value)] + elif name == "Mythril": + item_pool += [self.create_item(name) for _ in range(0, self.options.mythril_in_pool.value)] + elif name == "Destiny Islands": + if self.options.destiny_islands: + item_pool += [self.create_item(name) for _ in range(0, quantity)] + elif name == "Raft Materials": + if self.options.destiny_islands: + item_pool += [self.create_item(name) for _ in range(0, self.options.materials_in_pool.value)] + elif name not in exclude_items: item_pool += [self.create_item(name) for _ in range(0, quantity)] - for i in range(self.determine_reports_in_pool()): - item_pool += [self.create_item("Ansem's Report " + str(i+1))] + for i in range(self.determine_lucky_emblems_in_pool()): + item_pool += [self.create_item("Lucky Emblem")] while len(item_pool) < total_locations and len(level_up_item_pool) > 0: item_pool += [self.create_item(level_up_item_pool.pop())] @@ -170,63 +230,117 @@ class KH1World(World): self.multiworld.itempool += item_pool def place_predetermined_items(self) -> None: - goal_dict = { - "sephiroth": "Olympus Coliseum Defeat Sephiroth Ansem's Report 12", - "unknown": "Hollow Bastion Defeat Unknown Ansem's Report 13", - "postcards": "Traverse Town Mail Postcard 10 Event", - "final_ansem": "Final Ansem", - "puppies": "Traverse Town Piano Room Return 99 Puppies Reward 2", - "final_rest": "End of the World Final Rest Chest" - } - self.get_location(goal_dict[self.options.goal.current_key]).place_locked_item(self.create_item("Victory")) - if self.options.vanilla_emblem_pieces: + if self.options.final_rest_door_key.current_key not in ["puppies", "postcards", "lucky_emblems"]: + goal_dict = { + "sephiroth": "Olympus Coliseum Defeat Sephiroth Ansem's Report 12", + "unknown": "Hollow Bastion Defeat Unknown Ansem's Report 13", + "final_rest": "End of the World Final Rest Chest" + } + goal_location_name = goal_dict[self.options.final_rest_door_key.current_key] + elif self.options.final_rest_door_key.current_key == "postcards": + lpad_number = str(self.options.required_postcards).rjust(2, "0") + goal_location_name = "Traverse Town Mail Postcard " + lpad_number + " Event" + elif self.options.final_rest_door_key.current_key == "puppies": + required_puppies = self.options.required_puppies.value + goal_location_name = "Traverse Town Piano Room Return " + str(required_puppies) + " Puppies" + if required_puppies == 50 or required_puppies == 99: + goal_location_name = goal_location_name + " Reward 2" + if self.options.final_rest_door_key.current_key != "lucky_emblems": + self.get_location(goal_location_name).place_locked_item(self.create_item("Final Door Key")) + self.get_location("Final Ansem").place_locked_item(self.create_event("Victory")) + + if not self.options.randomize_emblem_pieces: self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)").place_locked_item(self.create_item("Emblem Piece (Flame)")) self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)").place_locked_item(self.create_item("Emblem Piece (Statue)")) self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)").place_locked_item(self.create_item("Emblem Piece (Fountain)")) self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)").place_locked_item(self.create_item("Emblem Piece (Chest)")) + if self.options.randomize_postcards != "all": + self.get_location("Traverse Town Item Shop Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 1st District Safe Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Gizmo Shop Postcard 1").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Gizmo Shop Postcard 2").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Item Workshop Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 3rd District Balcony Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Geppetto's House Postcard").place_locked_item(self.create_item("Postcard")) + if self.options.randomize_postcards.current_key == "vanilla": + self.get_location("Traverse Town 1st District Accessory Shop Roof Chest").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 1st District Blue Trinity Balcony Chest").place_locked_item(self.create_item("Postcard")) + if not self.options.randomize_puppies: + if self.options.puppy_value.value != 3: + self.options.puppy_value.value = 3 + logging.info(f"{self.player_name}'s value of {self.options.puppy_value.value} for puppy value was changed to 3 as Randomize Puppies is OFF") + for i, location in enumerate(VANILLA_PUPPY_LOCATIONS): + self.get_location(location).place_locked_item(self.create_item("Puppy")) def get_filler_item_name(self) -> str: weights = [data.weight for data in self.fillers.values()] return self.random.choices([filler for filler in self.fillers.keys()], weights)[0] def fill_slot_data(self) -> dict: - slot_data = {"xpmult": int(self.options.exp_multiplier)/16, - "required_reports_eotw": self.determine_reports_required_to_open_end_of_the_world(), - "required_reports_door": self.determine_reports_required_to_open_final_rest_door(), - "door": self.options.final_rest_door.current_key, - "seed": self.multiworld.seed_name, - "advanced_logic": bool(self.options.advanced_logic), - "hundred_acre_wood": bool(self.options.hundred_acre_wood), + slot_data = { "atlantica": bool(self.options.atlantica), - "goal": str(self.options.goal.current_key)} - if self.options.randomize_keyblade_stats: - min_str_bonus = min(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) - max_str_bonus = max(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) - self.options.keyblade_min_str.value = min_str_bonus - self.options.keyblade_max_str.value = max_str_bonus - min_mp_bonus = min(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) - max_mp_bonus = max(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) - self.options.keyblade_min_mp.value = min_mp_bonus - self.options.keyblade_max_mp.value = max_mp_bonus - slot_data["keyblade_stats"] = "" - for i in range(22): - if i < 4 and self.options.bad_starting_weapons: - slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + "1,0," - else: - str_bonus = int(self.random.randint(min_str_bonus, max_str_bonus)) - mp_bonus = int(self.random.randint(min_mp_bonus, max_mp_bonus)) - slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + str(str_bonus) + "," + str(mp_bonus) + "," - slot_data["keyblade_stats"] = slot_data["keyblade_stats"][:-1] - if self.options.donald_death_link: - slot_data["donalddl"] = "" - if self.options.goofy_death_link: - slot_data["goofydl"] = "" - if self.options.keyblades_unlock_chests: - slot_data["chestslocked"] = "" - else: - slot_data["chestsunlocked"] = "" - if self.options.interact_in_battle: - slot_data["interactinbattle"] = "" + "auto_attack": bool(self.options.auto_attack), + "auto_save": bool(self.options.auto_save), + "bad_starting_weapons": bool(self.options.bad_starting_weapons), + "beep_hack": bool(self.options.beep_hack), + "consistent_finishers": bool(self.options.consistent_finishers), + "cups": str(self.options.cups.current_key), + "day_2_materials": int(self.options.day_2_materials.value), + "death_link": str(self.options.death_link.current_key), + "destiny_islands": bool(self.options.destiny_islands), + "donald_death_link": bool(self.options.donald_death_link), + "early_skip": bool(self.options.early_skip), + "end_of_the_world_unlock": str(self.options.end_of_the_world_unlock.current_key), + "exp_multiplier": int(self.options.exp_multiplier.value)/16, + "exp_zero_in_pool": bool(self.options.exp_zero_in_pool), + "extra_shared_abilities": bool(self.options.extra_shared_abilities), + "fast_camera": bool(self.options.fast_camera), + "faster_animations": bool(self.options.faster_animations), + "final_rest_door_key": str(self.options.final_rest_door_key.current_key), + "force_stats_on_levels": int(self.options.force_stats_on_levels.value), + "four_by_three": bool(self.options.four_by_three), + "goofy_death_link": bool(self.options.goofy_death_link), + "halloween_town_key_item_bundle": bool(self.options.halloween_town_key_item_bundle), + "homecoming_materials": int(self.options.homecoming_materials.value), + "hundred_acre_wood": bool(self.options.hundred_acre_wood), + "interact_in_battle": bool(self.options.interact_in_battle), + "jungle_slider": bool(self.options.jungle_slider), + "keyblades_unlock_chests": bool(self.options.keyblades_unlock_chests), + "level_checks": int(self.options.level_checks.value), + "logic_difficulty": str(self.options.logic_difficulty.current_key), + "materials_in_pool": int(self.options.materials_in_pool.value), + "max_ap_cost": int(self.options.max_ap_cost.value), + "min_ap_cost": int(self.options.min_ap_cost.value), + "mythril_in_pool": int(self.options.mythril_in_pool.value), + "mythril_price": int(self.options.mythril_price.value), + "one_hp": bool(self.options.one_hp), + "orichalcum_in_pool": int(self.options.orichalcum_in_pool.value), + "orichalcum_price": int(self.options.orichalcum_price.value), + "puppy_value": int(self.options.puppy_value.value), + "randomize_ap_costs": str(self.options.randomize_ap_costs.current_key), + "randomize_emblem_pieces": bool(self.options.exp_zero_in_pool), + "randomize_party_member_starting_accessories": bool(self.options.randomize_party_member_starting_accessories), + "randomize_postcards": str(self.options.randomize_postcards.current_key), + "randomize_puppies": str(self.options.randomize_puppies.current_key), + "remote_items": str(self.options.remote_items.current_key), + "remote_location_ids": self.get_remote_location_ids(), + "required_lucky_emblems_door": self.determine_lucky_emblems_required_to_open_final_rest_door(), + "required_lucky_emblems_eotw": self.determine_lucky_emblems_required_to_open_end_of_the_world(), + "required_postcards": int(self.options.required_postcards.value), + "required_puppies": int(self.options.required_puppies.value), + "seed": self.multiworld.seed_name, + "shorten_go_mode": bool(self.options.shorten_go_mode), + "slot_2_level_checks": int(self.options.slot_2_level_checks.value), + "stacking_world_items": bool(self.options.stacking_world_items), + "starting_items": [item.code for item in self.multiworld.precollected_items[self.player]], + "starting_tools": bool(self.options.starting_tools), + "super_bosses": bool(self.options.super_bosses), + "synthesis_item_name_byte_arrays": self.get_synthesis_item_name_byte_arrays(), + "unlock_0_volume": bool(self.options.unlock_0_volume), + "unskippable": bool(self.options.unskippable), + "warp_anywhere": bool(self.options.warp_anywhere) + } return slot_data def create_item(self, name: str) -> KH1Item: @@ -241,45 +355,260 @@ class KH1World(World): set_rules(self) def create_regions(self): - create_regions(self.multiworld, self.player, self.options) - + create_regions(self) + def connect_entrances(self): - connect_entrances(self.multiworld, self.player) + connect_entrances(self) + + def generate_output(self, output_directory: str): + """ + Generates the json file for use with mod generator. + """ + generate_json(self, output_directory) def generate_early(self): - value_names = ["Reports to Open End of the World", "Reports to Open Final Rest Door", "Reports in Pool"] - initial_report_settings = [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value] - self.change_numbers_of_reports_to_consider() - new_report_settings = [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value] + self.determine_level_checks() + + value_names = ["Lucky Emblems to Open End of the World", "Lucky Emblems to Open Final Rest Door", "Lucky Emblems in Pool"] + initial_lucky_emblem_settings = [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value] + self.change_numbers_of_lucky_emblems_to_consider() + new_lucky_emblem_settings = [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value] for i in range(3): - if initial_report_settings[i] != new_report_settings[i]: - logging.info(f"{self.player_name}'s value {initial_report_settings[i]} for \"{value_names[i]}\" was invalid\n" - f"Setting \"{value_names[i]}\" value to {new_report_settings[i]}") + if initial_lucky_emblem_settings[i] != new_lucky_emblem_settings[i]: + logging.info(f"{self.player_name}'s value {initial_lucky_emblem_settings[i]} for \"{value_names[i]}\" was invalid\n" + f"Setting \"{value_names[i]}\" value to {new_lucky_emblem_settings[i]}") + + value_names = ["Day 2 Materials", "Homecoming Materials", "Materials in Pool"] + initial_materials_settings = [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value] + self.change_numbers_of_materials_to_consider() + new_materials_settings = [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value] + for i in range(3): + if initial_materials_settings[i] != new_materials_settings[i]: + logging.info(f"{self.player_name}'s value {initial_materials_settings[i]} for \"{value_names[i]}\" was invalid\n" + f"Setting \"{value_names[i]}\" value to {new_materials_settings[i]}") + + if self.options.stacking_world_items.value and not self.options.halloween_town_key_item_bundle.value: + logging.info(f"{self.player_name}'s value {self.options.halloween_town_key_item_bundle.value} for Halloween Town Key Item Bundle must be TRUE when Stacking World Items is on. Setting to TRUE") + self.options.halloween_town_key_item_bundle.value = True - def change_numbers_of_reports_to_consider(self) -> None: - if self.options.end_of_the_world_unlock == "reports" and self.options.final_rest_door == "reports": - self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value = sorted( - [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value]) + def change_numbers_of_lucky_emblems_to_consider(self) -> None: + if self.options.end_of_the_world_unlock == "lucky_emblems" and self.options.final_rest_door_key == "lucky_emblems": + self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value = sorted( + [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value]) - elif self.options.end_of_the_world_unlock == "reports": - self.options.required_reports_eotw.value, self.options.reports_in_pool.value = sorted( - [self.options.required_reports_eotw.value, self.options.reports_in_pool.value]) + elif self.options.end_of_the_world_unlock == "lucky_emblems": + self.options.required_lucky_emblems_eotw.value, self.options.lucky_emblems_in_pool.value = sorted( + [self.options.required_lucky_emblems_eotw.value, self.options.lucky_emblems_in_pool.value]) - elif self.options.final_rest_door == "reports": - self.options.required_reports_door.value, self.options.reports_in_pool.value = sorted( - [self.options.required_reports_door.value, self.options.reports_in_pool.value]) + elif self.options.final_rest_door_key == "lucky_emblems": + self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value = sorted( + [self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value]) - def determine_reports_in_pool(self) -> int: - if self.options.end_of_the_world_unlock == "reports" or self.options.final_rest_door == "reports": - return self.options.reports_in_pool.value + def determine_lucky_emblems_in_pool(self) -> int: + if self.options.end_of_the_world_unlock == "lucky_emblems" or self.options.final_rest_door_key == "lucky_emblems": + return self.options.lucky_emblems_in_pool.value return 0 - def determine_reports_required_to_open_end_of_the_world(self) -> int: - if self.options.end_of_the_world_unlock == "reports": - return self.options.required_reports_eotw.value - return 14 + def determine_lucky_emblems_required_to_open_end_of_the_world(self) -> int: + if self.options.end_of_the_world_unlock == "lucky_emblems": + return self.options.required_lucky_emblems_eotw.value + return -1 - def determine_reports_required_to_open_final_rest_door(self) -> int: - if self.options.final_rest_door == "reports": - return self.options.required_reports_door.value - return 14 + def determine_lucky_emblems_required_to_open_final_rest_door(self) -> int: + if self.options.final_rest_door_key == "lucky_emblems": + return self.options.required_lucky_emblems_door.value + return -1 + + def change_numbers_of_materials_to_consider(self) -> None: + if self.options.destiny_islands: + self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value = sorted( + [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value]) + + def get_remote_location_ids(self): + remote_location_ids = [] + for location in self.multiworld.get_filled_locations(self.player): + if location.name != "Final Ansem": + location_data = location_table[location.name] + if self.options.remote_items.current_key == "full": + if location_data.type != "Starting Accessory": + remote_location_ids.append(location_data.code) + elif self.player == location.item.player and location.item.name != "Victory": + item_data = item_table[location.item.name] + if location_data.type == "Chest": + if item_data.type in ["Stats"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Reward": + if item_data.type in ["Stats"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Static": + if item_data.type not in ["Item"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Level Slot 1": + if item_data.category not in ["Level Up", "Limited Level Up"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Level Slot 2": + if item_data.category not in ["Level Up", "Limited Level Up", "Abilities"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Synth": + if item_data.type not in ["Item"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Prize": + if item_data.type not in ["Item"]: + remote_location_ids.append(location_data.code) + return remote_location_ids + + def get_slot_2_levels(self): + if self.slot_2_levels is None: + self.slot_2_levels = [] + if self.options.max_level_for_slot_2_level_checks - 1 > self.options.level_checks.value: + logging.info(f"{self.player_name}'s value of {self.options.max_level_for_slot_2_level_checks.value} for max level for slot 2 level checks is invalid as it exceeds their value of {self.options.level_checks.value} for Level Checks\n" + f"Setting max level for slot 2 level checks's value to {self.options.level_checks.value + 1}") + self.options.max_level_for_slot_2_level_checks.value = self.options.level_checks.value + 1 + if self.options.slot_2_level_checks.value > self.options.level_checks.value: + logging.info(f"{self.player_name}'s value of {self.options.slot_2_level_checks.value} for slot 2 level checks is invalid as it exceeds their value of {self.options.level_checks.value} for Level Checks\n" + f"Setting slot 2 level check's value to {self.options.level_checks.value}") + self.options.slot_2_level_checks.value = self.options.level_checks.value + if self.options.slot_2_level_checks > self.options.max_level_for_slot_2_level_checks - 1: + logging.info(f"{self.player_name}'s value of {self.options.slot_2_level_checks.value} for slot 2 level checks is invalid as it exceeds their value of {self.options.max_level_for_slot_2_level_checks.value} for Max Level for Slot 2 Level Checks\n" + f"Setting slot 2 level check's value to {self.options.max_level_for_slot_2_level_checks.value - 1}") + self.options.slot_2_level_checks.value = self.options.max_level_for_slot_2_level_checks.value - 1 + # Range is exclusive of the top, so if max_level_for_slot_2_level_checks is 2 then the top end of the range needs to be 3 as the only level it can choose is 2. + self.slot_2_levels = self.random.sample(range(2,self.options.max_level_for_slot_2_level_checks.value + 1), self.options.slot_2_level_checks.value) + return self.slot_2_levels + + def get_keyblade_stats(self): + # Create keyblade stat array from vanilla + keyblade_stats = [x.copy() for x in VANILLA_KEYBLADE_STATS] + # Handle shuffling keyblade stats + if self.options.keyblade_stats != "vanilla": + if self.options.keyblade_stats == "randomize": + # Fix any minimum and max values from settings + min_str_bonus = min(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) + max_str_bonus = max(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) + self.options.keyblade_min_str.value = min_str_bonus + self.options.keyblade_max_str.value = max_str_bonus + min_crit_rate = min(self.options.keyblade_min_crit_rate.value, self.options.keyblade_max_crit_rate.value) + max_crit_rate = max(self.options.keyblade_min_crit_rate.value, self.options.keyblade_max_crit_rate.value) + self.options.keyblade_min_crit_rate.value = min_crit_rate + self.options.keyblade_max_crit_rate.value = max_crit_rate + min_crit_str = min(self.options.keyblade_min_crit_str.value, self.options.keyblade_max_crit_str.value) + max_crit_str = max(self.options.keyblade_min_crit_str.value, self.options.keyblade_max_crit_str.value) + self.options.keyblade_min_crit_str.value = min_crit_str + self.options.keyblade_max_crit_str.value = max_crit_str + min_recoil = min(self.options.keyblade_min_recoil.value, self.options.keyblade_max_recoil.value) + max_recoil = max(self.options.keyblade_min_recoil.value, self.options.keyblade_max_recoil.value) + self.options.keyblade_min_recoil.value = min_recoil + self.options.keyblade_max_recoil.value = max_recoil + min_mp_bonus = min(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) + max_mp_bonus = max(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) + self.options.keyblade_min_mp.value = min_mp_bonus + self.options.keyblade_max_mp.value = max_mp_bonus + if self.options.bad_starting_weapons: + starting_weapons = keyblade_stats[:4] + other_weapons = keyblade_stats[4:] + else: + starting_weapons = [] + other_weapons = keyblade_stats + for keyblade in other_weapons: + keyblade["STR"] = self.random.randint(min_str_bonus, max_str_bonus) + keyblade["CRR"] = self.random.randint(min_crit_rate, max_crit_rate) + keyblade["CRB"] = self.random.randint(min_crit_str, max_crit_str) + keyblade["REC"] = self.random.randint(min_recoil, max_recoil) + keyblade["MP"] = self.random.randint(min_mp_bonus, max_mp_bonus) + keyblade_stats = starting_weapons + other_weapons + elif self.options.keyblade_stats == "shuffle": + if self.options.bad_starting_weapons: + starting_weapons = keyblade_stats[:4] + other_weapons = keyblade_stats[4:] + self.random.shuffle(other_weapons) + keyblade_stats = starting_weapons + other_weapons + else: + self.random.shuffle(keyblade_stats) + return keyblade_stats + + def determine_level_checks(self): + # Handle if remote_items is off and level_checks > number of stats items + total_level_up_items = min(99, + self.options.strength_increase.value +\ + self.options.defense_increase.value +\ + self.options.hp_increase.value +\ + self.options.mp_increase.value +\ + self.options.ap_increase.value +\ + self.options.accessory_slot_increase.value +\ + self.options.item_slot_increase.value) + if self.options.level_checks.value > total_level_up_items and self.options.remote_items.current_key == "off": + logging.info(f"{self.player_name}'s value {self.options.level_checks.value} for level_checks was changed.\n" + f"This value cannot be more than the number of stat items in the pool when \"remote_items\" is \"off\".\n" + f"Set to be equal to number of stat items in pool, {total_level_up_items}.") + self.options.level_checks.value = total_level_up_items + + def get_synthesis_item_name_byte_arrays(self): + # Get synth item names to show in synthesis menu + synthesis_byte_arrays = [] + for location in self.multiworld.get_filled_locations(self.player): + if location.name != "Final Ansem": + location_data = location_table[location.name] + if location_data.type == "Synth": + item_name = re.sub('[^A-Za-z0-9 ]+', '',str(location.item.name.replace("Progressive", "Prog")))[:14] + byte_array = [] + for character in item_name: + byte_array.append(CHAR_TO_KH[character]) + synthesis_byte_arrays.append(byte_array) + return synthesis_byte_arrays + + def get_starting_accessory_locations(self): + if self.starting_accessory_locations is None: + if self.options.randomize_party_member_starting_accessories: + self.starting_accessory_locations = list(get_locations_by_type("Starting Accessory").keys()) + if not self.options.atlantica: + self.starting_accessory_locations.remove("Ariel Starting Accessory 1") + self.starting_accessory_locations.remove("Ariel Starting Accessory 2") + self.starting_accessory_locations.remove("Ariel Starting Accessory 3") + self.starting_accessory_locations = self.random.sample(self.starting_accessory_locations, 10) + else: + self.starting_accessory_locations = [] + return self.starting_accessory_locations + + def get_starting_accessories(self): + if self.starting_accessories is None: + if self.options.randomize_party_member_starting_accessories: + self.starting_accessories = list(get_items_by_category("Accessory").keys()) + self.starting_accessories = self.random.sample(self.starting_accessories, 10) + else: + self.starting_accessories = [] + return self.starting_accessories + + def get_ap_costs(self): + if self.ap_costs is None: + ap_costs = VANILLA_ABILITY_AP_COSTS.copy() + if self.options.randomize_ap_costs.current_key == "shuffle": + possible_costs = [] + for ap_cost in VANILLA_ABILITY_AP_COSTS: + if ap_cost["Randomize"]: + possible_costs.append(ap_cost["AP Cost"]) + self.random.shuffle(possible_costs) + for ap_cost in ap_costs: + if ap_cost["Randomize"]: + ap_cost["AP Cost"] = possible_costs.pop(0) + elif self.options.randomize_ap_costs.current_key == "randomize": + for ap_cost in ap_costs: + if ap_cost["Randomize"]: + ap_cost["AP Cost"] = self.random.randint(self.options.min_ap_cost.value, self.options.max_ap_cost.value) + elif self.options.randomize_ap_costs.current_key == "distribute": + total_ap_value = 0 + for ap_cost in VANILLA_ABILITY_AP_COSTS: + if ap_cost["Randomize"]: + total_ap_value = total_ap_value + ap_cost["AP Cost"] + for ap_cost in ap_costs: + if ap_cost["Randomize"]: + total_ap_value = total_ap_value - self.options.min_ap_cost.value + ap_cost["AP Cost"] = self.options.min_ap_cost.value + while total_ap_value > 0: + ap_cost = self.random.choice(ap_costs) + if ap_cost["Randomize"]: + if ap_cost["AP Cost"] < self.options.max_ap_cost.value: + amount_to_add = self.random.randint(1, min(self.options.max_ap_cost.value - ap_cost["AP Cost"], total_ap_value)) + ap_cost["AP Cost"] = ap_cost["AP Cost"] + amount_to_add + total_ap_value = total_ap_value - amount_to_add + self.ap_costs = ap_costs + return self.ap_costs diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 5167505e..f0862672 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -7,7 +7,7 @@ configure and export a config file. ## What does randomization do to this game? -The Kingdom Hearts AP Randomizer randomizes most rewards in the game and adds several items which are used to unlock worlds, Olympus Coliseum cups, and world progression. +The Kingdom Hearts AP Randomizer randomizes rewards in the game and adds several items which are used to unlock worlds, Olympus Coliseum cups, and world progression. Worlds can only be accessed by finding the corresponding item. For example, you need to find the `Monstro` item to enter Monstro. @@ -21,49 +21,26 @@ Any weapon, accessory, spell, trinity, summon, world, key item, stat up, consuma ### Locations -Locations the player can find items include chests, event rewards, Atlantica clams, level up rewards, 101 Dalmatian rewards, and postcard rewards. +Locations the player can find items include: +- Chests +- Rewards +- Static Events +- Map Prizes from things such as Trinities, Wonderland flowers and chairs, etc. +- Level ups ## Which items can be in another player's world? Any of the items which can be shuffled may also be placed into another player's world. It is possible to choose to limit certain items to your own world. + ## When the player receives an item, what happens? -When the player receives an item, your client will display a message displaying the item you have obtained. You will also see a notification in the "LEVEL UP" box. +When the player receives an item, your client will display a message displaying the item you have obtained. You will also see a notification in the "INFORMATION" box. ## What do I do if I encounter a bug with the game? Please reach out to Gicu#7034 on Discord. -## How do I progress in a certain world? - -### The evidence boxes aren't spawning in Wonderland. - -Find `Footprints` in the multiworld. - -### I can't enter any cups in Olympus Coliseum. - -Firstly, find `Entry Pass` in the multiworld. Additionally, `Phil Cup`, `Pegasus Cup`, and `Hercules Cup` are all multiworld items. Finding all 3 grant you access to the Hades Cup and the Platinum Match. Clearing all cups lets you challenge Ice Titan. - -### The slides aren't spawning in Deep Jungle. - -Find `Slides` in the multiworld. - -### I can't progress in Atlantica. -Find `Crystal Trident` in the multiworld. - -### I can't progress in Halloween Town. - -Find `Forget-Me-Not` and `Jack-in-the-Box` in the multiworld. - -### The Hollow Bastion Library is missing a book. - -Find `Theon Vol. 6` in the multiworld. - -## How do I enter the End of the World? - -You can enter End of the World by obtaining a number of Ansem's Reports or by finding `End of the World` in the multiworld, depending on your options. - ## Credits This is a collaborative effort from several individuals in the Kingdom Hearts community, but most of all, denhonator. diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index 522da20b..f6b6a640 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -1,54 +1,99 @@ -# Kingdom Hearts Randomizer Setup Guide +# Kingdom Hearts Archipelago Randomizer Setup Guide -## Setting up the required mods +