From 0a88fcbdb9118b9c5e68283a7563d166ba8dd363 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 31 Dec 2023 01:32:29 -0600 Subject: [PATCH 001/284] Initial Commit --- worlds/kh1/Client.py | 189 +++++++++ worlds/kh1/Items.py | 392 ++++++++++++++++++ worlds/kh1/Locations.py | 384 +++++++++++++++++ worlds/kh1/Options.py | 48 +++ worlds/kh1/Regions.py | 294 +++++++++++++ worlds/kh1/Rules.py | 119 ++++++ worlds/kh1/__init__.py | 126 ++++++ .../en_Kingdom Hearts RE Chain of Memories.md | 40 ++ worlds/kh1/docs/khrecom_en.md | 51 +++ 9 files changed, 1643 insertions(+) create mode 100644 worlds/kh1/Client.py create mode 100644 worlds/kh1/Items.py create mode 100644 worlds/kh1/Locations.py create mode 100644 worlds/kh1/Options.py create mode 100644 worlds/kh1/Regions.py create mode 100644 worlds/kh1/Rules.py create mode 100644 worlds/kh1/__init__.py create mode 100644 worlds/kh1/docs/en_Kingdom Hearts RE Chain of Memories.md create mode 100644 worlds/kh1/docs/khrecom_en.md diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py new file mode 100644 index 000000000000..60b2f5909144 --- /dev/null +++ b/worlds/kh1/Client.py @@ -0,0 +1,189 @@ +from __future__ import annotations +import os +import sys +import asyncio +import shutil + +import ModuleUpdate +ModuleUpdate.update() + +import Utils + +check_num = 0 + +if __name__ == "__main__": + Utils.init_logging("KHRECOMClient", exception_logger="Client") + +from NetUtils import NetworkItem, ClientStatus +from CommonClient import gui_enabled, logger, get_base_parser, ClientCommandProcessor, \ + CommonContext, server_loop + + +def check_stdin() -> None: + if Utils.is_windows and sys.stdin: + print("WARNING: Console input is not routed reliably on Windows, use the GUI instead.") + +class KHRECOMClientCommandProcessor(ClientCommandProcessor): + def _cmd_test(self): + """Test""" + self.output(f"Test") + + +class KHRECOMContext(CommonContext): + command_processor: int = KHRECOMClientCommandProcessor + game = "Kingdom Hearts RE Chain of Memories" + items_handling = 0b111 # full remote + + def __init__(self, server_address, password): + super(KHRECOMContext, self).__init__(server_address, password) + self.send_index: int = 0 + self.syncing = False + self.awaiting_bridge = False + # 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%/KHRECOM") + else: + self.game_communication_path = os.path.expandvars(r"$HOME/KHRECOM") + if not os.path.exists(self.game_communication_path): + os.makedirs(self.game_communication_path) + for root, dirs, files in os.walk(self.game_communication_path): + for file in files: + if file.find("obtain") <= -1: + os.remove(root+"/"+file) + + async def server_auth(self, password_requested: bool = False): + if password_requested and not self.password: + await super(KHRECOMContext, self).server_auth(password_requested) + await self.get_username() + await self.send_connect() + + async def connection_closed(self): + await super(KHRECOMContext, self).connection_closed() + for root, dirs, files in os.walk(self.game_communication_path): + for file in files: + if file.find("obtain") <= -1: + os.remove(root + "/" + file) + + @property + def endpoints(self): + if self.server: + return [self.server] + else: + return [] + + async def shutdown(self): + await super(KHRECOMContext, self).shutdown() + for root, dirs, files in os.walk(self.game_communication_path): + for file in files: + if file.find("obtain") <= -1: + os.remove(root+"/"+file) + + def on_package(self, cmd: str, args: dict): + if cmd in {"Connected"}: + if not os.path.exists(self.game_communication_path): + os.makedirs(self.game_communication_path) + for ss in self.checked_locations: + filename = f"send{ss}" + with open(os.path.join(self.game_communication_path, filename), 'w') as f: + f.close() + if cmd in {"ReceivedItems"}: + start_index = args["index"] + if start_index != len(self.items_received): + for item in args['items']: + check_num = 0 + for filename in os.listdir(self.game_communication_path): + if filename.startswith("AP"): + if int(filename.split("_")[-1].split(".")[0]) > check_num: + check_num = int(filename.split("_")[-1].split(".")[0]) + item_id = "" + location_id = "" + player = "" + found = False + for filename in os.listdir(self.game_communication_path): + if filename.startswith(f"AP"): + with open(os.path.join(self.game_communication_path, filename), 'r') as f: + item_id = str(f.readline()).replace("\n", "") + location_id = str(f.readline()).replace("\n", "") + player = str(f.readline()).replace("\n", "") + if str(item_id) == str(NetworkItem(*item).item) and str(location_id) == str(NetworkItem(*item).location) and str(player) == str(NetworkItem(*item).player): + found = True + if not found: + filename = f"AP_{str(check_num+1)}.item" + with open(os.path.join(self.game_communication_path, filename), 'w') as f: + f.write(str(NetworkItem(*item).item) + "\n" + str(NetworkItem(*item).location) + "\n" + str(NetworkItem(*item).player)) + f.close() + + if cmd in {"RoomUpdate"}: + if "checked_locations" in args: + for ss in self.checked_locations: + filename = f"send{ss}" + with open(os.path.join(self.game_communication_path, filename), 'w') as f: + f.close() + + def run_gui(self): + """Import kivy UI system and start running it as self.ui_task.""" + from kvui import GameManager + + class KHRECOMManager(GameManager): + logging_pairs = [ + ("Client", "Archipelago") + ] + base_title = "Archipelago KHRECOM Client" + + self.ui = KHRECOMManager(self) + self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") + + +async def game_watcher(ctx: KHRECOMContext): + from worlds.khrecom.Locations import lookup_id_to_name + while not ctx.exit_event.is_set(): + if ctx.syncing == True: + sync_msg = [{'cmd': 'Sync'}] + if ctx.locations_checked: + sync_msg.append({"cmd": "LocationChecks", "locations": list(ctx.locations_checked)}) + await ctx.send_msgs(sync_msg) + ctx.syncing = False + sending = [] + victory = False + for root, dirs, files in os.walk(ctx.game_communication_path): + for file in files: + if file.find("send") > -1: + st = file.split("send", -1)[1] + if st != "nil": + sending = sending+[(int(st))] + if file.find("victory") > -1: + victory = True + ctx.locations_checked = sending + message = [{"cmd": 'LocationChecks', "locations": sending}] + await ctx.send_msgs(message) + if not ctx.finished_game and victory: + await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) + ctx.finished_game = True + await asyncio.sleep(0.1) + + +def launch(): + async def main(args): + ctx = KHRECOMContext(args.connect, args.password) + ctx.server_task = asyncio.create_task(server_loop(ctx), name="server loop") + if gui_enabled: + ctx.run_gui() + ctx.run_cli() + progression_watcher = asyncio.create_task( + game_watcher(ctx), name="KHRECOMProgressionWatcher") + + await ctx.exit_event.wait() + ctx.server_address = None + + await progression_watcher + + await ctx.shutdown() + + import colorama + + parser = get_base_parser(description="KHRECOM Client, for text interfacing.") + + args, rest = parser.parse_known_args() + colorama.init() + asyncio.run(main(args)) + colorama.deinit() diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py new file mode 100644 index 000000000000..6daf6016bf9c --- /dev/null +++ b/worlds/kh1/Items.py @@ -0,0 +1,392 @@ +from typing import Dict, NamedTuple, Optional + +from BaseClasses import Item, ItemClassification + + +class KH1Item(Item): + game: str = "Kingdom Hearts" + + +class KH1ItemData(NamedTuple): + category: str + sub: str = "None" + code: Optional[int] = None + classification: ItemClassification = ItemClassification.filler + max_quantity: int = 1 + weight: int = 1 + + +def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemData]: + item_dict: Dict[str, KH1ItemData] = {} + for name, data in item_table.items(): + if data.category == category and all(x not in name for x in disclude): + item_dict.setdefault(name, data) + + return item_dict + + +item_table: Dict[str, KH1ItemData] = { + "Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, weight = 10), + "Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, weight = 10), + "Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, weight = 10), + "Elixir": KH1ItemData("Item", code = 264_1004, classification = ItemClassification.filler, weight = 10), + #"B05": KH1ItemData("Item", code = 264_1005, classification = ItemClassification.filler, weight = 10), + "Mega-Potion": KH1ItemData("Item", code = 264_1006, classification = ItemClassification.filler, weight = 10), + "Mega-Ether": KH1ItemData("Item", code = 264_1007, classification = ItemClassification.filler, weight = 10), + "Megalixir": KH1ItemData("Item", code = 264_1008, classification = ItemClassification.filler, weight = 10), + #"Fury Stone": KH1ItemData("Synthesis", code = 264_1009, classification = ItemClassification.filler, weight = 10), + #"Power Stone": KH1ItemData("Synthesis", code = 264_1010, classification = ItemClassification.filler, weight = 10), + #"Energy Stone": KH1ItemData("Synthesis", code = 264_1011, classification = ItemClassification.filler, weight = 10), + #"Blazing Stone": KH1ItemData("Synthesis", code = 264_1012, classification = ItemClassification.filler, weight = 10), + #"Frost Stone": KH1ItemData("Synthesis", code = 264_1013, classification = ItemClassification.filler, weight = 10), + #"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, weight = 10), + #"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, weight = 10), + #"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, weight = 10), + "Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"A59": KH1ItemData("Accessory", code = 264_1075, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"A60": KH1ItemData("Accessory", code = 264_1076, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"A61": KH1ItemData("Accessory", code = 264_1077, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Dream Shield": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Genie": KH1ItemData("Weapons", code = 264_1137, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"No Weapon": KH1ItemData("Weapons", code = 264_1138, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"No Weapon": KH1ItemData("Weapons", code = 264_1139, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Tinker Bell": KH1ItemData("Weapons", code = 264_1140, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Claws": KH1ItemData("Weapons", code = 264_1141, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Tent": KH1ItemData("Camping", code = 264_1142, classification = ItemClassification.filler, weight = 10), + "Camping Set": KH1ItemData("Camping", code = 264_1143, classification = ItemClassification.filler, weight = 10), + "Cottage": KH1ItemData("Camping", code = 264_1144, classification = ItemClassification.filler, weight = 10), + #"C04": KH1ItemData("Camping", code = 264_1145, classification = ItemClassification.filler, weight = 10), + #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, weight = 10), + #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, weight = 10), + #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, weight = 10), + #"Ansem's Report 11": KH1ItemData("Key", code = 264_1149, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Ansem's Report 12": KH1ItemData("Key", code = 264_1150, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Ansem's Report 13": KH1ItemData("Key", code = 264_1151, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, weight = 10), + "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, weight = 10), + "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, weight = 10), + #"Serenity Power": KH1ItemData("Synthesis", code = 264_1155, classification = ItemClassification.filler, weight = 10), + #"Dark Matter": KH1ItemData("Synthesis", code = 264_1156, classification = ItemClassification.filler, weight = 10), + #"Mythril Stone": KH1ItemData("Synthesis", code = 264_1157, classification = ItemClassification.filler, weight = 10), + #"Fire Arts": KH1ItemData("Synthesis", code = 264_1158, classification = ItemClassification.filler, weight = 10), + #"Blizzard Arts": KH1ItemData("Synthesis", code = 264_1159, classification = ItemClassification.filler, weight = 10), + #"Thunder Arts": KH1ItemData("Synthesis", code = 264_1160, classification = ItemClassification.filler, weight = 10), + #"Cure Arts": KH1ItemData("Synthesis", code = 264_1161, classification = ItemClassification.filler, weight = 10), + #"Gravity Arts": KH1ItemData("Synthesis", code = 264_1162, classification = ItemClassification.filler, weight = 10), + #"Stop Arts": KH1ItemData("Synthesis", code = 264_1163, classification = ItemClassification.filler, weight = 10), + #"Aero Arts": KH1ItemData("Synthesis", code = 264_1164, classification = ItemClassification.filler, weight = 10), + #"Shiitank Rank": KH1ItemData("Synthesis", code = 264_1165, classification = ItemClassification.filler, weight = 10), + #"Matsutake Rank": KH1ItemData("Synthesis", code = 264_1166, classification = ItemClassification.filler, weight = 10), + #"Mystery Mold": KH1ItemData("Synthesis", code = 264_1167, classification = ItemClassification.filler, weight = 10), + #"Ansem's Report 1": KH1ItemData("Key", code = 264_1168, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Ansem's Report 2": KH1ItemData("Key", code = 264_1169, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Ansem's Report 3": KH1ItemData("Key", code = 264_1170, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Ansem's Report 4": KH1ItemData("Key", code = 264_1171, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Ansem's Report 5": KH1ItemData("Key", code = 264_1172, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Ansem's Report 6": KH1ItemData("Key", code = 264_1173, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Ansem's Report 7": KH1ItemData("Key", code = 264_1174, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Ansem's Report 8": KH1ItemData("Key", code = 264_1175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Ansem's Report 9": KH1ItemData("Key", code = 264_1176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Ansem's Report 10": KH1ItemData("Key", code = 264_1177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Khama Vol. 8": KH1ItemData("Key", code = 264_1178, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Salegg Vol. 6": KH1ItemData("Key", code = 264_1179, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Azal Vol. 3": KH1ItemData("Key", code = 264_1180, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Mava Vol. 3": KH1ItemData("Key", code = 264_1181, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Mava Vol. 6": KH1ItemData("Key", code = 264_1182, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Log": KH1ItemData("Key", code = 264_1192, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Cloth": KH1ItemData("Key", code = 264_1193, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Rope": KH1ItemData("Key", code = 264_1194, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Seagull Egg": KH1ItemData("Key", code = 264_1195, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Fish": KH1ItemData("Key", code = 264_1196, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Mushroom": KH1ItemData("Key", code = 264_1197, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Coconut": KH1ItemData("Key", code = 264_1198, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Drinking Water": KH1ItemData("Key", code = 264_1199, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Navi-G Piece 1": KH1ItemData("Key", code = 264_1200, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Navi-G Piece 2": KH1ItemData("Key", code = 264_1201, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Navi-Gummi Unused": KH1ItemData("Key", code = 264_1202, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Torn Page 2": KH1ItemData("Key", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Torn Page 3": KH1ItemData("Key", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Torn Page 4": KH1ItemData("Key", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Slide 1": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Pretty Stone": KH1ItemData("Synthesis", code = 264_1231, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Lucid Shard": KH1ItemData("Synthesis", code = 264_1233, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Lucid Gem": KH1ItemData("Synthesis", code = 264_1234, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Lucid Crystal": KH1ItemData("Synthesis", code = 264_1235, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Spirit Shard": KH1ItemData("Synthesis", code = 264_1236, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Spirit Gem": KH1ItemData("Synthesis", code = 264_1237, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Power Shard": KH1ItemData("Synthesis", code = 264_1238, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Power Gem": KH1ItemData("Synthesis", code = 264_1239, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Power Crystal": KH1ItemData("Synthesis", code = 264_1240, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Blaze Shard": KH1ItemData("Synthesis", code = 264_1241, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Blaze Gem": KH1ItemData("Synthesis", code = 264_1242, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Frost Shard": KH1ItemData("Synthesis", code = 264_1243, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Frost Gem": KH1ItemData("Synthesis", code = 264_1244, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Thunder Shard": KH1ItemData("Synthesis", code = 264_1245, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Thunder Gem": KH1ItemData("Synthesis", code = 264_1246, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Shiny Crystal": KH1ItemData("Synthesis", code = 264_1247, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Bright Shard": KH1ItemData("Synthesis", code = 264_1248, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Bright Gem": KH1ItemData("Synthesis", code = 264_1249, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Bright Crystal": KH1ItemData("Synthesis", code = 264_1250, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Mystery Goo": KH1ItemData("Synthesis", code = 264_1251, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Gale": KH1ItemData("Synthesis", code = 264_1252, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Mythril Shard": KH1ItemData("Synthesis", code = 264_1253, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Mythril": KH1ItemData("Synthesis", code = 264_1254, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Strike Raid": KH1ItemData("Abilities", code = 264_3013, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Ragnarok": KH1ItemData("Abilities", code = 264_3014, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Trinity Limit": KH1ItemData("Abilities", code = 264_3015, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Cheer": KH1ItemData("Abilities", code = 264_3016, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Vortex": KH1ItemData("Abilities", code = 264_3017, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Charge": KH1ItemData("Abilities", code = 264_3029, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Rocket": KH1ItemData("Abilities", code = 264_3030, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Tornado": KH1ItemData("Abilities", code = 264_3031, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"MP Gift": KH1ItemData("Abilities", code = 264_3032, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Raging Boar": KH1ItemData("Abilities", code = 264_3033, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Asp's Bite": KH1ItemData("Abilities", code = 264_3034, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Healing Herb": KH1ItemData("Abilities", code = 264_3035, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Wind Armor": KH1ItemData("Abilities", code = 264_3036, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Crescent": KH1ItemData("Abilities", code = 264_3037, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Sandstorm": KH1ItemData("Abilities", code = 264_3038, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Applause!": KH1ItemData("Abilities", code = 264_3039, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Blazing Fury": KH1ItemData("Abilities", code = 264_3040, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Icy Terror": KH1ItemData("Abilities", code = 264_3041, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Bolts of Sorrow": KH1ItemData("Abilities", code = 264_3042, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Ghostly Scream": KH1ItemData("Abilities", code = 264_3043, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Humming Bird": KH1ItemData("Abilities", code = 264_3044, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Time-Out": KH1ItemData("Abilities", code = 264_3045, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Storm's Eye": KH1ItemData("Abilities", code = 264_3046, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Ferocious Lunge": KH1ItemData("Abilities", code = 264_3047, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Furious Bellow": KH1ItemData("Abilities", code = 264_3048, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Spiral Wave": KH1ItemData("Abilities", code = 264_3049, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Thunder Potion": KH1ItemData("Abilities", code = 264_3050, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Cure Potion": KH1ItemData("Abilities", code = 264_3051, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Aero Potion": KH1ItemData("Abilities", code = 264_3052, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Slapshot": KH1ItemData("Abilities", code = 264_3053, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Sliding Dash": KH1ItemData("Abilities", code = 264_3054, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Hurricane Blast": KH1ItemData("Abilities", code = 264_3055, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Ripple Drive": KH1ItemData("Abilities", code = 264_3056, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Max HP Up": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Max MP Up": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Max AP Up": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Strength Up": KH1ItemData("Level Up", code = 264_4004, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Defense Up": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Item Slot Up": KH1ItemData("Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Accessory Slot Up": KH1ItemData("Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Tinker Bell": KH1ItemData("Summons", code = 264_5003, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Mushu": KH1ItemData("Summons", code = 264_5004, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Simba": KH1ItemData("Summons", code = 264_5005, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Progressive Fire": KH1ItemData("Magic", code = 264_6001, classification = ItemClassification.progression, max_quantity = 3, weight = 10), + "Progressive Blizzard": KH1ItemData("Magic", code = 264_6002, classification = ItemClassification.progression, max_quantity = 3, weight = 10), + "Progressive Thunder": KH1ItemData("Magic", code = 264_6003, classification = ItemClassification.progression, max_quantity = 3, weight = 10), + "Progressive Cure": KH1ItemData("Magic", code = 264_6004, classification = ItemClassification.progression, max_quantity = 3, weight = 10), + "Progressive Gravity": KH1ItemData("Magic", code = 264_6005, classification = ItemClassification.progression, max_quantity = 3, weight = 10), + "Progressive Stop": KH1ItemData("Magic", code = 264_6006, classification = ItemClassification.progression, max_quantity = 3, weight = 10), + "Progressive Aero": KH1ItemData("Magic", code = 264_6007, classification = ItemClassification.progression, max_quantity = 3, weight = 10), + #"Traverse Town": KH1ItemData("Worlds", code = 264_7001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Wonderland": KH1ItemData("Worlds", code = 264_7002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Olympus Coliseum": KH1ItemData("Worlds", code = 264_7003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Deep Jungle": KH1ItemData("Worlds", code = 264_7004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Agrabah": KH1ItemData("Worlds", code = 264_7005, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Halloween Town": KH1ItemData("Worlds", code = 264_7006, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Atlantica": KH1ItemData("Worlds", code = 264_7007, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Monstro": KH1ItemData("Worlds", code = 264_7011, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Blue Trinity": KH1ItemData("Trinities", code = 264_8001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Red Trinity": KH1ItemData("Trinities", code = 264_8002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Green Trinity": KH1ItemData("Trinities", code = 264_8003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Yellow Trinity": KH1ItemData("Trinities", code = 264_8004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "White Trinity": KH1ItemData("Trinities", code = 264_8005, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Phil Cup": KH1ItemData("Cups", code = 264_9001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Pegasus Cup": KH1ItemData("Cups", code = 264_9002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Hercules Cup": KH1ItemData("Cups", code = 264_9003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Hades Cup": KH1ItemData("Cups", code = 264_9004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), +} + +event_item_table: Dict[str, KH1ItemData] = { +} diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py new file mode 100644 index 000000000000..c38b9c9431f2 --- /dev/null +++ b/worlds/kh1/Locations.py @@ -0,0 +1,384 @@ +from typing import Dict, NamedTuple, Optional +import typing + + +from BaseClasses import Location + + +class KH1Location(Location): + game: str = "Kingdom Hearts" + + +class KH1LocationData(NamedTuple): + category: str + code: Optional[int] = None + + +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 + + +location_table: Dict[str, KH1LocationData] = { + #"Destiny Islands Chest": KH1LocationData("Chests", 265_0011), missable + "Traverse Town 1st District Candle Puzzle Chest": KH1LocationData("Chests", 265_0211), + "Traverse Town 1st District Accessory Shop Roof Chest": KH1LocationData("Chests", 265_0212), + "Traverse Town 2nd District Boots and Shoes Awning Chest": KH1LocationData("Chests", 265_0213), + "Traverse Town 2nd District Rooftop Chest": KH1LocationData("Chests", 265_0214), + "Traverse Town 2nd District Gizmo Shop Facade Chest": KH1LocationData("Chests", 265_0251), + "Traverse Town Alleyway Balcony Chest": KH1LocationData("Chests", 265_0252), + "Traverse Town Alleyway Blue Room Awning Chest": KH1LocationData("Chests", 265_0253), + "Traverse Town Alleyway Corner Chest": KH1LocationData("Chests", 265_0254), + "Traverse Town Green Room Clock Puzzle Chest": KH1LocationData("Chests", 265_0292), + "Traverse Town Green Room Table Chest": KH1LocationData("Chests", 265_0293), + "Traverse Town Red Room Chest": KH1LocationData("Chests", 265_0294), + "Traverse Town Mystical House Yellow Trinity Chest": KH1LocationData("Chests", 265_0331), + "Traverse Town Accessory Shop Chest": KH1LocationData("Chests", 265_0332), + "Traverse Town Secret Waterway White Trinity Chest": KH1LocationData("Chests", 265_0333), + "Traverse Town Geppetto's House Chest": KH1LocationData("Chests", 265_0334), + "Traverse Town Item Workshop Right Chest": KH1LocationData("Chests", 265_0371), + "Traverse Town 1st District Blue Trinity Balcony Chest": KH1LocationData("Chests", 265_0411), + "Traverse Town Mystical House Glide Chest": KH1LocationData("Chests", 265_0891), + "Traverse Town Alleyway Behind Crates Chest": KH1LocationData("Chests", 265_0892), + "Traverse Town Item Workshop Left Chest": KH1LocationData("Chests", 265_0893), + "Traverse Town Secret Waterway Near Stairs Chest": KH1LocationData("Chests", 265_0894), + "Wonderland Rabbit Hole Green Trinity Chest": KH1LocationData("Chests", 265_0931), + #"Wonderland Rabbit Hole Defeat Heartless After Trial Chest": KH1LocationData("Chests", 265_0933), missable + "Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest": KH1LocationData("Chests", 265_0934), + "Wonderland Bizarre Room Green Trinity Chest": KH1LocationData("Chests", 265_0971), + "Wonderland Queen's Castle Hedge Left Red Chest": KH1LocationData("Chests", 265_1011), + "Wonderland Queen's Castle Hedge Right Blue Chest": KH1LocationData("Chests", 265_1012), + "Wonderland Queen's Castle Hedge Right Red Chest": KH1LocationData("Chests", 265_1013), + "Wonderland Lotus Forest Thunder Plant Chest": KH1LocationData("Chests", 265_1014), + "Wonderland Lotus Forest Through the Painting Thunder Plant Chest": KH1LocationData("Chests", 265_1051), + "Wonderland Lotus Forest Glide Chest": KH1LocationData("Chests", 265_1052), + "Wonderland Lotus Forest Nut Chest": KH1LocationData("Chests", 265_1053), + "Wonderland Lotus Forest Corner Chest": KH1LocationData("Chests", 265_1054), + "Wonderland Bizarre Room Lamp Chest": KH1LocationData("Chests", 265_1091), + "Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest": KH1LocationData("Chests", 265_1093), + "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest": KH1LocationData("Chests", 265_1094), + "Wonderland Tea Party Garden Bear and Clock Puzzle Chest": KH1LocationData("Chests", 265_1131), + "Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest": KH1LocationData("Chests", 265_1132), + "Wonderland Lotus Forest Through the Painting White Trinity Chest": KH1LocationData("Chests", 265_1133), + "Deep Jungle Tree House Beneath Tree House Chest": KH1LocationData("Chests", 265_1213), + "Deep Jungle Tree House Rooftop Chest": KH1LocationData("Chests", 265_1214), + "Deep Jungle Hippo's Lagoon Center Chest": KH1LocationData("Chests", 265_1251), + "Deep Jungle Hippo's Lagoon Left Chest": KH1LocationData("Chests", 265_1252), + "Deep Jungle Hippo's Lagoon Right Chest": KH1LocationData("Chests", 265_1253), + "Deep Jungle Vines Chest": KH1LocationData("Chests", 265_1291), + "Deep Jungle Vines 2 Chest": KH1LocationData("Chests", 265_1292), + "Deep Jungle Climbing Trees Blue Trinity Chest": KH1LocationData("Chests", 265_1293), + "Deep Jungle Tunnel Chest": KH1LocationData("Chests", 265_1331), + "Deep Jungle Cavern of Hearts White Trinity Chest": KH1LocationData("Chests", 265_1332), + "Deep Jungle Camp Blue Trinity Chest": KH1LocationData("Chests", 265_1333), + "Deep Jungle Tent Chest": KH1LocationData("Chests", 265_1334), + "Deep Jungle Waterfall Cavern Low Chest": KH1LocationData("Chests", 265_1371), + "Deep Jungle Waterfall Cavern Middle Chest": KH1LocationData("Chests", 265_1372), + "Deep Jungle Waterfall Cavern High Wall Chest": KH1LocationData("Chests", 265_1373), + "Deep Jungle Waterfall Cavern High Middle Chest": KH1LocationData("Chests", 265_1374), + "Deep Jungle Cliff Right Cliff Left Chest": KH1LocationData("Chests", 265_1411), + "Deep Jungle Cliff Right Cliff Right Chest": KH1LocationData("Chests", 265_1412), + "Deep Jungle Tree House Suspended Boat Chest": KH1LocationData("Chests", 265_1413), + #"100 Acre Wood Meadow Inside Log Chest": KH1LocationData("Chests", 265_1654), 100 Acre Wood + "Agrabah Plaza By Storage Chest": KH1LocationData("Chests", 265_1972), + "Agrabah Plaza Raised Terrace Chest": KH1LocationData("Chests", 265_1973), + "Agrabah Plaza Top Corner Chest": KH1LocationData("Chests", 265_1974), + "Agrabah Alley Chest": KH1LocationData("Chests", 265_2011), + "Agrabah Bazaar Across Windows Chest": KH1LocationData("Chests", 265_2012), + "Agrabah Bazaar High Corner Chest": KH1LocationData("Chests", 265_2013), + "Agrabah Main Street Right Palace Entrance Chest": KH1LocationData("Chests", 265_2014), + "Agrabah Main Street High Above Alley Entrance Chest": KH1LocationData("Chests", 265_2051), + "Agrabah Main Street High Above Palace Gates Entrance Chest": KH1LocationData("Chests", 265_2052), + "Agrabah Palace Gates Low Chest": KH1LocationData("Chests", 265_2053), + "Agrabah Palace Gates High Opposite Palace Chest": KH1LocationData("Chests", 265_2054), + "Agrabah Palace Gates High Close to Palace Chest": KH1LocationData("Chests", 265_2091), + "Agrabah Storage Green Trinity Chest": KH1LocationData("Chests", 265_2092), + "Agrabah Storage Behind Barrel Chest": KH1LocationData("Chests", 265_2093), + "Agrabah Cave of Wonders Entrance Left Chest": KH1LocationData("Chests", 265_2094), + "Agrabah Cave of Wonders Entrance Tall Tower Chest": KH1LocationData("Chests", 265_2131), + "Agrabah Cave of Wonders Hall High Left Chest": KH1LocationData("Chests", 265_2132), + "Agrabah Cave of Wonders Hall Near Bottomless Hall Chest": KH1LocationData("Chests", 265_2133), + "Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest": KH1LocationData("Chests", 265_2134), + "Agrabah Cave of Wonders Bottomless Hall Pillar Chest": KH1LocationData("Chests", 265_2171), + "Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest": KH1LocationData("Chests", 265_2172), + "Agrabah Cave of Wonders Treasure Room Across Platforms Chest": KH1LocationData("Chests", 265_2173), + "Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest": KH1LocationData("Chests", 265_2174), + "Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest": KH1LocationData("Chests", 265_2211), + "Agrabah Cave of Wonders Treasure Room Above Fire Chest": KH1LocationData("Chests", 265_2212), + "Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest": KH1LocationData("Chests", 265_2213), + "Agrabah Cave of Wonders Relic Chamber Stairs Chest": KH1LocationData("Chests", 265_2214), + "Agrabah Cave of Wonders Dark Chamber Abu Gem Chest": KH1LocationData("Chests", 265_2251), + "Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest": KH1LocationData("Chests", 265_2252), + "Agrabah Cave of Wonders Dark Chamber Bridge Chest": KH1LocationData("Chests", 265_2253), + "Agrabah Cave of Wonders Dark Chamber Near Save Chest": KH1LocationData("Chests", 265_2254), + "Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest": KH1LocationData("Chests", 265_2291), + "Agrabah Cave of Wonders Hidden Room Right Chest": KH1LocationData("Chests", 265_2292), + "Agrabah Cave of Wonders Hidden Room Left Chest": KH1LocationData("Chests", 265_2293), + "Agrabah Aladdin's House Main Street Entrance Chest": KH1LocationData("Chests", 265_2294), + "Agrabah Aladdin's House Plaza Entrance Chest": KH1LocationData("Chests", 265_2331), + "Agrabah Cave of Wonders Entrance White Trinity Chest": KH1LocationData("Chests", 265_2332), + "Monstro Chamber 6 Other Platform Chest": KH1LocationData("Chests", 265_2413), + "Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest": KH1LocationData("Chests", 265_2414), + "Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest": KH1LocationData("Chests", 265_2451), + "Monstro Chamber 6 Low Chest": KH1LocationData("Chests", 265_2452), + "Atlantica Sunken Ship In Flipped Boat Chest": KH1LocationData("Chests", 265_2531), + "Atlantica Sunken Ship Seabed Chest": KH1LocationData("Chests", 265_2532), + "Atlantica Sunken Ship Inside Ship Chest": KH1LocationData("Chests", 265_2533), + "Atlantica Ariel's Grotto High Chest": KH1LocationData("Chests", 265_2534), + "Atlantica Ariel's Grotto Middle Chest": KH1LocationData("Chests", 265_2571), + "Atlantica Ariel's Grotto Low Chest": KH1LocationData("Chests", 265_2572), + "Atlantica Ursula's Lair Use Fire on Urchin Chest": KH1LocationData("Chests", 265_2573), + "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest": KH1LocationData("Chests", 265_2574), + "Atlantica Triton's Palace White Trinity Chest": KH1LocationData("Chests", 265_2611), + "Halloween Town Moonlight Hill White Trinity Chest": KH1LocationData("Chests", 265_3014), + "Halloween Town Bridge Under Bridge": KH1LocationData("Chests", 265_3051), + "Halloween Town Boneyard Tombstone Puzzle Chest": KH1LocationData("Chests", 265_3052), + "Halloween Town Bridge Right of Gate Chest": KH1LocationData("Chests", 265_3053), + "Halloween Town Cemetary Behind Grave Chest": KH1LocationData("Chests", 265_3054), + "Halloween Town Cemetary By Cat Shape Chest": KH1LocationData("Chests", 265_3091), + "Halloween Town Cemetary Between Graves Chest": KH1LocationData("Chests", 265_3092), + "Halloween Town Oogie's Manor Lower Iron Cage Chest": KH1LocationData("Chests", 265_3093), + "Halloween Town Oogie's Manor Upper Iron Cage Chest": KH1LocationData("Chests", 265_3094), + "Halloween Town Oogie's Manor Hollow Chest": KH1LocationData("Chests", 265_3131), + "Halloween Town Oogie's Manor Grounds Red Trinity Chest": KH1LocationData("Chests", 265_3132), + "Halloween Town Guillotine Square High Tower Chest": KH1LocationData("Chests", 265_3133), + "Halloween Town Guillotine Square Pumpkin Structure Left Chest": KH1LocationData("Chests", 265_3134), + "Halloween Town Oogie's Manor Entrance Steps Chest": KH1LocationData("Chests", 265_3171), + "Halloween Town Oogie's Manor Inside Entrance Chest": KH1LocationData("Chests", 265_3172), + "Halloween Town Bridge Left of Gate Chest": KH1LocationData("Chests", 265_3291), + "Halloween Town Cemetary By Striped Grave Chest": KH1LocationData("Chests", 265_3292), + "Halloween Town Guillotine Square Under Jack's House Stairs Chest": KH1LocationData("Chests", 265_3293), + "Halloween Town Guillotine Square Pumpkin Structure Right Chest": KH1LocationData("Chests", 265_3294), + "Olympus Coliseum Coliseum Gates Left Behind Columns Chest": KH1LocationData("Chests", 265_3332), + "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest": KH1LocationData("Chests", 265_3333), + "Olympus Coliseum Coliseum Gates Left Blue Trinity Chest": KH1LocationData("Chests", 265_3334), + "Olympus Coliseum Coliseum Gates White Trinity Chest": KH1LocationData("Chests", 265_3371), + "Olympus Coliseum Coliseum Gates Blizzara Chest": KH1LocationData("Chests", 265_3372), + "Monstro Mouth Boat Deck Chest": KH1LocationData("Chests", 265_3454), + "Monstro Mouth High Platform Boat Side Chest": KH1LocationData("Chests", 265_3491), + "Monstro Mouth High Platform Across from Boat Chest": KH1LocationData("Chests", 265_3492), + "Monstro Mouth Near Ship Chest": KH1LocationData("Chests", 265_3493), + "Monstro Mouth Green Trinity Top of Boat Chest": KH1LocationData("Chests", 265_3494), + "Monstro Chamber 2 Ground Chest": KH1LocationData("Chests", 265_3534), + "Monstro Chamber 2 Platform Chest": KH1LocationData("Chests", 265_3571), + "Monstro Chamber 5 Platform Chest": KH1LocationData("Chests", 265_3613), + "Monstro Chamber 3 Ground Chest": KH1LocationData("Chests", 265_3614), + "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest": KH1LocationData("Chests", 265_3651), + "Monstro Chamber 3 Near Chamber 6 Entrance Chest": KH1LocationData("Chests", 265_3652), + "Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest": KH1LocationData("Chests", 265_3653), + "Monstro Mouth High Platform Near Teeth Chest": KH1LocationData("Chests", 265_3732), + "Monstro Chamber 5 Atop Barrel Chest": KH1LocationData("Chests", 265_3733), + "Monstro Chamber 5 Low 2nd Chest": KH1LocationData("Chests", 265_3734), + "Monstro Chamber 5 Low 1st Chest": KH1LocationData("Chests", 265_3771), + "Neverland Pirate Ship Deck White Trinity Chest": KH1LocationData("Chests", 265_3772), + "Neverland Pirate Ship Crows Nest Chest": KH1LocationData("Chests", 265_3773), + "Neverland Hold Yellow Trinity Right Blue Chest": KH1LocationData("Chests", 265_3774), + "Neverland Hold Yellow Trinity Left Blue Chest": KH1LocationData("Chests", 265_3811), + "Neverland Galley Chest": KH1LocationData("Chests", 265_3812), + "Neverland Cabin Chest": KH1LocationData("Chests", 265_3813), + "Neverland Hold Flight 1st Chest ": KH1LocationData("Chests", 265_3814), + "Neverland Clock Tower Chest": KH1LocationData("Chests", 265_4014), + "Neverland Hold Flight 2nd Chest": KH1LocationData("Chests", 265_4051), + "Neverland Hold Yellow Trinity Green Chest": KH1LocationData("Chests", 265_4052), + "Neverland Captain's Cabin Chest": KH1LocationData("Chests", 265_4053), + "Hollow Bastion Rising Falls Water's Surface Chest": KH1LocationData("Chests", 265_4054), + "Hollow Bastion Rising Falls Under Water 1st Chest": KH1LocationData("Chests", 265_4091), + "Hollow Bastion Rising Falls Under Water 2nd Chest": KH1LocationData("Chests", 265_4092), + "Hollow Bastion Rising Falls Floating Platform Near Save Chest": KH1LocationData("Chests", 265_4093), + "Hollow Bastion Rising Falls Floating Platform Near Bubble Chest": KH1LocationData("Chests", 265_4094), + "Hollow Bastion Rising Falls High Platform Chest": KH1LocationData("Chests", 265_4131), + "Hollow Bastion Castle Gates Gravity Chest": KH1LocationData("Chests", 265_4132), + "Hollow Bastion Castle Gates Freestanding Pillar Chest": KH1LocationData("Chests", 265_4133), + "Hollow Bastion Castle Gates High Pillar Chest": KH1LocationData("Chests", 265_4134), + "Hollow Bastion Great Crest Lower Chest": KH1LocationData("Chests", 265_4171), + "Hollow Bastion Great Crest After Battle Platform Chest": KH1LocationData("Chests", 265_4172), + "Hollow Bastion High Tower 2nd Gravity Chest": KH1LocationData("Chests", 265_4173), + "Hollow Bastion High Tower 1st Gravity Chest": KH1LocationData("Chests", 265_4174), + "Hollow Bastion High Tower Above Sliding Gates Chest": KH1LocationData("Chests", 265_4211), + "Hollow Bastion Library Top of Bookshelf Chest": KH1LocationData("Chests", 265_4213), + "Hollow Bastion Library 1st Floor Turn the Carousel Chest": KH1LocationData("Chests", 265_4214), + "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest": KH1LocationData("Chests", 265_4251), + "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest": KH1LocationData("Chests", 265_4252), + "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest": KH1LocationData("Chests", 265_4253), + "Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest": KH1LocationData("Chests", 265_4254), + "Hollow Bastion Lift Stop Library Node Gravity Chest": KH1LocationData("Chests", 265_4291), + "Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest": KH1LocationData("Chests", 265_4292), + "Hollow Bastion Lift Stop Outside Library Gravity Chest": KH1LocationData("Chests", 265_4293), + "Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest": KH1LocationData("Chests", 265_4294), + "Hollow Bastion Base Level Bubble Under the Wall Platform Chest": KH1LocationData("Chests", 265_4331), + "Hollow Bastion Base Level Platform Near Entrance Chest": KH1LocationData("Chests", 265_4332), + "Hollow Bastion Base Level Near Crystal Switch Chest": KH1LocationData("Chests", 265_4333), + "Hollow Bastion Waterway Near Save Chest": KH1LocationData("Chests", 265_4334), + "Hollow Bastion Waterway Blizzard on Bubble Chest": KH1LocationData("Chests", 265_4371), + "Hollow Bastion Waterway Unlock Passage from Base Level Chest": KH1LocationData("Chests", 265_4372), + "Hollow Bastion Dungeon By Candles Chest": KH1LocationData("Chests", 265_4373), + "Hollow Bastion Dungeon Corner Chest": KH1LocationData("Chests", 265_4374), + "Hollow Bastion Grand Hall Steps Right Side Chest": KH1LocationData("Chests", 265_4454), + "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Chests", 265_4491), + "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Chests", 265_4492), + "Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Chests", 265_4493), + "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Chests", 265_4494), + "End of the World Final Dimension 1st Chest": KH1LocationData("Chests", 265_4531), + "End of the World Final Dimension 2nd Chest": KH1LocationData("Chests", 265_4532), + "End of the World Final Dimension 3rd Chest": KH1LocationData("Chests", 265_4533), + "End of the World Final Dimension 4th Chest": KH1LocationData("Chests", 265_4534), + "End of the World Final Dimension 5th Chest": KH1LocationData("Chests", 265_4571), + "End of the World Final Dimension 6th Chest": KH1LocationData("Chests", 265_4572), + "End of the World Final Dimension 10th Chest": KH1LocationData("Chests", 265_4573), + "End of the World Final Dimension 9th Chest": KH1LocationData("Chests", 265_4574), + "End of the World Final Dimension 8th Chest": KH1LocationData("Chests", 265_4611), + "End of the World Final Dimension 7th Chest": KH1LocationData("Chests", 265_4612), + "End of the World Giant Crevasse 3rd Chest": KH1LocationData("Chests", 265_4613), + "End of the World Giant Crevasse 1st Chest": KH1LocationData("Chests", 265_4651), + "End of the World Giant Crevasse 4th Chest": KH1LocationData("Chests", 265_4652), + "End of the World Giant Crevasse 2nd Chest": KH1LocationData("Chests", 265_4653), + "End of the World World Terminus Traverse Town Chest": KH1LocationData("Chests", 265_4654), + "End of the World World Terminus Wonderland Chest": KH1LocationData("Chests", 265_4691), + "End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("Chests", 265_4692), + "End of the World World Terminus Deep Jungle Chest": KH1LocationData("Chests", 265_4693), + "End of the World World Terminus Agrabah Chest": KH1LocationData("Chests", 265_4694), + "End of the World World Terminus Atlantica Chest": KH1LocationData("Chests", 265_4731), + "End of the World World Terminus Halloween Town Chest": KH1LocationData("Chests", 265_4732), + "End of the World World Terminus Neverland Chest": KH1LocationData("Chests", 265_4733), + "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("Chests", 265_4734), + "End of the World World Terminus Hollow Bastion Chest": KH1LocationData("Chests", 265_4771), + "End of the World Final Rest Chest": KH1LocationData("Chests", 265_4772), + "Monstro Chamber 6 White Trinity Chest": KH1LocationData("Chests", 265_5092), + #"Awakening Chest": KH1LocationData("Chests", 265_5093), missable + "Chronicles Sora's Story": KH1LocationData("Chronicles", 265_6014), + "Chronicles Wonderland": KH1LocationData("Chronicles", 265_6056), + "Chronicles Olympus Coliseum": KH1LocationData("Chronicles", 265_6097), + "Chronicles Deep Jungle": KH1LocationData("Chronicles", 265_6136), + "Chronicles Agrabah": KH1LocationData("Chronicles", 265_6176), + "Chronicles Monstro": KH1LocationData("Chronicles", 265_6216), + #"Chronicles 100 Acre Wood": KH1LocationData("Chronicles", 265_6258), + "Chronicles Atlantica": KH1LocationData("Chronicles", 265_6297), + "Chronicles Halloween Town": KH1LocationData("Chronicles", 265_6336), + "Chronicles Neverland": KH1LocationData("Chronicles", 265_6376), + "Ansem's Secret Report 1": KH1LocationData("Reports", 265_7018), + "Ansem's Secret Report 2": KH1LocationData("Reports", 265_7017), + "Ansem's Secret Report 3": KH1LocationData("Reports", 265_7016), + "Ansem's Secret Report 4": KH1LocationData("Reports", 265_7015), + "Ansem's Secret Report 5": KH1LocationData("Reports", 265_7014), + "Ansem's Secret Report 6": KH1LocationData("Reports", 265_7013), + "Ansem's Secret Report 7": KH1LocationData("Reports", 265_7012), + "Ansem's Secret Report 8": KH1LocationData("Reports", 265_7011), + "Ansem's Secret Report 9": KH1LocationData("Reports", 265_7028), + "Ansem's Secret Report 10": KH1LocationData("Reports", 265_7027), + #"Ansem's Secret Report 11": KH1LocationData("Reports", 265_7026), + #"Ansem's Secret Report 12": KH1LocationData("Reports", 265_7025), + #"Ansem's Secret Report 13": KH1LocationData("Reports", 265_7024), + "Level 1": KH1LocationData("Levels", 265_8001), + "Level 2": KH1LocationData("Levels", 265_8002), + "Level 3": KH1LocationData("Levels", 265_8003), + "Level 4": KH1LocationData("Levels", 265_8004), + "Level 5": KH1LocationData("Levels", 265_8005), + "Level 6": KH1LocationData("Levels", 265_8006), + "Level 7": KH1LocationData("Levels", 265_8007), + "Level 8": KH1LocationData("Levels", 265_8008), + "Level 9": KH1LocationData("Levels", 265_8009), + "Level 10": KH1LocationData("Levels", 265_8010), + "Level 11": KH1LocationData("Levels", 265_8011), + "Level 12": KH1LocationData("Levels", 265_8012), + "Level 13": KH1LocationData("Levels", 265_8013), + "Level 14": KH1LocationData("Levels", 265_8014), + "Level 15": KH1LocationData("Levels", 265_8015), + "Level 16": KH1LocationData("Levels", 265_8016), + "Level 17": KH1LocationData("Levels", 265_8017), + "Level 18": KH1LocationData("Levels", 265_8018), + "Level 19": KH1LocationData("Levels", 265_8019), + "Level 20": KH1LocationData("Levels", 265_8020), + "Level 21": KH1LocationData("Levels", 265_8021), + "Level 22": KH1LocationData("Levels", 265_8022), + "Level 23": KH1LocationData("Levels", 265_8023), + "Level 24": KH1LocationData("Levels", 265_8024), + "Level 25": KH1LocationData("Levels", 265_8025), + "Level 26": KH1LocationData("Levels", 265_8026), + "Level 27": KH1LocationData("Levels", 265_8027), + "Level 28": KH1LocationData("Levels", 265_8028), + "Level 29": KH1LocationData("Levels", 265_8029), + "Level 30": KH1LocationData("Levels", 265_8030), + "Level 31": KH1LocationData("Levels", 265_8031), + "Level 32": KH1LocationData("Levels", 265_8032), + "Level 33": KH1LocationData("Levels", 265_8033), + "Level 34": KH1LocationData("Levels", 265_8034), + "Level 35": KH1LocationData("Levels", 265_8035), + "Level 36": KH1LocationData("Levels", 265_8036), + "Level 37": KH1LocationData("Levels", 265_8037), + "Level 38": KH1LocationData("Levels", 265_8038), + "Level 39": KH1LocationData("Levels", 265_8039), + "Level 40": KH1LocationData("Levels", 265_8040), + "Level 41": KH1LocationData("Levels", 265_8041), + "Level 42": KH1LocationData("Levels", 265_8042), + "Level 43": KH1LocationData("Levels", 265_8043), + "Level 44": KH1LocationData("Levels", 265_8044), + "Level 45": KH1LocationData("Levels", 265_8045), + "Level 46": KH1LocationData("Levels", 265_8046), + "Level 47": KH1LocationData("Levels", 265_8047), + "Level 48": KH1LocationData("Levels", 265_8048), + "Level 49": KH1LocationData("Levels", 265_8049), + "Level 50": KH1LocationData("Levels", 265_8050), + "Level 51": KH1LocationData("Levels", 265_8051), + "Level 52": KH1LocationData("Levels", 265_8052), + "Level 53": KH1LocationData("Levels", 265_8053), + "Level 54": KH1LocationData("Levels", 265_8054), + "Level 55": KH1LocationData("Levels", 265_8055), + "Level 56": KH1LocationData("Levels", 265_8056), + "Level 57": KH1LocationData("Levels", 265_8057), + "Level 58": KH1LocationData("Levels", 265_8058), + "Level 59": KH1LocationData("Levels", 265_8059), + "Level 60": KH1LocationData("Levels", 265_8060), + "Level 61": KH1LocationData("Levels", 265_8061), + "Level 62": KH1LocationData("Levels", 265_8062), + "Level 63": KH1LocationData("Levels", 265_8063), + "Level 64": KH1LocationData("Levels", 265_8064), + "Level 65": KH1LocationData("Levels", 265_8065), + "Level 66": KH1LocationData("Levels", 265_8066), + "Level 67": KH1LocationData("Levels", 265_8067), + "Level 68": KH1LocationData("Levels", 265_8068), + "Level 69": KH1LocationData("Levels", 265_8069), + "Level 70": KH1LocationData("Levels", 265_8070), + "Level 71": KH1LocationData("Levels", 265_8071), + "Level 72": KH1LocationData("Levels", 265_8072), + "Level 73": KH1LocationData("Levels", 265_8073), + "Level 74": KH1LocationData("Levels", 265_8074), + "Level 75": KH1LocationData("Levels", 265_8075), + "Level 76": KH1LocationData("Levels", 265_8076), + "Level 77": KH1LocationData("Levels", 265_8077), + "Level 78": KH1LocationData("Levels", 265_8078), + "Level 79": KH1LocationData("Levels", 265_8079), + "Level 80": KH1LocationData("Levels", 265_8080), + "Level 81": KH1LocationData("Levels", 265_8081), + "Level 82": KH1LocationData("Levels", 265_8082), + "Level 83": KH1LocationData("Levels", 265_8083), + "Level 84": KH1LocationData("Levels", 265_8084), + "Level 85": KH1LocationData("Levels", 265_8085), + "Level 86": KH1LocationData("Levels", 265_8086), + "Level 87": KH1LocationData("Levels", 265_8087), + "Level 88": KH1LocationData("Levels", 265_8088), + "Level 89": KH1LocationData("Levels", 265_8089), + "Level 90": KH1LocationData("Levels", 265_8090), + "Level 91": KH1LocationData("Levels", 265_8091), + "Level 92": KH1LocationData("Levels", 265_8092), + "Level 93": KH1LocationData("Levels", 265_8093), + "Level 94": KH1LocationData("Levels", 265_8094), + "Level 95": KH1LocationData("Levels", 265_8095), + "Level 96": KH1LocationData("Levels", 265_8096), + "Level 97": KH1LocationData("Levels", 265_8097), + "Level 98": KH1LocationData("Levels", 265_8098), + "Level 99": KH1LocationData("Levels", 265_8099), + "Level 100": KH1LocationData("Levels", 265_8100), + "Complete Phil Cup": KH1LocationData("Cups", 265_9001), + "Complete Pegasus Cup": KH1LocationData("Cups", 265_9002), + "Complete Hercules Cup": KH1LocationData("Cups", 265_9003), + "Complete Hades Cup": KH1LocationData("Cups", 265_9004), +} + +event_location_table: Dict[str, KH1LocationData] = { +} + +lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in location_table.items() if data.code} \ No newline at end of file diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py new file mode 100644 index 000000000000..ad47b077dcab --- /dev/null +++ b/worlds/kh1/Options.py @@ -0,0 +1,48 @@ +from typing import Dict + +from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionSet + +class Zeroes(DefaultOnToggle): + """ + Toggle whether 0 value cards should be included in the item pool. + """ + display_name = "Zeroes" + +class Cure(DefaultOnToggle): + """ + Toggle whether Cure cards should be included in the item pool. + """ + display_name = "Cure" + +class EarlyCure(DefaultOnToggle): + """ + Toggle whether one of the starting checks should include Cure 4-6 + """ + display_name = "Early Cure" + +class EnemyCards(DefaultOnToggle): + """ + Toggle whether Enemy Cards should be included in the item pool. + """ + display_name = "Enemy Cards" + +class DaysItems(Toggle): + """ + Toggle whether items not available to the player until they watch 358/2 Days are included in the item pool. + """ + display_name = "Days Items" + +class DaysLocations(Toggle): + """ + Toggle whether locations not available to the player until they watch 358/2 Days are included in the locations list. + """ + display_name = "Days Locations" + +khrecom_options: Dict[str, type(Option)] = { + "zeroes": Zeroes, + "cure": Cure, + "early_cure": EarlyCure, + "enemy_cards": EnemyCards, + "days_items": DaysItems, + "days_locations": DaysLocations, +} diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py new file mode 100644 index 000000000000..c746018f9e0e --- /dev/null +++ b/worlds/kh1/Regions.py @@ -0,0 +1,294 @@ +from typing import Dict, List, NamedTuple, Optional + +from BaseClasses import MultiWorld, Region, Entrance +from .Locations import KH1Location, location_table, get_locations_by_category + + +class KH1RegionData(NamedTuple): + locations: Optional[List[str]] + region_exits: Optional[List[str]] + + +def create_regions(multiworld: MultiWorld, player: int, days: bool): + regions: Dict[str, KH1RegionData] = { + "Menu": KH1RegionData(None, ["Awakening"]), + "Awakening": KH1RegionData([], ["Destiny Islands"]), + "Destiny Islands": KH1RegionData([], ["Traverse Town"]), + "Traverse Town": KH1RegionData([], ["World Map"]), + "Wonderland": KH1RegionData([], []), + "Olympus Coliseum": KH1RegionData([], []), + "Deep Jungle": KH1RegionData([], []), + "Agrabah": KH1RegionData([], []), + "Monstro": KH1RegionData([], []), + "Atlantica": KH1RegionData([], []), + "Halloween Town": KH1RegionData([], []), + "Neverland": KH1RegionData([], []), + "Hollow Bastion": KH1RegionData([], []), + "End of the World": KH1RegionData([], []), + "World Map": KH1RegionData([], ["Wonderland", "Olympus Coliseum", "Deep Jungle", + "Agrabah", "Monstro", "Atlantica", + "Halloween Town", "Neverland", "Hollow Bastion", + "End of the World"]) + } + + # Set up locations + #regions["Destiny Islands"].locations.append("Destiny Islands Chest"), missable + regions["Traverse Town"].locations.append("Traverse Town 1st District Candle Puzzle Chest"), + regions["Traverse Town"].locations.append("Traverse Town 1st District Accessory Shop Roof Chest"), + regions["Traverse Town"].locations.append("Traverse Town 2nd District Boots and Shoes Awning Chest"), + regions["Traverse Town"].locations.append("Traverse Town 2nd District Rooftop Chest"), + regions["Traverse Town"].locations.append("Traverse Town 2nd District Gizmo Shop Facade Chest"), + regions["Traverse Town"].locations.append("Traverse Town Alleyway Balcony Chest"), + regions["Traverse Town"].locations.append("Traverse Town Alleyway Blue Room Awning Chest"), + regions["Traverse Town"].locations.append("Traverse Town Alleyway Corner Chest"), + regions["Traverse Town"].locations.append("Traverse Town Green Room Clock Puzzle Chest"), + regions["Traverse Town"].locations.append("Traverse Town Green Room Table Chest"), + regions["Traverse Town"].locations.append("Traverse Town Red Room Chest"), + regions["Traverse Town"].locations.append("Traverse Town Mystical House Yellow Trinity Chest"), + regions["Traverse Town"].locations.append("Traverse Town Accessory Shop Chest"), + regions["Traverse Town"].locations.append("Traverse Town Secret Waterway White Trinity Chest"), + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Chest"), + regions["Traverse Town"].locations.append("Traverse Town Item Workshop Right Chest"), + regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity Balcony Chest"), + regions["Traverse Town"].locations.append("Traverse Town Mystical House Glide Chest"), + regions["Traverse Town"].locations.append("Traverse Town Alleyway Behind Crates Chest"), + regions["Traverse Town"].locations.append("Traverse Town Item Workshop Left Chest"), + regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Near Stairs Chest"), + regions["Wonderland"].locations.append("Wonderland Rabbit Hole Green Trinity Chest"), + #regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless After Trial Chest"), + regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest"), + regions["Wonderland"].locations.append("Wonderland Bizarre Room Green Trinity Chest"), + 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"), + regions["Wonderland"].locations.append("Wonderland Lotus Forest Thunder Plant Chest"), + regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting Thunder Plant 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 Corner Chest"), + regions["Wonderland"].locations.append("Wonderland Bizarre Room Lamp Chest"), + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest"), + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest"), + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Bear and Clock Puzzle Chest"), + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest"), + regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting White Trinity Chest"), + 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 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 Vines Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Vines 2 Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Climbing Trees Blue Trinity Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Tunnel Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Cavern of Hearts White Trinity Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Camp Blue Trinity Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Tent Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern Low Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern Middle Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern High Wall Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern High Middle Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Cliff Right Cliff Left Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Cliff Right Cliff Right Chest"), + regions["Deep Jungle"].locations.append("Deep Jungle Tree House Suspended Boat Chest"), + #regions["100 Acre Wood"].locations.append("100 Acre Wood Meadow Inside Log Chest"), + regions["Agrabah"].locations.append("Agrabah Plaza By Storage Chest"), + regions["Agrabah"].locations.append("Agrabah Plaza Raised Terrace Chest"), + regions["Agrabah"].locations.append("Agrabah Plaza Top Corner Chest"), + regions["Agrabah"].locations.append("Agrabah Alley Chest"), + regions["Agrabah"].locations.append("Agrabah Bazaar Across Windows Chest"), + regions["Agrabah"].locations.append("Agrabah Bazaar High Corner Chest"), + regions["Agrabah"].locations.append("Agrabah Main Street Right Palace Entrance Chest"), + regions["Agrabah"].locations.append("Agrabah Main Street High Above Alley Entrance Chest"), + regions["Agrabah"].locations.append("Agrabah Main Street High Above Palace Gates Entrance Chest"), + regions["Agrabah"].locations.append("Agrabah Palace Gates Low Chest"), + regions["Agrabah"].locations.append("Agrabah Palace Gates High Opposite Palace Chest"), + regions["Agrabah"].locations.append("Agrabah Palace Gates High Close to Palace Chest"), + regions["Agrabah"].locations.append("Agrabah Storage Green Trinity Chest"), + regions["Agrabah"].locations.append("Agrabah Storage Behind Barrel Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Entrance Left Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Entrance Tall Tower Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hall High Left Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Pillar Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Across Platforms Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Small Treasure Pile 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 Above Fire Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Relic Chamber Stairs Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Bridge Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Near Save Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hidden Room Right Chest"), + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hidden Room Left Chest"), + 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 Cave of Wonders Entrance White Trinity Chest"), + regions["Monstro"].locations.append("Monstro Chamber 6 Other Platform Chest"), + regions["Monstro"].locations.append("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), + regions["Monstro"].locations.append("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), + regions["Monstro"].locations.append("Monstro Chamber 6 Low Chest"), + regions["Atlantica"].locations.append("Atlantica Sunken Ship In Flipped Boat Chest"), + regions["Atlantica"].locations.append("Atlantica Sunken Ship Seabed Chest"), + regions["Atlantica"].locations.append("Atlantica Sunken Ship Inside Ship Chest"), + regions["Atlantica"].locations.append("Atlantica Ariel's Grotto High Chest"), + regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Middle Chest"), + regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Low Chest"), + regions["Atlantica"].locations.append("Atlantica Ursula's Lair Use Fire on Urchin Chest"), + regions["Atlantica"].locations.append("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest"), + regions["Atlantica"].locations.append("Atlantica Triton's Palace White Trinity Chest"), + regions["Halloween Town"].locations.append("Halloween Town Moonlight Hill White Trinity Chest"), + regions["Halloween Town"].locations.append("Halloween Town Bridge Under Bridge"), + regions["Halloween Town"].locations.append("Halloween Town Boneyard Tombstone Puzzle Chest"), + regions["Halloween Town"].locations.append("Halloween Town Bridge Right of Gate Chest"), + regions["Halloween Town"].locations.append("Halloween Town Cemetary Behind Grave Chest"), + regions["Halloween Town"].locations.append("Halloween Town Cemetary By Cat Shape Chest"), + regions["Halloween Town"].locations.append("Halloween Town Cemetary Between Graves Chest"), + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Lower Iron Cage Chest"), + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Upper Iron Cage Chest"), + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Hollow Chest"), + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Grounds Red Trinity Chest"), + regions["Halloween Town"].locations.append("Halloween Town Guillotine Square High Tower Chest"), + regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Pumpkin Structure Left Chest"), + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Entrance Steps Chest"), + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Inside Entrance Chest"), + regions["Halloween Town"].locations.append("Halloween Town Bridge Left of Gate Chest"), + regions["Halloween Town"].locations.append("Halloween Town Cemetary By Striped Grave Chest"), + regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Under Jack's House Stairs Chest"), + regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Pumpkin Structure Right Chest"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Left Behind Columns Chest"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates White Trinity Chest"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Blizzara Chest"), + regions["Monstro"].locations.append("Monstro Mouth Boat Deck Chest"), + regions["Monstro"].locations.append("Monstro Mouth High Platform Boat Side Chest"), + regions["Monstro"].locations.append("Monstro Mouth High Platform Across from Boat Chest"), + regions["Monstro"].locations.append("Monstro Mouth Near Ship Chest"), + regions["Monstro"].locations.append("Monstro Mouth Green Trinity Top of Boat Chest"), + regions["Monstro"].locations.append("Monstro Chamber 2 Ground Chest"), + regions["Monstro"].locations.append("Monstro Chamber 2 Platform Chest"), + regions["Monstro"].locations.append("Monstro Chamber 5 Platform Chest"), + regions["Monstro"].locations.append("Monstro Chamber 3 Ground Chest"), + regions["Monstro"].locations.append("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest"), + regions["Monstro"].locations.append("Monstro Chamber 3 Near Chamber 6 Entrance Chest"), + regions["Monstro"].locations.append("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest"), + regions["Monstro"].locations.append("Monstro Mouth High Platform Near Teeth Chest"), + regions["Monstro"].locations.append("Monstro Chamber 5 Atop Barrel Chest"), + regions["Monstro"].locations.append("Monstro Chamber 5 Low 2nd Chest"), + regions["Monstro"].locations.append("Monstro Chamber 5 Low 1st Chest"), + regions["Neverland"].locations.append("Neverland Pirate Ship Deck White Trinity Chest"), + regions["Neverland"].locations.append("Neverland Pirate Ship Crows Nest Chest"), + regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Right Blue Chest"), + regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Left Blue Chest"), + regions["Neverland"].locations.append("Neverland Galley Chest"), + regions["Neverland"].locations.append("Neverland Cabin Chest"), + regions["Neverland"].locations.append("Neverland Hold Flight 1st Chest "), + regions["Neverland"].locations.append("Neverland Clock Tower Chest"), + regions["Neverland"].locations.append("Neverland Hold Flight 2nd Chest"), + regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Green Chest"), + regions["Neverland"].locations.append("Neverland Captain's Cabin Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Water's Surface Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Under Water 1st Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Under Water 2nd Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls High Platform Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Castle Gates Gravity Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Castle Gates Freestanding Pillar Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Castle Gates High Pillar Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest Lower Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest After Battle Platform Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 2nd Gravity Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 1st Gravity Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower Above Sliding Gates Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Library 1st Floor Turn the Carousel Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Library 2nd Floor Turn the Carousel 2nd 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"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Outside Library Gravity Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Base Level Bubble Under the Wall Platform Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Base Level Platform Near Entrance Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Base Level Near Crystal Switch Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Waterway Near Save Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Waterway Blizzard on Bubble Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Waterway Unlock Passage from Base Level Chest"), + 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 Grand Hall Steps Right Side Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Oblivion Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Left of Gate Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Push the Statue Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls White Trinity Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 1st Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 2nd Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 3rd Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 4th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 5th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 6th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 10th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 9th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 8th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 7th Chest"), + regions["End of the World"].locations.append("End of the World Giant Crevasse 3rd Chest"), + regions["End of the World"].locations.append("End of the World Giant Crevasse 1st Chest"), + regions["End of the World"].locations.append("End of the World Giant Crevasse 4th Chest"), + regions["End of the World"].locations.append("End of the World Giant Crevasse 2nd Chest"), + regions["End of the World"].locations.append("End of the World World Terminus Traverse Town Chest"), + regions["End of the World"].locations.append("End of the World World Terminus Wonderland 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 Deep Jungle Chest"), + regions["End of the World"].locations.append("End of the World World Terminus Agrabah Chest"), + 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 Halloween Town 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 100 Acre Wood 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 Final Rest Chest"), + regions["Monstro"].locations.append("Monstro Chamber 6 White Trinity Chest"), + #regions["Awakening"].locations.append("Awakening Chest"), missable + + + # Set up the regions correctly. + for name, data in regions.items(): + multiworld.regions.append(create_region(multiworld, player, name, data)) + + multiworld.get_entrance("Awakening", player).connect(multiworld.get_region("Awakening", player)) + 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)) + 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)) + multiworld.get_entrance("End of the World", player).connect(multiworld.get_region("End of the World", player)) + multiworld.get_entrance("World Map", player).connect(multiworld.get_region("World Map", player)) + +def create_region(multiworld: MultiWorld, player: int, name: str, data: KH1RegionData): + region = Region(name, player, multiworld) + if data.locations: + for loc_name in data.locations: + loc_data = location_table.get(loc_name) + location = KH1Location(player, loc_name, loc_data.code if loc_data else None, region) + region.locations.append(location) + + if data.region_exits: + for exit in data.region_exits: + entrance = Entrance(player, exit, region) + region.exits.append(entrance) + + return region diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py new file mode 100644 index 000000000000..f1f62fcbb95e --- /dev/null +++ b/worlds/kh1/Rules.py @@ -0,0 +1,119 @@ +from BaseClasses import CollectionState, MultiWorld, LocationProgressType +from .Locations import get_locations_by_category + +#def has_room_of_beginnings(state: CollectionState, player: int, floor_num) -> bool: +# return state.has("Key of Beginnings F" + floor_num, player) +# +#def has_room_of_guidance(state: CollectionState, player: int, floor_num) -> bool: +# return state.has_all({"Key of Beginnings F" + floor_num, "Key of Guidance F" + floor_num}, player) +# +#def has_room_of_truth(state: CollectionState, player: int, floor_num) -> bool: +# return state.has_all({"Key of Beginnings F" + floor_num, "Key of Guidance F" + floor_num, "Key to Truth F" + floor_num}, player) + +def has_x_worlds(state: CollectionState, player: int, num_of_worlds) -> bool: + locations = 0 + if has_item(state, player,"World Card Wonderland"): + locations = locations + 1 + if has_item(state, player,"World Card Olympus Coliseum"): + locations = locations + 1 + if has_item(state, player,"World Card Monstro"): + locations = locations + 1 + if has_item(state, player,"World Card Agrabah"): + locations = locations + 1 + if has_item(state, player,"World Card Halloween Town"): + locations = locations + 1 + if has_item(state, player,"World Card Atlantica"): + locations = locations + 1 + if has_item(state, player,"World Card Neverland"): + locations = locations + 1 + if has_item(state, player,"World Card Hollow Bastion"): + locations = locations + 1 + if has_item(state, player,"World Card 100 Acre Wood"): + locations = locations + 1 + if has_item(state, player,"World Card Twilight Town"): + locations = locations + 1 + if has_item(state, player,"World Card Destiny Islands"): + locations = locations + 1 + if has_item(state, player,"World Card Castle Oblivion"): + locations = locations + 1 + if locations > num_of_worlds: + return True + return False + +def has_item(state: CollectionState, player: int, item) -> bool: + return state.has(item, player) + +def set_rules(multiworld: MultiWorld, player: int, days: bool): + #Location rules. + #Keys + multiworld.get_location("Traverse Town Room of Rewards (Attack Cards Lionheart)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Traverse Town") + multiworld.get_location("Olympus Coliseum Room of Rewards (Attack Cards Metal Chocobo)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Olympus Coliseum") + multiworld.get_location("Hollow Bastion Room of Rewards (Summon Cards Mushu)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Hollow Bastion") + multiworld.get_location("Destiny Islands Room of Rewards (Item Cards Megalixir)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Destiny Islands") + multiworld.get_location("Atlantica Post Floor (Magic Cards Aero)" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") + #multiworld.get_location("Twilight Town Post Floor (Item Cards Mega-Potion)" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") and has_item(state, player,"World Card Atlantica") Bugged because of the post cutscene? + multiworld.get_location("Destiny Islands Post Floor (Enemy Cards Larxene)" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") and has_item(state, player,"World Card Atlantica") + multiworld.get_location("Destiny Islands Post Floor (Enemy Cards Riku)" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") and has_item(state, player,"World Card Atlantica") + multiworld.get_location("Destiny Islands Post Floor (Attack Cards Oblivion)" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") and has_item(state, player,"World Card Atlantica") + multiworld.get_location("100 Acre Wood Tigger's Playground (Attack Cards Spellbinder)" , player).access_rule = lambda state: has_item(state, player,"World Card Neverland") and has_item(state, player,"World Card Monstro") + + #Days Rules + if days: + multiworld.get_location("Traverse Town Room of Rewards (Enemy Cards Saix)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Traverse Town") + multiworld.get_location("Wonderland Room of Rewards (Enemy Cards Xemnas)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Wonderland") + multiworld.get_location("Olympus Coliseum Room of Rewards (Attack Cards Total Eclipse)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Olympus Coliseum") + multiworld.get_location("Monstro Room of Rewards (Enemy Cards Xaldin)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Monstro") + multiworld.get_location("Agrabah Room of Rewards (Enemy Cards Luxord)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Agrabah") + multiworld.get_location("Halloween Town Room of Rewards (Attack Cards Bond of Flame)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Halloween Town") + multiworld.get_location("Atlantica Room of Rewards (Enemy Cards Demyx)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Atlantica") + multiworld.get_location("Neverland Room of Rewards (Attack Cards Midnight Roar)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Neverland") + multiworld.get_location("Hollow Bastion Room of Rewards (Enemy Cards Xigbar)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Hollow Bastion") + multiworld.get_location("Twilight Town Room of Rewards (Enemy Cards Roxas)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Twilight Town") + multiworld.get_location("Destiny Islands Room of Rewards (Attack Cards Two Become One)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Destiny Islands") + multiworld.get_location("Castle Oblivion Room of Rewards (Attack Cards Star Seeker)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Castle Oblivion") + + + multiworld.get_location("Heartless Air Pirate" , player).access_rule = lambda state: has_item(state, player,"World Card Neverland") + multiworld.get_location("Heartless Air Soldier" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Agrabah") or has_item(state, player,"World Card Halloween Town") or has_item(state, player,"World Card Destiny Islands") + multiworld.get_location("Heartless Aquatank" , player).access_rule = lambda state: has_item(state, player,"World Card Atlantica") + multiworld.get_location("Heartless Bandit" , player).access_rule = lambda state: has_item(state, player,"World Card Agrabah") + multiworld.get_location("Heartless Barrel Spider" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Agrabah") or has_item(state, player,"World Card Neverland") or has_item(state, player,"World Card Destiny Islands") + multiworld.get_location("Heartless Bouncywild" , player).access_rule = lambda state: has_item(state, player,"World Card Olympus Coliseum") + multiworld.get_location("Heartless Creeper Plant" , player).access_rule = lambda state: has_item(state, player,"World Card Wonderland") or has_item(state, player,"World Card Halloween Town") or has_item(state, player,"World Card Destiny Islands") + multiworld.get_location("Heartless Crescendo" , player).access_rule = lambda state: has_item(state, player,"World Card Wonderland") or has_item(state, player,"World Card Neverland") or has_item(state, player,"World Card Destiny Islands") + multiworld.get_location("Heartless Darkball" , player).access_rule = lambda state: has_item(state, player,"World Card Atlantica") or has_item(state, player,"World Card Neverland") or has_item(state, player,"World Card Destiny Islands") or has_item(state, player,"World Card Castle Oblivion") + multiworld.get_location("Heartless Defender" , player).access_rule = lambda state: has_item(state, player,"World Card Hollow Bastion") or has_item(state, player,"World Card Castle Oblivion") + multiworld.get_location("Heartless Fat Bandit" , player).access_rule = lambda state: has_item(state, player,"World Card Agrabah") + multiworld.get_location("Heartless Gargoyle" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") + multiworld.get_location("Heartless Green Requiem" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Agrabah") or has_item(state, player,"World Card Castle Oblivion") + multiworld.get_location("Heartless Large Body" , player).access_rule = lambda state: has_item(state, player,"World Card Wonderland") or has_item(state, player,"World Card Olympus Coliseum") + multiworld.get_location("Heartless Neoshadow" , player).access_rule = lambda state: has_item(state, player,"World Card Castle Oblivion") + multiworld.get_location("Heartless Pirate" , player).access_rule = lambda state: has_item(state, player,"World Card Neverland") + multiworld.get_location("Heartless Powerwild" , player).access_rule = lambda state: has_item(state, player,"World Card Olympus Coliseum") + multiworld.get_location("Heartless Screwdiver" , player).access_rule = lambda state: has_item(state, player,"World Card Atlantica") + multiworld.get_location("Heartless Sea Neon" , player).access_rule = lambda state: has_item(state, player,"World Card Atlantica") + multiworld.get_location("Heartless Search Ghost" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Atlantica") + multiworld.get_location("Heartless Tornado Step" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Hollow Bastion") or has_item(state, player,"World Card Destiny Islands") + multiworld.get_location("Heartless Wight Knight" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") + multiworld.get_location("Heartless Wizard" , player).access_rule = lambda state: has_item(state, player,"World Card Hollow Bastion") or has_item(state, player,"World Card Castle Oblivion") + multiworld.get_location("Heartless Wyvern" , player).access_rule = lambda state: has_item(state, player,"World Card Hollow Bastion") or has_item(state, player,"World Card Castle Oblivion") + multiworld.get_location("Heartless Yellow Opera" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Agrabah") or has_item(state, player,"World Card Neverland") or has_item(state, player,"World Card Castle Oblivion") + + # Region rules. + multiworld.get_entrance("Floor 2" , player).access_rule = lambda state: has_item(state, player,"World Card Wonderland") + multiworld.get_entrance("Floor 3" , player).access_rule = lambda state: has_item(state, player,"World Card Olympus Coliseum") + multiworld.get_entrance("Floor 4" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") + multiworld.get_entrance("Floor 5" , player).access_rule = lambda state: has_item(state, player,"World Card Agrabah") + multiworld.get_entrance("Floor 6" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") + multiworld.get_entrance("Floor 7" , player).access_rule = lambda state: has_item(state, player,"World Card Atlantica") + multiworld.get_entrance("Floor 8" , player).access_rule = lambda state: has_item(state, player,"World Card Neverland") + multiworld.get_entrance("Floor 9" , player).access_rule = lambda state: has_item(state, player,"World Card Hollow Bastion") + multiworld.get_entrance("Floor 10" , player).access_rule = lambda state: has_item(state, player,"World Card 100 Acre Wood") + multiworld.get_entrance("Floor 11" , player).access_rule = lambda state: has_item(state, player,"World Card Twilight Town") and has_x_worlds(state, player, 5) + multiworld.get_entrance("Floor 12" , player).access_rule = lambda state: has_item(state, player,"World Card Destiny Islands") and has_x_worlds(state, player, 7) + multiworld.get_entrance("Floor 13" , player).access_rule = lambda state: has_item(state, player,"World Card Castle Oblivion") and has_x_worlds(state, player, 9) + + + + # Win condition. + multiworld.completion_condition[player] = lambda state: state.has_all({"Friend Card Donald", "Friend Card Goofy", "Friend Card Aladdin", "Friend Card Ariel", "Friend Card Beast", "Friend Card Jack", "Friend Card Peter Pan"}, player) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py new file mode 100644 index 000000000000..eec32ea1b57b --- /dev/null +++ b/worlds/kh1/__init__.py @@ -0,0 +1,126 @@ +from typing import List + +from BaseClasses import Tutorial +from worlds.AutoWorld import WebWorld, World +from .Items import KHRECOMItem, KHRECOMItemData, event_item_table, get_items_by_category, item_table +from .Locations import KHRECOMLocation, location_table, get_locations_by_category +from .Options import khrecom_options +from .Regions import create_regions +from .Rules import set_rules +from worlds.LauncherComponents import Component, components, Type, launch_subprocess +import random + + + +def launch_client(): + from .Client import launch + launch_subprocess(launch, name="KHRECOM Client") + + +components.append(Component("KHRECOM Client", "KHRECOMClient", func=launch_client, component_type=Type.CLIENT)) + +class KHRECOMWeb(WebWorld): + theme = "ocean" + tutorials = [Tutorial( + "Multiworld Setup Guide", + "A guide to setting up the Kingdom Hearts RE Chain of Memories Randomizer software on your computer. This guide covers single-player, " + "multiworld, and related software.", + "English", + "khrecom_en.md", + "khrecom/en", + ["Gicu"] + )] + +class KHRECOMWorld(World): + """ + Kingdom Hearts RE Chain of Memories is an action card RPG following + Sora on his journey through Castle Oblivion to find Riku and Kairi. + """ + game = "Kingdom Hearts RE Chain of Memories" + option_definitions = khrecom_options + topology_present = True + data_version = 4 + required_client_version = (0, 3, 5) + web = KHRECOMWeb() + + item_name_to_id = {name: data.code for name, data in item_table.items()} + location_name_to_id = {name: data.code for name, data in location_table.items()} + + # TODO: Replace calls to this function with "options-dict", once that PR is completed and merged. + def get_setting(self, name: str): + return getattr(self.multiworld, name)[self.player] + + def fill_slot_data(self) -> dict: + return {option_name: self.get_setting(option_name).value for option_name in khrecom_options} + + def create_items(self): + item_pool: List[KHRECOMItem] = [] + starting_locations = get_locations_by_category("Starting") + starting_locations = random.sample(list(starting_locations.keys()),4) + starting_worlds = get_items_by_category("World Unlocks", []) + starting_worlds = random.sample(list(starting_worlds.keys()),3) + i = 0 + while i < 4: + if i < 3: + self.multiworld.get_location(starting_locations[i], self.player).place_locked_item(self.create_item(starting_worlds[i])) + elif i == 3 and self.get_setting("early_cure"): + self.multiworld.get_location(starting_locations[i], self.player).place_locked_item(self.create_item("Card Set Cure 4-6")) + i = i + 1 + total_locations = len(self.multiworld.get_unfilled_locations(self.player)) + for name, data in item_table.items(): + quantity = data.max_quantity + + # Ignore filler, it will be added in a later stage. + if data.category not in ["World Unlocks", "Gold Map Cards", "Friend Cards"]: + continue + if name not in starting_worlds: + item_pool += [self.create_item(name) for _ in range(0, quantity)] + + # Fill any empty locations with filler items. + item_names = [] + attempts = 0 #If we ever try to add items 200 times, and all the items are used up, lets clear the item_names array, we probably don't have enough items + while len(item_pool) < total_locations: + item_name = self.get_filler_item_name() + if item_name not in item_names or "Pack" in item_name: + item_names.append(item_name) + item_pool.append(self.create_item(item_name)) + attempts = 0 + elif attempts >= 200: + item_names = [] + attempts = 0 + else: + attempts = attempts + 1 + + self.multiworld.itempool += item_pool + + def get_filler_item_name(self) -> str: + fillers = {} + disclude = [] + if not self.get_setting("zeroes"): + disclude.append("0") + if not self.get_setting("cure"): + disclude.append("Cure") + if self.get_setting("early_cure"): + disclude.append("Cure 4-6") + if self.get_setting("enemy_cards"): + fillers.update(get_items_by_category("Enemy Cards", disclude)) + if self.get_setting("days_items"): + fillers.update(get_items_by_category("Days Sets", disclude)) + fillers.update(get_items_by_category("Days Enemy Cards", disclude)) + fillers.update(get_items_by_category("Sets", disclude)) + weights = [data.weight for data in fillers.values()] + return self.multiworld.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] + + def create_item(self, name: str) -> KHRECOMItem: + data = item_table[name] + return KHRECOMItem(name, data.classification, data.code, self.player) + + def create_event(self, name: str) -> KHRECOMItem: + data = event_item_table[name] + return KHRECOMItem(name, data.classification, data.code, self.player) + + def set_rules(self): + set_rules(self.multiworld, self.player, self.get_setting("days_locations")) + + def create_regions(self): + create_regions(self.multiworld, self.player, self.get_setting("days_locations")) \ No newline at end of file diff --git a/worlds/kh1/docs/en_Kingdom Hearts RE Chain of Memories.md b/worlds/kh1/docs/en_Kingdom Hearts RE Chain of Memories.md new file mode 100644 index 000000000000..95dd620283ce --- /dev/null +++ b/worlds/kh1/docs/en_Kingdom Hearts RE Chain of Memories.md @@ -0,0 +1,40 @@ +# Kingdom Hearts RE Chain of Memories (PC) + +## Where is the settings page? + +The [player settings page for this game](../player-settings) contains most of the options you need to +configure and export a config file. + +## What does randomization do to this game? + +The Kingdom Hearts RE Chain of Memories Randomizer will remove cards you pick up in the overworld, moogle shops, and as rewards from boss battles from your inventory. + +The entire castle is open from the start after completing Traverse Town. Floors you haven't unlocked are assigned Traverse Town, otherwise they will be assigned normally. + +Your goal is find all 7 friend cards (Aladdin, Ariel, Beast, Donald, Goofy, Jack, Peter Pan). These are tracked in your journal. + +## What items and locations get shuffled? + +###Items + +World Unlocks, Key of Rewards for each floor, Enemy Cards, and card sets are shuffled into the item pool. + +Card sets are comprised of a card type and a value range. For example, you might receive Blizzard 4-6, which means you receive Blizzard 4, Blizzard 5, and Blizzard 6. + +###Locations + +Journal entries for Attack, Magic, Summon, and Item Cards are locations, as well as the Enemy Card journal entries for boss enemy cards. + +Opening each floor's Room of Beginnings, Room of Guidance, and Room of Truth for the first time are also locations. + +## 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. + +## What do I do if I encounter a bug with the game? + +Please reach out to Gicu#7034 on Discord. \ No newline at end of file diff --git a/worlds/kh1/docs/khrecom_en.md b/worlds/kh1/docs/khrecom_en.md new file mode 100644 index 000000000000..edf8547045a4 --- /dev/null +++ b/worlds/kh1/docs/khrecom_en.md @@ -0,0 +1,51 @@ +# Kingdom Hearts RECOM Randomizer Setup Guide + +##Setting up the required mods +1. Install OpenKH and the LUA Backend. + + Download the latest release of OpenKH here: https://github.com/OpenKH/OpenKh/releases/tag/latest + + Extract the files to a directory of your choosing. + + Open OpenKh.Tools.ModsManager.exe and run first time set up. + + When prompted for game edition, choose PC Release via Epic Games Store and navigate to your KH_1.5_2.5 in the path box and click "Next" + + When prompted, install Panacea, then click "Next" + + When prompted, check ReCoM plus any other AP game you play (KH2) and click "Install and configure LUA backend", then click "Next". + + Ensure that "Launch via Epic Games" is checked and click "Next" + + Extract game data for ReCoM and any other AP game you play (KH2), then click "Next". + + Click "Finish" + +2. Open "OpenKh.Tools.ModsManager.exe" + +3. Click the drop down menu at the top-right and choose "Re:Chain of Memories" + +4. Click `Mods>Install a New Mod` + +5. In "Add a new mod from GitHub" paste `gaithern/KH-RECOM-AP-LUA` + +6. Click Install + +7. Navigate to Mod Loader and click "Build Only" + + +## Configuring your YAML file + +### What is a YAML file and why do I need one? + +Your YAML file contains a set of configuration options which provide the generator with information about how it should +generate your game. Each player of a multiworld will provide their own YAML file. This setup allows each player to enjoy +an experience customized for their taste, and different players in the same multiworld can all have different options. + +### Where do I get a YAML file? + +you can customize your settings by visiting the [Kingdom Hearts RE Chain of Memories Settings Page](/games/Kingdom%20Hearts%20RE%20Chain%20of%20Memories/player-settings). + +## Connect to the MultiServer + +On the title screen, open your KHRECOM Client and connect to your MultiServer. From 693b1cd9478396bc6027c9e22ed7a24bc3804994 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 31 Dec 2023 10:16:57 -0600 Subject: [PATCH 002/284] Continued Initial --- worlds/kh1/Client.py | 36 ++-- worlds/kh1/Items.py | 16 +- worlds/kh1/Options.py | 44 +---- worlds/kh1/Regions.py | 138 ++++++++++++++- worlds/kh1/Rules.py | 378 +++++++++++++++++++++++++++++++---------- worlds/kh1/__init__.py | 83 ++++----- 6 files changed, 486 insertions(+), 209 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 60b2f5909144..737d92a3f763 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -12,7 +12,7 @@ check_num = 0 if __name__ == "__main__": - Utils.init_logging("KHRECOMClient", exception_logger="Client") + Utils.init_logging("KH1Client", exception_logger="Client") from NetUtils import NetworkItem, ClientStatus from CommonClient import gui_enabled, logger, get_base_parser, ClientCommandProcessor, \ @@ -23,27 +23,27 @@ def check_stdin() -> None: if Utils.is_windows and sys.stdin: print("WARNING: Console input is not routed reliably on Windows, use the GUI instead.") -class KHRECOMClientCommandProcessor(ClientCommandProcessor): +class KH1ClientCommandProcessor(ClientCommandProcessor): def _cmd_test(self): """Test""" self.output(f"Test") -class KHRECOMContext(CommonContext): - command_processor: int = KHRECOMClientCommandProcessor - game = "Kingdom Hearts RE Chain of Memories" +class KH1Context(CommonContext): + command_processor: int = KH1ClientCommandProcessor + game = "Kingdom Hearts" items_handling = 0b111 # full remote def __init__(self, server_address, password): - super(KHRECOMContext, self).__init__(server_address, password) + super(KH1Context, self).__init__(server_address, password) self.send_index: int = 0 self.syncing = False self.awaiting_bridge = False # 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%/KHRECOM") + self.game_communication_path = os.path.expandvars(r"%localappdata%/KH1FM") else: - self.game_communication_path = os.path.expandvars(r"$HOME/KHRECOM") + self.game_communication_path = os.path.expandvars(r"$HOME/KH1FM") if not os.path.exists(self.game_communication_path): os.makedirs(self.game_communication_path) for root, dirs, files in os.walk(self.game_communication_path): @@ -53,12 +53,12 @@ def __init__(self, server_address, password): async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: - await super(KHRECOMContext, self).server_auth(password_requested) + await super(KH1Context, self).server_auth(password_requested) await self.get_username() await self.send_connect() async def connection_closed(self): - await super(KHRECOMContext, self).connection_closed() + await super(KH1Context, self).connection_closed() for root, dirs, files in os.walk(self.game_communication_path): for file in files: if file.find("obtain") <= -1: @@ -72,7 +72,7 @@ def endpoints(self): return [] async def shutdown(self): - await super(KHRECOMContext, self).shutdown() + await super(KH1Context, self).shutdown() for root, dirs, files in os.walk(self.game_communication_path): for file in files: if file.find("obtain") <= -1: @@ -124,17 +124,17 @@ def run_gui(self): """Import kivy UI system and start running it as self.ui_task.""" from kvui import GameManager - class KHRECOMManager(GameManager): + class KH1Manager(GameManager): logging_pairs = [ ("Client", "Archipelago") ] - base_title = "Archipelago KHRECOM Client" + base_title = "Archipelago KH1 Client" - self.ui = KHRECOMManager(self) + self.ui = KH1Manager(self) self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") -async def game_watcher(ctx: KHRECOMContext): +async def game_watcher(ctx: KH1Context): from worlds.khrecom.Locations import lookup_id_to_name while not ctx.exit_event.is_set(): if ctx.syncing == True: @@ -164,13 +164,13 @@ async def game_watcher(ctx: KHRECOMContext): def launch(): async def main(args): - ctx = KHRECOMContext(args.connect, args.password) + ctx = KH1Context(args.connect, args.password) ctx.server_task = asyncio.create_task(server_loop(ctx), name="server loop") if gui_enabled: ctx.run_gui() ctx.run_cli() progression_watcher = asyncio.create_task( - game_watcher(ctx), name="KHRECOMProgressionWatcher") + game_watcher(ctx), name="KH1ProgressionWatcher") await ctx.exit_event.wait() ctx.server_address = None @@ -181,7 +181,7 @@ async def main(args): import colorama - parser = get_base_parser(description="KHRECOM Client, for text interfacing.") + parser = get_base_parser(description="KH1 Client, for text interfacing.") args, rest = parser.parse_known_args() colorama.init() diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 6daf6016bf9c..8a36b467e3a5 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -236,7 +236,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 2": KH1ItemData("Key", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 3": KH1ItemData("Key", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -346,13 +346,13 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Max HP Up": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Max MP Up": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Max AP Up": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Strength Up": KH1ItemData("Level Up", code = 264_4004, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Defense Up": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Item Slot Up": KH1ItemData("Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Accessory Slot Up": KH1ItemData("Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Max MP Increase": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Max AP Increase": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Strength Increase": KH1ItemData("Level Up", code = 264_4004, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Defense Increase": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Item Slot Increase": KH1ItemData("Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Accessory Slot Increase": KH1ItemData("Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.useful, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index ad47b077dcab..1c7367f72364 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -2,47 +2,5 @@ from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionSet -class Zeroes(DefaultOnToggle): - """ - Toggle whether 0 value cards should be included in the item pool. - """ - display_name = "Zeroes" - -class Cure(DefaultOnToggle): - """ - Toggle whether Cure cards should be included in the item pool. - """ - display_name = "Cure" - -class EarlyCure(DefaultOnToggle): - """ - Toggle whether one of the starting checks should include Cure 4-6 - """ - display_name = "Early Cure" - -class EnemyCards(DefaultOnToggle): - """ - Toggle whether Enemy Cards should be included in the item pool. - """ - display_name = "Enemy Cards" - -class DaysItems(Toggle): - """ - Toggle whether items not available to the player until they watch 358/2 Days are included in the item pool. - """ - display_name = "Days Items" - -class DaysLocations(Toggle): - """ - Toggle whether locations not available to the player until they watch 358/2 Days are included in the locations list. - """ - display_name = "Days Locations" - -khrecom_options: Dict[str, type(Option)] = { - "zeroes": Zeroes, - "cure": Cure, - "early_cure": EarlyCure, - "enemy_cards": EnemyCards, - "days_items": DaysItems, - "days_locations": DaysLocations, +kh1_options: Dict[str, type(Option)] = { } diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index c746018f9e0e..ef4ca90d27b8 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,9 +9,9 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, days: bool): +def create_regions(multiworld: MultiWorld, player: int): regions: Dict[str, KH1RegionData] = { - "Menu": KH1RegionData(None, ["Awakening"]), + "Menu": KH1RegionData(None, ["Awakening", "Levels"]), "Awakening": KH1RegionData([], ["Destiny Islands"]), "Destiny Islands": KH1RegionData([], ["Traverse Town"]), "Traverse Town": KH1RegionData([], ["World Map"]), @@ -25,6 +25,7 @@ def create_regions(multiworld: MultiWorld, player: int, days: bool): "Neverland": KH1RegionData([], []), "Hollow Bastion": KH1RegionData([], []), "End of the World": KH1RegionData([], []), + "Levels": KH1RegionData([], []), "World Map": KH1RegionData([], ["Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", @@ -257,8 +258,138 @@ def create_regions(multiworld: MultiWorld, player: int, days: bool): regions["End of the World"].locations.append("End of the World Final Rest Chest"), regions["Monstro"].locations.append("Monstro Chamber 6 White Trinity Chest"), #regions["Awakening"].locations.append("Awakening Chest"), missable - + + regions["End of the World"].locations.append("Chronicles Sora's Story") + regions["Wonderland"].locations.append("Chronicles Wonderland") + regions["Olympus Coliseum"].locations.append("Chronicles Olympus Coliseum") + regions["Deep Jungle"].locations.append("Chronicles Deep Jungle") + regions["Agrabah"].locations.append("Chronicles Agrabah") + regions["Monstro"].locations.append("Chronicles Monstro") + #regions["100 Acre Wood"].locations.append("Chronicles 100 Acre Wood") + regions["Atlantica"].locations.append("Chronicles Atlantica") + regions["Halloween Town"].locations.append("Chronicles Halloween Town") + regions["Neverland"].locations.append("Chronicles Neverland") + regions["Agrabah"].locations.append("Ansem's Secret Report 1") + regions["Hollow Bastion"].locations.append("Ansem's Secret Report 2") + regions["Atlantica"].locations.append("Ansem's Secret Report 3") + regions["Hollow Bastion"].locations.append("Ansem's Secret Report 4") + regions["Hollow Bastion"].locations.append("Ansem's Secret Report 5") + regions["Hollow Bastion"].locations.append("Ansem's Secret Report 6") + regions["Halloween Town"].locations.append("Ansem's Secret Report 7") + regions["Olympus Coliseum"].locations.append("Ansem's Secret Report 8") + regions["Neverland"].locations.append("Ansem's Secret Report 9") + regions["Hollow Bastion"].locations.append("Ansem's Secret Report 10") + #regions["Agrabah"].locations.append("Ansem's Secret Report 11") + #regions["Olympus Coliseum"].locations.append("Ansem's Secret Report 12") + #regions["Hollow Bastion"].locations.append("Ansem's Secret Report 13") + + regions["Levels"].locations.append("Level 1") + regions["Levels"].locations.append("Level 2") + regions["Levels"].locations.append("Level 3") + regions["Levels"].locations.append("Level 4") + regions["Levels"].locations.append("Level 5") + regions["Levels"].locations.append("Level 6") + regions["Levels"].locations.append("Level 7") + regions["Levels"].locations.append("Level 8") + regions["Levels"].locations.append("Level 9") + regions["Levels"].locations.append("Level 10") + regions["Levels"].locations.append("Level 11") + regions["Levels"].locations.append("Level 12") + regions["Levels"].locations.append("Level 13") + regions["Levels"].locations.append("Level 14") + regions["Levels"].locations.append("Level 15") + regions["Levels"].locations.append("Level 16") + regions["Levels"].locations.append("Level 17") + regions["Levels"].locations.append("Level 18") + regions["Levels"].locations.append("Level 19") + regions["Levels"].locations.append("Level 20") + regions["Levels"].locations.append("Level 21") + regions["Levels"].locations.append("Level 22") + regions["Levels"].locations.append("Level 23") + regions["Levels"].locations.append("Level 24") + regions["Levels"].locations.append("Level 25") + regions["Levels"].locations.append("Level 26") + regions["Levels"].locations.append("Level 27") + regions["Levels"].locations.append("Level 28") + regions["Levels"].locations.append("Level 29") + regions["Levels"].locations.append("Level 30") + regions["Levels"].locations.append("Level 31") + regions["Levels"].locations.append("Level 32") + regions["Levels"].locations.append("Level 33") + regions["Levels"].locations.append("Level 34") + regions["Levels"].locations.append("Level 35") + regions["Levels"].locations.append("Level 36") + regions["Levels"].locations.append("Level 37") + regions["Levels"].locations.append("Level 38") + regions["Levels"].locations.append("Level 39") + regions["Levels"].locations.append("Level 40") + regions["Levels"].locations.append("Level 41") + regions["Levels"].locations.append("Level 42") + regions["Levels"].locations.append("Level 43") + regions["Levels"].locations.append("Level 44") + regions["Levels"].locations.append("Level 45") + regions["Levels"].locations.append("Level 46") + regions["Levels"].locations.append("Level 47") + regions["Levels"].locations.append("Level 48") + regions["Levels"].locations.append("Level 49") + regions["Levels"].locations.append("Level 50") + regions["Levels"].locations.append("Level 51") + regions["Levels"].locations.append("Level 52") + regions["Levels"].locations.append("Level 53") + regions["Levels"].locations.append("Level 54") + regions["Levels"].locations.append("Level 55") + regions["Levels"].locations.append("Level 56") + regions["Levels"].locations.append("Level 57") + regions["Levels"].locations.append("Level 58") + regions["Levels"].locations.append("Level 59") + regions["Levels"].locations.append("Level 60") + regions["Levels"].locations.append("Level 61") + regions["Levels"].locations.append("Level 62") + regions["Levels"].locations.append("Level 63") + regions["Levels"].locations.append("Level 64") + regions["Levels"].locations.append("Level 65") + regions["Levels"].locations.append("Level 66") + regions["Levels"].locations.append("Level 67") + regions["Levels"].locations.append("Level 68") + regions["Levels"].locations.append("Level 69") + regions["Levels"].locations.append("Level 70") + regions["Levels"].locations.append("Level 71") + regions["Levels"].locations.append("Level 72") + regions["Levels"].locations.append("Level 73") + regions["Levels"].locations.append("Level 74") + regions["Levels"].locations.append("Level 75") + regions["Levels"].locations.append("Level 76") + regions["Levels"].locations.append("Level 77") + regions["Levels"].locations.append("Level 78") + regions["Levels"].locations.append("Level 79") + regions["Levels"].locations.append("Level 80") + regions["Levels"].locations.append("Level 81") + regions["Levels"].locations.append("Level 82") + regions["Levels"].locations.append("Level 83") + regions["Levels"].locations.append("Level 84") + regions["Levels"].locations.append("Level 85") + regions["Levels"].locations.append("Level 86") + regions["Levels"].locations.append("Level 87") + regions["Levels"].locations.append("Level 88") + regions["Levels"].locations.append("Level 89") + regions["Levels"].locations.append("Level 90") + regions["Levels"].locations.append("Level 91") + regions["Levels"].locations.append("Level 92") + regions["Levels"].locations.append("Level 93") + regions["Levels"].locations.append("Level 94") + regions["Levels"].locations.append("Level 95") + regions["Levels"].locations.append("Level 96") + regions["Levels"].locations.append("Level 97") + regions["Levels"].locations.append("Level 98") + regions["Levels"].locations.append("Level 99") + regions["Levels"].locations.append("Level 100") + + regions["Olympus Coliseum"].locations.append("Complete Phil Cup") + regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup") + regions["Olympus Coliseum"].locations.append("Complete Hercules Cup") + regions["Olympus Coliseum"].locations.append("Complete Hades Cup") + # Set up the regions correctly. for name, data in regions.items(): multiworld.regions.append(create_region(multiworld, player, name, data)) @@ -277,6 +408,7 @@ def create_regions(multiworld: MultiWorld, player: int, days: bool): multiworld.get_entrance("Hollow Bastion", player).connect(multiworld.get_region("Hollow Bastion", player)) multiworld.get_entrance("End of the World", player).connect(multiworld.get_region("End of the World", 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)) 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 f1f62fcbb95e..83cd18817d3a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,119 +1,319 @@ from BaseClasses import CollectionState, MultiWorld, LocationProgressType from .Locations import get_locations_by_category -#def has_room_of_beginnings(state: CollectionState, player: int, floor_num) -> bool: -# return state.has("Key of Beginnings F" + floor_num, player) -# -#def has_room_of_guidance(state: CollectionState, player: int, floor_num) -> bool: -# return state.has_all({"Key of Beginnings F" + floor_num, "Key of Guidance F" + floor_num}, player) -# -#def has_room_of_truth(state: CollectionState, player: int, floor_num) -> bool: -# return state.has_all({"Key of Beginnings F" + floor_num, "Key of Guidance F" + floor_num, "Key to Truth F" + floor_num}, player) - def has_x_worlds(state: CollectionState, player: int, num_of_worlds) -> bool: locations = 0 - if has_item(state, player,"World Card Wonderland"): - locations = locations + 1 - if has_item(state, player,"World Card Olympus Coliseum"): - locations = locations + 1 - if has_item(state, player,"World Card Monstro"): + if has_item(state, player,"Wonderland"): locations = locations + 1 - if has_item(state, player,"World Card Agrabah"): + if has_item(state, player,"Olympus Coliseum"): locations = locations + 1 - if has_item(state, player,"World Card Halloween Town"): + if has_item(state, player,"Deep Jungle"): locations = locations + 1 - if has_item(state, player,"World Card Atlantica"): + if has_item(state, player,"Agrabah"): locations = locations + 1 - if has_item(state, player,"World Card Neverland"): + if has_item(state, player,"Monstro"): locations = locations + 1 - if has_item(state, player,"World Card Hollow Bastion"): + if has_item(state, player,"Atlantica"): locations = locations + 1 - if has_item(state, player,"World Card 100 Acre Wood"): + if has_item(state, player,"Halloween Town"): locations = locations + 1 - if has_item(state, player,"World Card Twilight Town"): + if has_item(state, player,"Neverland"): locations = locations + 1 - if has_item(state, player,"World Card Destiny Islands"): + if has_item(state, player,"Hollow Bastion"): locations = locations + 1 - if has_item(state, player,"World Card Castle Oblivion"): + #if has_item(state, player,"100 Acre Wood"): + # locations = locations + 1 + if has_item(state, player,"End of the World"): locations = locations + 1 if locations > num_of_worlds: return True return False +def has_slides(state: CollectionState, player: int) -> bool: + return state.has("Slide 1", player) and state.has("Slide 2", player) and state.has("Slide 3", player) and state.has("Slide 4", player) and state.has("Slide 5", player) and state.has("Slide 6", player) + +def has_evidence(state: CollectionState, player: int) -> bool: + return state.has("Footprints", player) or state.has("Stench", player) or state.has("Claw Marks", player) or state.has("Antenna", player) + +def can_glide(state: CollectionState, player: int) -> bool: + return state.has("Glide", player) or state.has("Super Glide", player) + +def has_emblems(state: CollectionState, player: int) -> bool: + return state.has("Emblem Piece (Flame)", player) and state.has("Emblem Piece (Chest)", player) and state.has("Emblem Piece (Statue)", player) and state.has("Emblem Piece (Fountain)", player) + def has_item(state: CollectionState, player: int, item) -> bool: return state.has(item, player) -def set_rules(multiworld: MultiWorld, player: int, days: bool): +def set_rules(multiworld: MultiWorld, player: int): #Location rules. #Keys - multiworld.get_location("Traverse Town Room of Rewards (Attack Cards Lionheart)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Traverse Town") - multiworld.get_location("Olympus Coliseum Room of Rewards (Attack Cards Metal Chocobo)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Olympus Coliseum") - multiworld.get_location("Hollow Bastion Room of Rewards (Summon Cards Mushu)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Hollow Bastion") - multiworld.get_location("Destiny Islands Room of Rewards (Item Cards Megalixir)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Destiny Islands") - multiworld.get_location("Atlantica Post Floor (Magic Cards Aero)" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") - #multiworld.get_location("Twilight Town Post Floor (Item Cards Mega-Potion)" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") and has_item(state, player,"World Card Atlantica") Bugged because of the post cutscene? - multiworld.get_location("Destiny Islands Post Floor (Enemy Cards Larxene)" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") and has_item(state, player,"World Card Atlantica") - multiworld.get_location("Destiny Islands Post Floor (Enemy Cards Riku)" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") and has_item(state, player,"World Card Atlantica") - multiworld.get_location("Destiny Islands Post Floor (Attack Cards Oblivion)" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") and has_item(state, player,"World Card Atlantica") - multiworld.get_location("100 Acre Wood Tigger's Playground (Attack Cards Spellbinder)" , player).access_rule = lambda state: has_item(state, player,"World Card Neverland") and has_item(state, player,"World Card Monstro") + #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Traverse Town 1st District Candle Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") + #multiworld.get_location("Traverse Town 1st District Accessory Shop Roof Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town 2nd District Rooftop Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town 2nd District Gizmo Shop Facade Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Alleyway Balcony Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Alleyway Blue Room Awning Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Alleyway Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Green Room Clock Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Green Room Table Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Red Room Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Traverse Town Mystical House Yellow Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") + #multiworld.get_location("Traverse Town Accessory Shop Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Progressive Fire") + #multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") + multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: has_item(state, player, "Glide") + multiworld.get_location("Traverse Town Alleyway Behind Crates Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") + multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") + multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Trial Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest" , player).access_rule = lambda state: has_item(state, player, "Hollow Bastion") and has_x_worlds(state, player, 7) + multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Wonderland Lotus Forest Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") + multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") + multiworld.get_location("Wonderland Lotus Forest Glide Chest" , player).access_rule = lambda state: can_glide(state, player) + #multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + #multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) + multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + #multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Deep Jungle Hippo's Lagoon Center Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Deep Jungle Hippo's Lagoon Left Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Deep Jungle Hippo's Lagoon Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + #multiworld.get_location("Deep Jungle Vines Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Deep Jungle Vines 2 Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Deep Jungle Climbing Trees Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") + #multiworld.get_location("Deep Jungle Tunnel Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Deep Jungle Cavern of Hearts White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_slides(state, player) + multiworld.get_location("Deep Jungle Camp Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") + #multiworld.get_location("Deep Jungle Tent Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Deep Jungle Waterfall Cavern Low Chest" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Waterfall Cavern Middle Chest" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Waterfall Cavern High Wall Chest" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Waterfall Cavern High Middle Chest" , player).access_rule = lambda state: has_slides(state, player) + #multiworld.get_location("Deep Jungle Cliff Right Cliff Left Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Deep Jungle Cliff Right Cliff Right Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Deep Jungle Tree House Suspended Boat Chest" , player).access_rule = lambda state: can_glide(state, player) + #multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Plaza By Storage Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Plaza Raised Terrace Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Plaza Top Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Alley Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Bazaar Across Windows Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Bazaar High Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Main Street Right Palace Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Main Street High Above Alley Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Palace Gates Low Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Agrabah Palace Gates High Opposite Palace Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Agrabah Palace Gates High Close to Palace Chest" , player).access_rule = lambda state: can_glide(state, player) + multiworld.get_location("Agrabah Storage Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Agrabah Storage Behind Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Entrance Left Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + #multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Above Fire Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Relic Chamber Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest", player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Bridge Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") + multiworld.get_location("Agrabah Cave of Wonders Hidden Room Right Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") + multiworld.get_location("Agrabah Cave of Wonders Hidden Room Left Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") + #multiworld.get_location("Agrabah Aladdin's House Main Street Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Aladdin's House Plaza Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + multiworld.get_location("Monstro Chamber 6 Other Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Ariel's Grotto High Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Ariel's Grotto Middle Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Ariel's Grotto Low Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_item(state, player, "Crystal Trident") and has_item(state, player, "Mermaid Kick") + #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + #multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + #multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") and has_item(state, player, "Red Trinity") + multiworld.get_location("Halloween Town Guillotine Square High Tower Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + #multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + #multiworld.get_location("Olympus Coliseum Coliseum Gates Left Behind Columns Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") + multiworld.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") + multiworld.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") + #multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and has_item(state, player, "Green Trinity") + #multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Monstro Chamber 2 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Monstro Chamber 3 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + #multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Monstro Chamber 5 Low 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Monstro Chamber 5 Low 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Neverland Pirate Ship Deck White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + #multiworld.get_location("Neverland Pirate Ship Crows Nest Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Neverland Hold Yellow Trinity Right Blue Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") + multiworld.get_location("Neverland Hold Yellow Trinity Left Blue Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") + #multiworld.get_location("Neverland Galley Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Neverland Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Neverland Hold Flight 1st Chest " , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Neverland Clock Tower Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Neverland Hold Flight 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Neverland Hold Yellow Trinity Green Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") + #multiworld.get_location("Neverland Captain's Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Rising Falls Water's Surface Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Rising Falls Under Water 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + #multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + #multiworld.get_location("Hollow Bastion High Tower Above Sliding Gates Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Library 1st Floor Turn the Carousel Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + #multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + #multiworld.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Base Level Platform Near Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Base Level Near Crystal Switch Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Waterway Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") + #multiworld.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Dungeon By Candles Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Dungeon Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Grand Hall Steps Right Side Chest" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Grand Hall Oblivion Chest" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Grand Hall Left of Gate Chest" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Entrance Hall Push the Statue Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Rising Falls White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + #multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 4th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 5th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 6th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 10th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 9th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World World Terminus Traverse Town Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World World Terminus Wonderland Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World World Terminus Olympus Coliseum Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World World Terminus Deep Jungle Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World World Terminus Agrabah Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World World Terminus Atlantica Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World World Terminus Halloween Town Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World World Terminus Neverland Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World World Terminus 100 Acre Wood Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World World Terminus Hollow Bastion Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Rest Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") - #Days Rules - if days: - multiworld.get_location("Traverse Town Room of Rewards (Enemy Cards Saix)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Traverse Town") - multiworld.get_location("Wonderland Room of Rewards (Enemy Cards Xemnas)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Wonderland") - multiworld.get_location("Olympus Coliseum Room of Rewards (Attack Cards Total Eclipse)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Olympus Coliseum") - multiworld.get_location("Monstro Room of Rewards (Enemy Cards Xaldin)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Monstro") - multiworld.get_location("Agrabah Room of Rewards (Enemy Cards Luxord)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Agrabah") - multiworld.get_location("Halloween Town Room of Rewards (Attack Cards Bond of Flame)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Halloween Town") - multiworld.get_location("Atlantica Room of Rewards (Enemy Cards Demyx)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Atlantica") - multiworld.get_location("Neverland Room of Rewards (Attack Cards Midnight Roar)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Neverland") - multiworld.get_location("Hollow Bastion Room of Rewards (Enemy Cards Xigbar)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Hollow Bastion") - multiworld.get_location("Twilight Town Room of Rewards (Enemy Cards Roxas)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Twilight Town") - multiworld.get_location("Destiny Islands Room of Rewards (Attack Cards Two Become One)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Destiny Islands") - multiworld.get_location("Castle Oblivion Room of Rewards (Attack Cards Star Seeker)" , player).access_rule = lambda state: has_item(state, player,"Key to Rewards Castle Oblivion") - + #multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Chronicles Wonderland" , player).access_rule = lambda state: has_evidence(state, player) + multiworld.get_location("Chronicles Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player, "Hades Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Chronicles Deep Jungle" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Chronicles Agrabah" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Chronicles Monstro" , player).access_rule = lambda state: has_item(state, player, "High Jump") + #multiworld.get_location("Chronicles 100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_item(state, player, "Crystal Trident") + #multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Heartless Air Pirate" , player).access_rule = lambda state: has_item(state, player,"World Card Neverland") - multiworld.get_location("Heartless Air Soldier" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Agrabah") or has_item(state, player,"World Card Halloween Town") or has_item(state, player,"World Card Destiny Islands") - multiworld.get_location("Heartless Aquatank" , player).access_rule = lambda state: has_item(state, player,"World Card Atlantica") - multiworld.get_location("Heartless Bandit" , player).access_rule = lambda state: has_item(state, player,"World Card Agrabah") - multiworld.get_location("Heartless Barrel Spider" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Agrabah") or has_item(state, player,"World Card Neverland") or has_item(state, player,"World Card Destiny Islands") - multiworld.get_location("Heartless Bouncywild" , player).access_rule = lambda state: has_item(state, player,"World Card Olympus Coliseum") - multiworld.get_location("Heartless Creeper Plant" , player).access_rule = lambda state: has_item(state, player,"World Card Wonderland") or has_item(state, player,"World Card Halloween Town") or has_item(state, player,"World Card Destiny Islands") - multiworld.get_location("Heartless Crescendo" , player).access_rule = lambda state: has_item(state, player,"World Card Wonderland") or has_item(state, player,"World Card Neverland") or has_item(state, player,"World Card Destiny Islands") - multiworld.get_location("Heartless Darkball" , player).access_rule = lambda state: has_item(state, player,"World Card Atlantica") or has_item(state, player,"World Card Neverland") or has_item(state, player,"World Card Destiny Islands") or has_item(state, player,"World Card Castle Oblivion") - multiworld.get_location("Heartless Defender" , player).access_rule = lambda state: has_item(state, player,"World Card Hollow Bastion") or has_item(state, player,"World Card Castle Oblivion") - multiworld.get_location("Heartless Fat Bandit" , player).access_rule = lambda state: has_item(state, player,"World Card Agrabah") - multiworld.get_location("Heartless Gargoyle" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") - multiworld.get_location("Heartless Green Requiem" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Agrabah") or has_item(state, player,"World Card Castle Oblivion") - multiworld.get_location("Heartless Large Body" , player).access_rule = lambda state: has_item(state, player,"World Card Wonderland") or has_item(state, player,"World Card Olympus Coliseum") - multiworld.get_location("Heartless Neoshadow" , player).access_rule = lambda state: has_item(state, player,"World Card Castle Oblivion") - multiworld.get_location("Heartless Pirate" , player).access_rule = lambda state: has_item(state, player,"World Card Neverland") - multiworld.get_location("Heartless Powerwild" , player).access_rule = lambda state: has_item(state, player,"World Card Olympus Coliseum") - multiworld.get_location("Heartless Screwdiver" , player).access_rule = lambda state: has_item(state, player,"World Card Atlantica") - multiworld.get_location("Heartless Sea Neon" , player).access_rule = lambda state: has_item(state, player,"World Card Atlantica") - multiworld.get_location("Heartless Search Ghost" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Atlantica") - multiworld.get_location("Heartless Tornado Step" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Hollow Bastion") or has_item(state, player,"World Card Destiny Islands") - multiworld.get_location("Heartless Wight Knight" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") - multiworld.get_location("Heartless Wizard" , player).access_rule = lambda state: has_item(state, player,"World Card Hollow Bastion") or has_item(state, player,"World Card Castle Oblivion") - multiworld.get_location("Heartless Wyvern" , player).access_rule = lambda state: has_item(state, player,"World Card Hollow Bastion") or has_item(state, player,"World Card Castle Oblivion") - multiworld.get_location("Heartless Yellow Opera" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") or has_item(state, player,"World Card Agrabah") or has_item(state, player,"World Card Neverland") or has_item(state, player,"World Card Castle Oblivion") - - # Region rules. - multiworld.get_entrance("Floor 2" , player).access_rule = lambda state: has_item(state, player,"World Card Wonderland") - multiworld.get_entrance("Floor 3" , player).access_rule = lambda state: has_item(state, player,"World Card Olympus Coliseum") - multiworld.get_entrance("Floor 4" , player).access_rule = lambda state: has_item(state, player,"World Card Monstro") - multiworld.get_entrance("Floor 5" , player).access_rule = lambda state: has_item(state, player,"World Card Agrabah") - multiworld.get_entrance("Floor 6" , player).access_rule = lambda state: has_item(state, player,"World Card Halloween Town") - multiworld.get_entrance("Floor 7" , player).access_rule = lambda state: has_item(state, player,"World Card Atlantica") - multiworld.get_entrance("Floor 8" , player).access_rule = lambda state: has_item(state, player,"World Card Neverland") - multiworld.get_entrance("Floor 9" , player).access_rule = lambda state: has_item(state, player,"World Card Hollow Bastion") - multiworld.get_entrance("Floor 10" , player).access_rule = lambda state: has_item(state, player,"World Card 100 Acre Wood") - multiworld.get_entrance("Floor 11" , player).access_rule = lambda state: has_item(state, player,"World Card Twilight Town") and has_x_worlds(state, player, 5) - multiworld.get_entrance("Floor 12" , player).access_rule = lambda state: has_item(state, player,"World Card Destiny Islands") and has_x_worlds(state, player, 7) - multiworld.get_entrance("Floor 13" , player).access_rule = lambda state: has_item(state, player,"World Card Castle Oblivion") and has_x_worlds(state, player, 9) + #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_item(state, player, "Crystal Trident") + multiworld.get_location("Ansem's Secret Report 4" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Ansem's Secret Report 6" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Ansem's Secret Report 7" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + multiworld.get_location("Ansem's Secret Report 8" , player).access_rule = lambda state: has_item(state, player, "Hades Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Entry Pass") + #multiworld.get_location("Ansem's Secret Report 9" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Ansem's Secret Report 10" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("Ansem's Secret Report 11" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Ansem's Secret Report 13" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Entry Pass") + multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") and has_item(state, player, "Entry Pass") + multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_item(state, player, "Entry Pass") + multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Hades Cup") and has_item(state, player, "Entry Pass") + # Region rules. + multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") + multiworld.get_entrance("Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player,"Olympus Coliseum") + multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: has_item(state, player,"Deep Jungle") + multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: has_item(state, player,"Agrabah") + multiworld.get_entrance("Monstro" , player).access_rule = lambda state: has_item(state, player,"Monstro") + multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") + multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") + multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) + multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) and has_item(state, player, "High Jump") + multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"End of the World") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") # Win condition. - multiworld.completion_condition[player] = lambda state: state.has_all({"Friend Card Donald", "Friend Card Goofy", "Friend Card Aladdin", "Friend Card Ariel", "Friend Card Beast", "Friend Card Jack", "Friend Card Peter Pan"}, player) + multiworld.completion_condition[player] = lambda state: state.has_all({"End of the World", "High Jump", "Glide"}, player) and has_x_worlds(state, player, 7) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index eec32ea1b57b..ef8f32b6fde9 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -2,9 +2,9 @@ from BaseClasses import Tutorial from worlds.AutoWorld import WebWorld, World -from .Items import KHRECOMItem, KHRECOMItemData, event_item_table, get_items_by_category, item_table -from .Locations import KHRECOMLocation, location_table, get_locations_by_category -from .Options import khrecom_options +from .Items import KH1Item, KH1ItemData, event_item_table, get_items_by_category, item_table +from .Locations import KH1Location, location_table, get_locations_by_category +from .Options import kh1_options from .Regions import create_regions from .Rules import set_rules from worlds.LauncherComponents import Component, components, Type, launch_subprocess @@ -14,34 +14,34 @@ def launch_client(): from .Client import launch - launch_subprocess(launch, name="KHRECOM Client") + launch_subprocess(launch, name="KH1 Client") -components.append(Component("KHRECOM Client", "KHRECOMClient", func=launch_client, component_type=Type.CLIENT)) +components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT)) -class KHRECOMWeb(WebWorld): +class KH1Web(WebWorld): theme = "ocean" tutorials = [Tutorial( "Multiworld Setup Guide", - "A guide to setting up the Kingdom Hearts RE Chain of Memories Randomizer software on your computer. This guide covers single-player, " + "A guide to setting up the Kingdom Hearts Randomizer software on your computer. This guide covers single-player, " "multiworld, and related software.", "English", - "khrecom_en.md", - "khrecom/en", + "kh1_en.md", + "kh1/en", ["Gicu"] )] -class KHRECOMWorld(World): +class KH1World(World): """ - Kingdom Hearts RE Chain of Memories is an action card RPG following - Sora on his journey through Castle Oblivion to find Riku and Kairi. + Kingdom Hearts is an action RPG following Sora on his journey + through many worlds to find Riku and Kairi. """ - game = "Kingdom Hearts RE Chain of Memories" - option_definitions = khrecom_options + game = "Kingdom Hearts" + option_definitions = kh1_options topology_present = True data_version = 4 required_client_version = (0, 3, 5) - web = KHRECOMWeb() + web = KH1Web() item_name_to_id = {name: data.code for name, data in item_table.items()} location_name_to_id = {name: data.code for name, data in location_table.items()} @@ -51,37 +51,31 @@ def get_setting(self, name: str): return getattr(self.multiworld, name)[self.player] def fill_slot_data(self) -> dict: - return {option_name: self.get_setting(option_name).value for option_name in khrecom_options} + return {option_name: self.get_setting(option_name).value for option_name in kh1_options} def create_items(self): - item_pool: List[KHRECOMItem] = [] - starting_locations = get_locations_by_category("Starting") - starting_locations = random.sample(list(starting_locations.keys()),4) - starting_worlds = get_items_by_category("World Unlocks", []) - starting_worlds = random.sample(list(starting_worlds.keys()),3) + item_pool: List[KH1Item] = [] + level_up_locations = list(get_locations_by_category("Levels").keys()) + level_up_rewards = list(get_items_by_category("Level Up", []).keys()) i = 0 - while i < 4: - if i < 3: - self.multiworld.get_location(starting_locations[i], self.player).place_locked_item(self.create_item(starting_worlds[i])) - elif i == 3 and self.get_setting("early_cure"): - self.multiworld.get_location(starting_locations[i], self.player).place_locked_item(self.create_item("Card Set Cure 4-6")) + while i < 100: + self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(random.choice(level_up_rewards))) i = i + 1 total_locations = len(self.multiworld.get_unfilled_locations(self.player)) for name, data in item_table.items(): quantity = data.max_quantity # Ignore filler, it will be added in a later stage. - if data.category not in ["World Unlocks", "Gold Map Cards", "Friend Cards"]: + if data.category not in ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades"]: continue - if name not in starting_worlds: - item_pool += [self.create_item(name) for _ in range(0, quantity)] + item_pool += [self.create_item(name) for _ in range(0, quantity)] # Fill any empty locations with filler items. item_names = [] attempts = 0 #If we ever try to add items 200 times, and all the items are used up, lets clear the item_names array, we probably don't have enough items while len(item_pool) < total_locations: item_name = self.get_filler_item_name() - if item_name not in item_names or "Pack" in item_name: + if item_name not in item_names: item_names.append(item_name) item_pool.append(self.create_item(item_name)) attempts = 0 @@ -96,31 +90,24 @@ def create_items(self): def get_filler_item_name(self) -> str: fillers = {} disclude = [] - if not self.get_setting("zeroes"): - disclude.append("0") - if not self.get_setting("cure"): - disclude.append("Cure") - if self.get_setting("early_cure"): - disclude.append("Cure 4-6") - if self.get_setting("enemy_cards"): - fillers.update(get_items_by_category("Enemy Cards", disclude)) - if self.get_setting("days_items"): - fillers.update(get_items_by_category("Days Sets", disclude)) - fillers.update(get_items_by_category("Days Enemy Cards", disclude)) - fillers.update(get_items_by_category("Sets", disclude)) + fillers.update(get_items_by_category("Item", disclude)) + fillers.update(get_items_by_category("Accessory", disclude)) + fillers.update(get_items_by_category("Weapons", disclude)) + fillers.update(get_items_by_category("Camping", disclude)) + fillers.update(get_items_by_category("Stat Ups", disclude)) weights = [data.weight for data in fillers.values()] return self.multiworld.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] - def create_item(self, name: str) -> KHRECOMItem: + def create_item(self, name: str) -> KH1Item: data = item_table[name] - return KHRECOMItem(name, data.classification, data.code, self.player) + return KH1Item(name, data.classification, data.code, self.player) - def create_event(self, name: str) -> KHRECOMItem: + def create_event(self, name: str) -> KH1Item: data = event_item_table[name] - return KHRECOMItem(name, data.classification, data.code, self.player) + return KH1Item(name, data.classification, data.code, self.player) def set_rules(self): - set_rules(self.multiworld, self.player, self.get_setting("days_locations")) + set_rules(self.multiworld, self.player) def create_regions(self): - create_regions(self.multiworld, self.player, self.get_setting("days_locations")) \ No newline at end of file + create_regions(self.multiworld, self.player) \ No newline at end of file From c8913778222e82bcb5a4fe8d68793a02bbc6a6ca Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 31 Dec 2023 11:14:21 -0600 Subject: [PATCH 003/284] Bug fixes --- worlds/kh1/Client.py | 2 +- worlds/kh1/Items.py | 4 ++-- worlds/kh1/Rules.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 737d92a3f763..f5e215ba046d 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -135,7 +135,7 @@ class KH1Manager(GameManager): async def game_watcher(ctx: KH1Context): - from worlds.khrecom.Locations import lookup_id_to_name + from worlds.kh1.Locations import lookup_id_to_name while not ctx.exit_event.is_set(): if ctx.syncing == True: sync_msg = [{'cmd': 'Sync'}] diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 8a36b467e3a5..25468a8997cf 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -351,8 +351,8 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Max AP Increase": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Strength Increase": KH1ItemData("Level Up", code = 264_4004, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Defense Increase": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Item Slot Increase": KH1ItemData("Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Accessory Slot Increase": KH1ItemData("Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Accessory Slot Increase": KH1ItemData("Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Item Slot Increase": KH1ItemData("Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.useful, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 83cd18817d3a..f0c22481b1ca 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -62,7 +62,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Traverse Town Mystical House Yellow Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") #multiworld.get_location("Traverse Town Accessory Shop Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Progressive Fire") - #multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: has_item(state, player, "Glide") From 605c4dffbc4742ff70aedb6e531a454adee3d073 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 31 Dec 2023 11:45:15 -0600 Subject: [PATCH 004/284] Changed required item in HT --- worlds/kh1/Items.py | 2 +- worlds/kh1/Rules.py | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 25468a8997cf..c8439d49f162 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -252,7 +252,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index f0c22481b1ca..391abcee0cde 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -158,20 +158,20 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") #multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") - #multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") - multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") - multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") - multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") and has_item(state, player, "Red Trinity") + multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Red Trinity") multiworld.get_location("Halloween Town Guillotine Square High Tower Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") - multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") #multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -290,7 +290,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Ansem's Secret Report 4" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 6" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Ansem's Secret Report 7" , player).access_rule = lambda state: has_item(state, player, "Forget-Me-Not") + multiworld.get_location("Ansem's Secret Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") multiworld.get_location("Ansem's Secret Report 8" , player).access_rule = lambda state: has_item(state, player, "Hades Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Entry Pass") #multiworld.get_location("Ansem's Secret Report 9" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 10" , player).access_rule = lambda state: has_emblems(state, player) From 9fca40eb475756f0635a053796eade5d5d7dfb22 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 31 Dec 2023 14:44:36 -0600 Subject: [PATCH 005/284] Update Rules.py --- worlds/kh1/Rules.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 391abcee0cde..5c97f5023fbd 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -59,16 +59,16 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Traverse Town Green Room Clock Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town Green Room Table Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town Red Room Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Mystical House Yellow Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") + multiworld.get_location("Traverse Town Mystical House Yellow Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Accessory Shop Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Red Trinity") multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") - multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: has_item(state, player, "Glide") + multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: has_item(state, player, "Glide") and has_item(state, player, "Progressive Fire") multiworld.get_location("Traverse Town Alleyway Behind Crates Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") + multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Trial Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest" , player).access_rule = lambda state: has_item(state, player, "Hollow Bastion") and has_x_worlds(state, player, 7) From 26fd18595f889c6dd9980b5de24669cf15504398 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 31 Dec 2023 15:34:38 -0600 Subject: [PATCH 006/284] Update Rules.py --- worlds/kh1/Rules.py | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 5c97f5023fbd..079315ad0212 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -73,15 +73,15 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Trial Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest" , player).access_rule = lambda state: has_item(state, player, "Hollow Bastion") and has_x_worlds(state, player, 7) multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") + multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") + multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") multiworld.get_location("Wonderland Lotus Forest Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") multiworld.get_location("Wonderland Lotus Forest Glide Chest" , player).access_rule = lambda state: can_glide(state, player) #multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - #multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: has_evidence(state, player) @@ -157,23 +157,23 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_item(state, player, "Crystal Trident") and has_item(state, player, "Mermaid Kick") #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Red Trinity") multiworld.get_location("Halloween Town Guillotine Square High Tower Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - #multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) #multiworld.get_location("Olympus Coliseum Coliseum Gates Left Behind Columns Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -309,8 +309,8 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: has_item(state, player,"Deep Jungle") multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: has_item(state, player,"Agrabah") multiworld.get_entrance("Monstro" , player).access_rule = lambda state: has_item(state, player,"Monstro") - multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") - multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") + multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) + multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) and has_item(state, player, "High Jump") multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"End of the World") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") From 0ecd6943dcb44d841796421125343a1af9d72fc0 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 1 Jan 2024 11:04:01 -0600 Subject: [PATCH 007/284] Added victory, rules fixes, removed useless items --- worlds/kh1/Items.py | 23 ++++++++++++----------- worlds/kh1/Rules.py | 2 +- worlds/kh1/__init__.py | 1 + 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index c8439d49f162..2e287e58f198 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -26,6 +26,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat item_table: Dict[str, KH1ItemData] = { + "Victory": KH1ItemData("Victory", code = 264_0000, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, weight = 10), "Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, weight = 10), "Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, weight = 10), @@ -106,11 +107,11 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.useful, max_quantity = 1, weight = 10), @@ -128,7 +129,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.filler, max_quantity = 1, weight = 10), @@ -144,7 +145,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + #"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.filler, max_quantity = 1, weight = 10), @@ -285,11 +286,11 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2, weight = 10), + "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 3, weight = 10), + "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 3, weight = 10), "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 079315ad0212..8d3af1d8bb6f 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -115,7 +115,7 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Agrabah Bazaar High Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Main Street Right Palace Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Main Street High Above Alley Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Agrabah Palace Gates Low Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Agrabah Palace Gates High Opposite Palace Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Agrabah Palace Gates High Close to Palace Chest" , player).access_rule = lambda state: can_glide(state, player) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index ef8f32b6fde9..80b1dfc86708 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -61,6 +61,7 @@ def create_items(self): while i < 100: self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(random.choice(level_up_rewards))) i = i + 1 + self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) total_locations = len(self.multiworld.get_unfilled_locations(self.player)) for name, data in item_table.items(): quantity = data.max_quantity From dda4e0c29790e2eef2b8f243742bb94c6b6c10bf Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 1 Jan 2024 11:14:37 -0600 Subject: [PATCH 008/284] Changed victory condition, removed EXP Zero --- worlds/kh1/Items.py | 4 ++-- worlds/kh1/Rules.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 2e287e58f198..71c119b484a2 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -345,7 +345,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Max MP Increase": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15, weight = 10), @@ -376,7 +376,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Atlantica": KH1ItemData("Worlds", code = 264_7007, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Monstro": KH1ItemData("Worlds", code = 264_7011, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Blue Trinity": KH1ItemData("Trinities", code = 264_8001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Red Trinity": KH1ItemData("Trinities", code = 264_8002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 8d3af1d8bb6f..0dfd45aae644 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -313,7 +313,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) and has_item(state, player, "High Jump") - multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"End of the World") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") + multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) # Win condition. - multiworld.completion_condition[player] = lambda state: state.has_all({"End of the World", "High Jump", "Glide"}, player) and has_x_worlds(state, player, 7) + multiworld.completion_condition[player] = lambda state: state.has_all({"Victory"}, player) \ No newline at end of file From ef4808811373766db1e0c36d71d936cb70c9d9c4 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 1 Jan 2024 13:34:55 -0600 Subject: [PATCH 009/284] More Rule fixes, removing wrong items --- worlds/kh1/Items.py | 20 ++++++++++---------- worlds/kh1/Rules.py | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 71c119b484a2..6f565eb5e108 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -204,14 +204,14 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Ansem's Report 8": KH1ItemData("Key", code = 264_1175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Ansem's Report 9": KH1ItemData("Key", code = 264_1176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Ansem's Report 10": KH1ItemData("Key", code = 264_1177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Khama Vol. 8": KH1ItemData("Key", code = 264_1178, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Salegg Vol. 6": KH1ItemData("Key", code = 264_1179, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Azal Vol. 3": KH1ItemData("Key", code = 264_1180, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Mava Vol. 3": KH1ItemData("Key", code = 264_1181, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Mava Vol. 6": KH1ItemData("Key", code = 264_1182, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Khama Vol. 8": KH1ItemData("Key", code = 264_1178, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Salegg Vol. 6": KH1ItemData("Key", code = 264_1179, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Azal Vol. 3": KH1ItemData("Key", code = 264_1180, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Mava Vol. 3": KH1ItemData("Key", code = 264_1181, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Mava Vol. 6": KH1ItemData("Key", code = 264_1182, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -255,7 +255,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Pretty Stone": KH1ItemData("Synthesis", code = 264_1231, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, max_quantity = 1, weight = 10), @@ -344,7 +344,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 0dfd45aae644..3a75c06bac30 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -275,7 +275,7 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Wonderland" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Chronicles Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player, "Hades Cup") and has_x_worlds(state, player, 7) + #multiworld.get_location("Chronicles Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Deep Jungle" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Chronicles Agrabah" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Monstro" , player).access_rule = lambda state: has_item(state, player, "High Jump") @@ -312,8 +312,8 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) - multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) and has_item(state, player, "High Jump") - multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) + multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) and has_item(state, player, "High Jump") and has_item(state, player, "Green Trinity") + multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) and has_item(state, player, "Green Trinity") # Win condition. multiworld.completion_condition[player] = lambda state: state.has_all({"Victory"}, player) \ No newline at end of file From 961644e33566bf12712c5b106a0a14710c516219 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 1 Jan 2024 16:05:01 -0600 Subject: [PATCH 010/284] Update Rules.py --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 3a75c06bac30..c1f8997ad2ab 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -184,7 +184,7 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and has_item(state, player, "Green Trinity") #multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 2 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") From 795e7c14774b5685d579d8ce21b917da3aa7a4cf Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 1 Jan 2024 21:50:38 -0600 Subject: [PATCH 011/284] Logic Fixes, Ability Counts --- worlds/kh1/Items.py | 8 ++++---- worlds/kh1/Rules.py | 32 ++++++++++++++++---------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 6f565eb5e108..95d1b693e85f 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -287,8 +287,8 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2, weight = 10), - "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 3, weight = 10), - "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 3, weight = 10), + "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 4, weight = 10), + "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 2, weight = 10), "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, max_quantity = 1, weight = 10), @@ -305,7 +305,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.useful, max_quantity = 2, weight = 10), "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, max_quantity = 1, weight = 10), @@ -341,7 +341,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, max_quantity = 4, weight = 10), "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index c1f8997ad2ab..0acde2625b13 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -197,17 +197,17 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 5 Low 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 5 Low 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Neverland Pirate Ship Deck White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - #multiworld.get_location("Neverland Pirate Ship Crows Nest Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Neverland Pirate Ship Deck White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Pirate Ship Crows Nest Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Hold Yellow Trinity Right Blue Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") multiworld.get_location("Neverland Hold Yellow Trinity Left Blue Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") #multiworld.get_location("Neverland Galley Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Neverland Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Neverland Hold Flight 1st Chest " , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Neverland Clock Tower Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Neverland Hold Flight 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Neverland Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Hold Flight 1st Chest " , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Clock Tower Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Hold Flight 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Hold Yellow Trinity Green Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") - #multiworld.get_location("Neverland Captain's Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Neverland Captain's Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Rising Falls Water's Surface Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Rising Falls Under Water 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -227,10 +227,10 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") - multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") + multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") #multiworld.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Base Level Platform Near Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -281,8 +281,8 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Chronicles Monstro" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Chronicles 100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_item(state, player, "Crystal Trident") - #multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) @@ -291,8 +291,8 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 6" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Ansem's Secret Report 8" , player).access_rule = lambda state: has_item(state, player, "Hades Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Entry Pass") - #multiworld.get_location("Ansem's Secret Report 9" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Ansem's Secret Report 8" , player).access_rule = lambda state: has_item(state, player, "Hades Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Ansem's Secret Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Ansem's Secret Report 10" , player).access_rule = lambda state: has_emblems(state, player) #multiworld.get_location("Ansem's Secret Report 11" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "") @@ -312,8 +312,8 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) - multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) and has_item(state, player, "High Jump") and has_item(state, player, "Green Trinity") - multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) and has_item(state, player, "Green Trinity") + multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) and has_item(state, player, "High Jump") + multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) # Win condition. multiworld.completion_condition[player] = lambda state: state.has_all({"Victory"}, player) \ No newline at end of file From e6f5d097cd0bb7a80b12fbe72f97d2092a521d8a Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 1 Jan 2024 23:11:39 -0600 Subject: [PATCH 012/284] Halloween Town Fire Logic --- worlds/kh1/Items.py | 2 +- worlds/kh1/Rules.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 95d1b693e85f..aedf7416425b 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -289,7 +289,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2, weight = 10), "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 4, weight = 10), "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 2, weight = 10), - "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, max_quantity = 3, weight = 10), #"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.useful, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 0acde2625b13..a38f34da0943 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -157,8 +157,8 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_item(state, player, "Crystal Trident") and has_item(state, player, "Mermaid Kick") #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") #multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") @@ -172,7 +172,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) @@ -273,15 +273,15 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) multiworld.get_location("Chronicles Wonderland" , player).access_rule = lambda state: has_evidence(state, player) #multiworld.get_location("Chronicles Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Deep Jungle" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Chronicles Agrabah" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Chronicles Agrabah" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Monstro" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Chronicles 100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_item(state, player, "Crystal Trident") - multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") @@ -290,7 +290,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Ansem's Secret Report 4" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 6" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Ansem's Secret Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Ansem's Secret Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") multiworld.get_location("Ansem's Secret Report 8" , player).access_rule = lambda state: has_item(state, player, "Hades Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Ansem's Secret Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Ansem's Secret Report 10" , player).access_rule = lambda state: has_emblems(state, player) From 7e5cf7de06412a9d260f3a4eb2344f85dc40b38b Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 2 Jan 2024 14:16:17 -0600 Subject: [PATCH 013/284] Removed unreachable location, logic fixes --- worlds/kh1/Locations.py | 2 +- worlds/kh1/Rules.py | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index c38b9c9431f2..5582031cff40 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -258,7 +258,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: #"Chronicles 100 Acre Wood": KH1LocationData("Chronicles", 265_6258), "Chronicles Atlantica": KH1LocationData("Chronicles", 265_6297), "Chronicles Halloween Town": KH1LocationData("Chronicles", 265_6336), - "Chronicles Neverland": KH1LocationData("Chronicles", 265_6376), + #"Chronicles Neverland": KH1LocationData("Chronicles", 265_6376), "Ansem's Secret Report 1": KH1LocationData("Reports", 265_7018), "Ansem's Secret Report 2": KH1LocationData("Reports", 265_7017), "Ansem's Secret Report 3": KH1LocationData("Reports", 265_7016), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index a38f34da0943..53fbe8b4e3e8 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -126,7 +126,7 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -144,10 +144,10 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Agrabah Aladdin's House Main Street Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Aladdin's House Plaza Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Monstro Chamber 6 Other Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Chamber 6 Other Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + #multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + #multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -184,17 +184,17 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and has_item(state, player, "Green Trinity") #multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 2 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Monstro Chamber 3 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - #multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Monstro Chamber 5 Low 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 5 Low 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Neverland Pirate Ship Deck White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Green Trinity") @@ -282,7 +282,7 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Chronicles 100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_item(state, player, "Crystal Trident") multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) From c7d80341df7fb5ad80bf32750eb433d5b812ca37 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 2 Jan 2024 16:07:52 -0600 Subject: [PATCH 014/284] Many logic fixes --- worlds/kh1/Items.py | 2 +- worlds/kh1/Rules.py | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index aedf7416425b..1db7713e8aab 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -236,7 +236,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 2": KH1ItemData("Key", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 53fbe8b4e3e8..67366f54ad04 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -44,6 +44,9 @@ def has_emblems(state: CollectionState, player: int) -> bool: def has_item(state: CollectionState, player: int, item) -> bool: return state.has(item, player) +def has_at_least(state: CollectionState, player: int, item, x) -> bool: + return state.count(item, player) >= x + def set_rules(multiworld: MultiWorld, player: int): #Location rules. #Keys @@ -154,7 +157,7 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Atlantica Ariel's Grotto High Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Ariel's Grotto Middle Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Ariel's Grotto Low Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_item(state, player, "Crystal Trident") and has_item(state, player, "Mermaid Kick") + multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_item(state, player, "Mermaid Kick") #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") @@ -180,7 +183,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") multiworld.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") multiworld.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") + multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: has_at_least(state, player, "Progressive Blizzard", 2) #multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") @@ -217,21 +220,21 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") #multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") - multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") - #multiworld.get_location("Hollow Bastion High Tower Above Sliding Gates Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) + multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) + multiworld.get_location("Hollow Bastion High Tower Above Sliding Gates Chest" , player).access_rule = lambda state: has_emblems(state, player) #multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Library 1st Floor Turn the Carousel Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") + multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") and has_emblems(state, player) multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") - #multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") - multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) #multiworld.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Base Level Platform Near Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Base Level Near Crystal Switch Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -280,13 +283,13 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Chronicles Agrabah" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Monstro" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Chronicles 100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_item(state, player, "Crystal Trident") + multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_item(state, player, "Crystal Trident") + multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") multiworld.get_location("Ansem's Secret Report 4" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 6" , player).access_rule = lambda state: has_emblems(state, player) From 424df26cb5f1181a8b8cdb34e30206e0b01fab26 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 2 Jan 2024 23:44:09 -0600 Subject: [PATCH 015/284] Small changes --- worlds/kh1/Items.py | 2 +- worlds/kh1/Rules.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 1db7713e8aab..40fa08a712d5 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -256,7 +256,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Pretty Stone": KH1ItemData("Synthesis", code = 264_1231, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"Lucid Shard": KH1ItemData("Synthesis", code = 264_1233, classification = ItemClassification.filler, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 67366f54ad04..9fa9fa18c80a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -64,14 +64,14 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Traverse Town Red Room Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Traverse Town Mystical House Yellow Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Accessory Shop Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Red Trinity") + multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: has_item(state, player, "Glide") and has_item(state, player, "Progressive Fire") multiworld.get_location("Traverse Town Alleyway Behind Crates Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") + #multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Trial Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest" , player).access_rule = lambda state: has_item(state, player, "Hollow Bastion") and has_x_worlds(state, player, 7) From 9130be23045687e111b8d8c8305da7ccf81d9f54 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 3 Jan 2024 09:57:41 -0600 Subject: [PATCH 016/284] Logic Changes --- worlds/kh1/Locations.py | 50 +++++++++++++++++++-------------------- worlds/kh1/Regions.py | 52 ++++++++++++++++++++--------------------- worlds/kh1/Rules.py | 34 +++++++++++++-------------- 3 files changed, 68 insertions(+), 68 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 5582031cff40..f5c92f3e35f0 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -48,7 +48,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town Secret Waterway Near Stairs Chest": KH1LocationData("Chests", 265_0894), "Wonderland Rabbit Hole Green Trinity Chest": KH1LocationData("Chests", 265_0931), #"Wonderland Rabbit Hole Defeat Heartless After Trial Chest": KH1LocationData("Chests", 265_0933), missable - "Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest": KH1LocationData("Chests", 265_0934), + #"Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest": KH1LocationData("Chests", 265_0934), Go mode, just remove "Wonderland Bizarre Room Green Trinity Chest": KH1LocationData("Chests", 265_0971), "Wonderland Queen's Castle Hedge Left Red Chest": KH1LocationData("Chests", 265_1011), "Wonderland Queen's Castle Hedge Right Blue Chest": KH1LocationData("Chests", 265_1012), @@ -220,36 +220,36 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Hollow Bastion Grand Hall Steps Right Side Chest": KH1LocationData("Chests", 265_4454), "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Chests", 265_4491), "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Chests", 265_4492), - "Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Chests", 265_4493), + #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Chests", 265_4493), "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Chests", 265_4494), - "End of the World Final Dimension 1st Chest": KH1LocationData("Chests", 265_4531), - "End of the World Final Dimension 2nd Chest": KH1LocationData("Chests", 265_4532), - "End of the World Final Dimension 3rd Chest": KH1LocationData("Chests", 265_4533), - "End of the World Final Dimension 4th Chest": KH1LocationData("Chests", 265_4534), - "End of the World Final Dimension 5th Chest": KH1LocationData("Chests", 265_4571), - "End of the World Final Dimension 6th Chest": KH1LocationData("Chests", 265_4572), - "End of the World Final Dimension 10th Chest": KH1LocationData("Chests", 265_4573), - "End of the World Final Dimension 9th Chest": KH1LocationData("Chests", 265_4574), - "End of the World Final Dimension 8th Chest": KH1LocationData("Chests", 265_4611), - "End of the World Final Dimension 7th Chest": KH1LocationData("Chests", 265_4612), - "End of the World Giant Crevasse 3rd Chest": KH1LocationData("Chests", 265_4613), - "End of the World Giant Crevasse 1st Chest": KH1LocationData("Chests", 265_4651), - "End of the World Giant Crevasse 4th Chest": KH1LocationData("Chests", 265_4652), - "End of the World Giant Crevasse 2nd Chest": KH1LocationData("Chests", 265_4653), - "End of the World World Terminus Traverse Town Chest": KH1LocationData("Chests", 265_4654), - "End of the World World Terminus Wonderland Chest": KH1LocationData("Chests", 265_4691), - "End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("Chests", 265_4692), - "End of the World World Terminus Deep Jungle Chest": KH1LocationData("Chests", 265_4693), - "End of the World World Terminus Agrabah Chest": KH1LocationData("Chests", 265_4694), - "End of the World World Terminus Atlantica Chest": KH1LocationData("Chests", 265_4731), - "End of the World World Terminus Halloween Town Chest": KH1LocationData("Chests", 265_4732), - "End of the World World Terminus Neverland Chest": KH1LocationData("Chests", 265_4733), + #"End of the World Final Dimension 1st Chest": KH1LocationData("Chests", 265_4531), + #"End of the World Final Dimension 2nd Chest": KH1LocationData("Chests", 265_4532), + #"End of the World Final Dimension 3rd Chest": KH1LocationData("Chests", 265_4533), + #"End of the World Final Dimension 4th Chest": KH1LocationData("Chests", 265_4534), + #"End of the World Final Dimension 5th Chest": KH1LocationData("Chests", 265_4571), + #"End of the World Final Dimension 6th Chest": KH1LocationData("Chests", 265_4572), + #"End of the World Final Dimension 10th Chest": KH1LocationData("Chests", 265_4573), + #"End of the World Final Dimension 9th Chest": KH1LocationData("Chests", 265_4574), + #"End of the World Final Dimension 8th Chest": KH1LocationData("Chests", 265_4611), + #"End of the World Final Dimension 7th Chest": KH1LocationData("Chests", 265_4612), + #"End of the World Giant Crevasse 3rd Chest": KH1LocationData("Chests", 265_4613), + #"End of the World Giant Crevasse 1st Chest": KH1LocationData("Chests", 265_4651), + #"End of the World Giant Crevasse 4th Chest": KH1LocationData("Chests", 265_4652), + #"End of the World Giant Crevasse 2nd Chest": KH1LocationData("Chests", 265_4653), + #"End of the World World Terminus Traverse Town Chest": KH1LocationData("Chests", 265_4654), + #"End of the World World Terminus Wonderland Chest": KH1LocationData("Chests", 265_4691), + #"End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("Chests", 265_4692), + #"End of the World World Terminus Deep Jungle Chest": KH1LocationData("Chests", 265_4693), + #"End of the World World Terminus Agrabah Chest": KH1LocationData("Chests", 265_4694), + #"End of the World World Terminus Atlantica Chest": KH1LocationData("Chests", 265_4731), + #"End of the World World Terminus Halloween Town Chest": KH1LocationData("Chests", 265_4732), + #"End of the World World Terminus Neverland Chest": KH1LocationData("Chests", 265_4733), "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("Chests", 265_4734), "End of the World World Terminus Hollow Bastion Chest": KH1LocationData("Chests", 265_4771), "End of the World Final Rest Chest": KH1LocationData("Chests", 265_4772), "Monstro Chamber 6 White Trinity Chest": KH1LocationData("Chests", 265_5092), #"Awakening Chest": KH1LocationData("Chests", 265_5093), missable - "Chronicles Sora's Story": KH1LocationData("Chronicles", 265_6014), + #"Chronicles Sora's Story": KH1LocationData("Chronicles", 265_6014), "Chronicles Wonderland": KH1LocationData("Chronicles", 265_6056), "Chronicles Olympus Coliseum": KH1LocationData("Chronicles", 265_6097), "Chronicles Deep Jungle": KH1LocationData("Chronicles", 265_6136), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index ef4ca90d27b8..16325225df43 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -57,7 +57,7 @@ def create_regions(multiworld: MultiWorld, player: int): regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Near Stairs Chest"), regions["Wonderland"].locations.append("Wonderland Rabbit Hole Green Trinity Chest"), #regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless After Trial Chest"), - regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest"), + #regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest"), regions["Wonderland"].locations.append("Wonderland Bizarre Room Green Trinity Chest"), regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Left Red Chest"), regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Right Blue Chest"), @@ -229,37 +229,37 @@ def create_regions(multiworld: MultiWorld, player: int): regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Steps Right Side Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Oblivion Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Left of Gate Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Push the Statue Chest"), + #regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Push the Statue Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls White Trinity Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 1st Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 2nd Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 3rd Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 4th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 5th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 6th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 10th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 9th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 8th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 7th Chest"), - regions["End of the World"].locations.append("End of the World Giant Crevasse 3rd Chest"), - regions["End of the World"].locations.append("End of the World Giant Crevasse 1st Chest"), - regions["End of the World"].locations.append("End of the World Giant Crevasse 4th Chest"), - regions["End of the World"].locations.append("End of the World Giant Crevasse 2nd Chest"), - regions["End of the World"].locations.append("End of the World World Terminus Traverse Town Chest"), - regions["End of the World"].locations.append("End of the World World Terminus Wonderland 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 Deep Jungle Chest"), - regions["End of the World"].locations.append("End of the World World Terminus Agrabah Chest"), - 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 Halloween Town 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 Final Dimension 1st Chest"), + #regions["End of the World"].locations.append("End of the World Final Dimension 2nd Chest"), + #regions["End of the World"].locations.append("End of the World Final Dimension 3rd Chest"), + #regions["End of the World"].locations.append("End of the World Final Dimension 4th Chest"), + #regions["End of the World"].locations.append("End of the World Final Dimension 5th Chest"), + #regions["End of the World"].locations.append("End of the World Final Dimension 6th Chest"), + #regions["End of the World"].locations.append("End of the World Final Dimension 10th Chest"), + #regions["End of the World"].locations.append("End of the World Final Dimension 9th Chest"), + #regions["End of the World"].locations.append("End of the World Final Dimension 8th Chest"), + #regions["End of the World"].locations.append("End of the World Final Dimension 7th Chest"), + #regions["End of the World"].locations.append("End of the World Giant Crevasse 3rd Chest"), + #regions["End of the World"].locations.append("End of the World Giant Crevasse 1st Chest"), + #regions["End of the World"].locations.append("End of the World Giant Crevasse 4th Chest"), + #regions["End of the World"].locations.append("End of the World Giant Crevasse 2nd Chest"), + #regions["End of the World"].locations.append("End of the World World Terminus Traverse Town Chest"), + #regions["End of the World"].locations.append("End of the World World Terminus Wonderland 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 Deep Jungle Chest"), + #regions["End of the World"].locations.append("End of the World World Terminus Agrabah Chest"), + #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 Halloween Town 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 100 Acre Wood 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 Final Rest Chest"), regions["Monstro"].locations.append("Monstro Chamber 6 White Trinity Chest"), #regions["Awakening"].locations.append("Awakening Chest"), missable - regions["End of the World"].locations.append("Chronicles Sora's Story") + #regions["End of the World"].locations.append("Chronicles Sora's Story") regions["Wonderland"].locations.append("Chronicles Wonderland") regions["Olympus Coliseum"].locations.append("Chronicles Olympus Coliseum") regions["Deep Jungle"].locations.append("Chronicles Deep Jungle") @@ -268,7 +268,7 @@ def create_regions(multiworld: MultiWorld, player: int): #regions["100 Acre Wood"].locations.append("Chronicles 100 Acre Wood") regions["Atlantica"].locations.append("Chronicles Atlantica") regions["Halloween Town"].locations.append("Chronicles Halloween Town") - regions["Neverland"].locations.append("Chronicles Neverland") + #regions["Neverland"].locations.append("Chronicles Neverland") regions["Agrabah"].locations.append("Ansem's Secret Report 1") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 2") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 9fa9fa18c80a..7bea9943408d 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -93,7 +93,7 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Hippo's Lagoon Center Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Deep Jungle Hippo's Lagoon Left Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + #multiworld.get_location("Deep Jungle Hippo's Lagoon Left Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Deep Jungle Hippo's Lagoon Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Deep Jungle Vines Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Vines 2 Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -125,7 +125,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Agrabah Storage Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Agrabah Storage Behind Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Entrance Left Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -173,8 +173,8 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Red Trinity") multiworld.get_location("Halloween Town Guillotine Square High Tower Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -213,40 +213,40 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Neverland Captain's Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Rising Falls Water's Surface Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Rising Falls Under Water 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or has_item(state, player, "Glide") or has_item(state, player, "Progressive Blizzard") + multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or has_item(state, player, "Glide") or has_item(state, player, "Progressive Blizzard") + multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or has_item(state, player, "Glide") or has_item(state, player, "Progressive Blizzard") multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") - #multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) multiworld.get_location("Hollow Bastion High Tower Above Sliding Gates Chest" , player).access_rule = lambda state: has_emblems(state, player) - #multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: can_glide(state, player) or has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Library 1st Floor Turn the Carousel Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest" , player).access_rule = lambda state: can_glide(state, player) or has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") and has_emblems(state, player) multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") - multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: has_emblems(state, player) and can_glide(state, player) multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) #multiworld.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Base Level Platform Near Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Base Level Near Crystal Switch Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Waterway Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") + multiworld.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") and has_item("High Jump") #multiworld.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Dungeon By Candles Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Dungeon Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Grand Hall Steps Right Side Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Grand Hall Oblivion Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Grand Hall Left of Gate Chest" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Entrance Hall Push the Statue Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Hollow Bastion Entrance Hall Push the Statue Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Rising Falls White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") #multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -315,8 +315,8 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) - multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) and has_item(state, player, "High Jump") - multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) + multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) + multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_emblems(state, player) # Win condition. multiworld.completion_condition[player] = lambda state: state.has_all({"Victory"}, player) \ No newline at end of file From d2b76305fb975fb605a80d4b94842b80b20e133d Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 3 Jan 2024 09:59:07 -0600 Subject: [PATCH 017/284] Whoops --- worlds/kh1/Rules.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 7bea9943408d..ca6c5cafa1c4 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -74,7 +74,7 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Trial Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest" , player).access_rule = lambda state: has_item(state, player, "Hollow Bastion") and has_x_worlds(state, player, 7) + #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest" , player).access_rule = lambda state: has_item(state, player, "Hollow Bastion") and has_x_worlds(state, player, 7) multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") @@ -239,7 +239,7 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Hollow Bastion Base Level Platform Near Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Base Level Near Crystal Switch Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Waterway Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") and has_item("High Jump") + multiworld.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") and has_item(state, player, "High Jump") #multiworld.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Dungeon By Candles Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Dungeon Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -276,7 +276,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) + #multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) multiworld.get_location("Chronicles Wonderland" , player).access_rule = lambda state: has_evidence(state, player) #multiworld.get_location("Chronicles Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Deep Jungle" , player).access_rule = lambda state: has_slides(state, player) From d1670d581af117fcb9a2084b5ec54c48d97e462c Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 3 Jan 2024 10:24:55 -0600 Subject: [PATCH 018/284] Update Rules.py --- worlds/kh1/Rules.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index ca6c5cafa1c4..66f06620134d 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -214,10 +214,10 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Hollow Bastion Rising Falls Water's Surface Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Rising Falls Under Water 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or has_item(state, player, "Glide") or has_item(state, player, "Progressive Blizzard") - multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or has_item(state, player, "Glide") or has_item(state, player, "Progressive Blizzard") - multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or has_item(state, player, "Glide") or has_item(state, player, "Progressive Blizzard") - multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") + multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) or has_item(state, player, "Progressive Blizzard") + multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) or has_item(state, player, "Progressive Blizzard") + multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) or (has_item(state, player, "Progressive Blizzard") and has_emblems(state, player)) + multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: has_emblems(state, player) From 7aebfbc6da44c2cb2d49116f0a4d90618f19fbdb Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 3 Jan 2024 15:27:26 -0600 Subject: [PATCH 019/284] Logic fixes and invalid level up rewards --- worlds/kh1/Items.py | 4 ++-- worlds/kh1/Rules.py | 6 +++--- worlds/kh1/__init__.py | 13 ++++++++++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 40fa08a712d5..256946523f52 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -352,8 +352,8 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Max AP Increase": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Strength Increase": KH1ItemData("Level Up", code = 264_4004, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Defense Increase": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Accessory Slot Increase": KH1ItemData("Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Item Slot Increase": KH1ItemData("Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15, weight = 10), + "Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.useful, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 66f06620134d..43cd13869575 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -68,7 +68,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") - multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: has_item(state, player, "Glide") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: can_glide(state, player) and has_item(state, player, "Progressive Fire") multiworld.get_location("Traverse Town Alleyway Behind Crates Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") @@ -163,7 +163,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") #multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and can_glide(state, player) multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") @@ -175,7 +175,7 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") + multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and can_glide(state, player) multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 80b1dfc86708..6e9ef26a109d 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -57,9 +57,20 @@ def create_items(self): item_pool: List[KH1Item] = [] level_up_locations = list(get_locations_by_category("Levels").keys()) level_up_rewards = list(get_items_by_category("Level Up", []).keys()) + level_up_item_pool = [] i = 0 while i < 100: - self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(random.choice(level_up_rewards))) + if i < 8: + level_up_item_pool.append("Accessory Slot Increase") + elif i < 15: + level_up_item_pool.append("Item Slot Increase") + else: + level_up_item_pool.append(random.choice(level_up_rewards)) + i = i + 1 + random.shuffle(level_up_item_pool) + i = 0 + while i < 100: + self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool[i])) i = i + 1 self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) total_locations = len(self.multiworld.get_unfilled_locations(self.player)) From 5365dd83a31e33fb3403e2e5dee2af6b5800cd8a Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 3 Jan 2024 15:50:32 -0600 Subject: [PATCH 020/284] Adding new logic for Hades Cup --- worlds/kh1/Items.py | 2 +- worlds/kh1/Rules.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 256946523f52..33def323e28e 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -386,7 +386,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Phil Cup": KH1ItemData("Cups", code = 264_9001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Pegasus Cup": KH1ItemData("Cups", code = 264_9002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Hercules Cup": KH1ItemData("Cups", code = 264_9003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Hades Cup": KH1ItemData("Cups", code = 264_9004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Hades Cup": KH1ItemData("Cups", code = 264_9004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), } event_item_table: Dict[str, KH1ItemData] = { diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 43cd13869575..7c96ed71ba3e 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -301,10 +301,10 @@ def set_rules(multiworld: MultiWorld, player: int): #multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Ansem's Secret Report 13" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Entry Pass") - multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") and has_item(state, player, "Entry Pass") - multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_item(state, player, "Entry Pass") - multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Hades Cup") and has_item(state, player, "Entry Pass") + multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") + multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") + multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") # Region rules. multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") From c8e05a86016cea618303e22843b0185b9e5b9f3d Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 3 Jan 2024 16:09:37 -0600 Subject: [PATCH 021/284] Added optional sephiroth win condition --- worlds/kh1/Locations.py | 2 +- worlds/kh1/Options.py | 7 +++++++ worlds/kh1/Regions.py | 5 +++-- worlds/kh1/Rules.py | 5 +++-- worlds/kh1/__init__.py | 9 ++++++--- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index f5c92f3e35f0..237bff7d9477 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -270,7 +270,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Ansem's Secret Report 9": KH1LocationData("Reports", 265_7028), "Ansem's Secret Report 10": KH1LocationData("Reports", 265_7027), #"Ansem's Secret Report 11": KH1LocationData("Reports", 265_7026), - #"Ansem's Secret Report 12": KH1LocationData("Reports", 265_7025), + "Ansem's Secret Report 12": KH1LocationData("Reports", 265_7025), #"Ansem's Secret Report 13": KH1LocationData("Reports", 265_7024), "Level 1": KH1LocationData("Levels", 265_8001), "Level 2": KH1LocationData("Levels", 265_8002), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 1c7367f72364..7e9c9d19dfc8 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -2,5 +2,12 @@ from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionSet +class Sephiroth(Toggle): + """ + Toggle whether the win condition should be changed to defeating Sephiroth. + """ + display_name = "Sephiroth" + kh1_options: Dict[str, type(Option)] = { + "sephiroth": Sephiroth, } diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 16325225df43..8723a4575aa9 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,7 +9,7 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int): +def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool): regions: Dict[str, KH1RegionData] = { "Menu": KH1RegionData(None, ["Awakening", "Levels"]), "Awakening": KH1RegionData([], ["Destiny Islands"]), @@ -281,7 +281,8 @@ def create_regions(multiworld: MultiWorld, player: int): regions["Neverland"].locations.append("Ansem's Secret Report 9") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 10") #regions["Agrabah"].locations.append("Ansem's Secret Report 11") - #regions["Olympus Coliseum"].locations.append("Ansem's Secret Report 12") + if sephiroth: + regions["Olympus Coliseum"].locations.append("Ansem's Secret Report 12") #regions["Hollow Bastion"].locations.append("Ansem's Secret Report 13") regions["Levels"].locations.append("Level 1") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 7c96ed71ba3e..e01d17a7608d 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -47,7 +47,7 @@ def has_item(state: CollectionState, player: int, item) -> bool: def has_at_least(state: CollectionState, player: int, item, x) -> bool: return state.count(item, player) >= x -def set_rules(multiworld: MultiWorld, player: int): +def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool): #Location rules. #Keys #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -298,7 +298,8 @@ def set_rules(multiworld: MultiWorld, player: int): multiworld.get_location("Ansem's Secret Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Ansem's Secret Report 10" , player).access_rule = lambda state: has_emblems(state, player) #multiworld.get_location("Ansem's Secret Report 11" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "") + if sephiroth: + multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") #multiworld.get_location("Ansem's Secret Report 13" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 6e9ef26a109d..6034bdd32551 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -72,7 +72,10 @@ def create_items(self): while i < 100: self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool[i])) i = i + 1 - self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) + if self.get_setting("sephiroth"): + self.multiworld.get_location("Ansem's Secret Report 12", self.player).place_locked_item(self.create_item("Victory")) + else: + self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) total_locations = len(self.multiworld.get_unfilled_locations(self.player)) for name, data in item_table.items(): quantity = data.max_quantity @@ -119,7 +122,7 @@ def create_event(self, name: str) -> KH1Item: return KH1Item(name, data.classification, data.code, self.player) def set_rules(self): - set_rules(self.multiworld, self.player) + set_rules(self.multiworld, self.player, self.get_setting("sephiroth")) def create_regions(self): - create_regions(self.multiworld, self.player) \ No newline at end of file + create_regions(self.multiworld, self.player, self.get_setting("sephiroth")) \ No newline at end of file From 968ed63451122c15d4851880c074a2f61ea2fc7f Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 3 Jan 2024 21:37:21 -0600 Subject: [PATCH 022/284] Update __init__.py --- worlds/kh1/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 6034bdd32551..33668d073885 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -60,9 +60,9 @@ def create_items(self): level_up_item_pool = [] i = 0 while i < 100: - if i < 8: + if i < 6: level_up_item_pool.append("Accessory Slot Increase") - elif i < 15: + elif i < 10: level_up_item_pool.append("Item Slot Increase") else: level_up_item_pool.append(random.choice(level_up_rewards)) From c58890be26129ca18f62a8851f10ae18b6eb8018 Mon Sep 17 00:00:00 2001 From: gaithern Date: Thu, 4 Jan 2024 08:26:46 -0600 Subject: [PATCH 023/284] Logic changes Added Atlantica as an optional world Only require 1 evidence Only require 1 slide --- worlds/kh1/Items.py | 20 ++++++++++---------- worlds/kh1/Options.py | 7 +++++++ worlds/kh1/Regions.py | 27 +++++++++++++++------------ worlds/kh1/Rules.py | 35 +++++++++++++++++++---------------- worlds/kh1/__init__.py | 9 ++++++--- 5 files changed, 57 insertions(+), 41 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 33def323e28e..e0870015c683 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -244,15 +244,15 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Torn Page 4": KH1ItemData("Key", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Slide 1": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -283,7 +283,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Mythril": KH1ItemData("Synthesis", code = 264_1254, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Mermaid Kick": KH1ItemData("Atlantica" , code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2, weight = 10), @@ -373,7 +373,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Deep Jungle": KH1ItemData("Worlds", code = 264_7004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Agrabah": KH1ItemData("Worlds", code = 264_7005, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Halloween Town": KH1ItemData("Worlds", code = 264_7006, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Atlantica": KH1ItemData("Worlds", code = 264_7007, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Atlantica": KH1ItemData("Atlantica", code = 264_7007, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 7e9c9d19dfc8..edb6d5e17808 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -8,6 +8,13 @@ class Sephiroth(Toggle): """ display_name = "Sephiroth" +class Atlantica(Toggle): + """ + Toggle whether Atlantica locations/items should be included. + """ + display_name = "Atlantica" + kh1_options: Dict[str, type(Option)] = { "sephiroth": Sephiroth, + "atlantica": Atlantica, } diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 8723a4575aa9..ad974ad78d35 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,7 +9,7 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool): +def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: bool): regions: Dict[str, KH1RegionData] = { "Menu": KH1RegionData(None, ["Awakening", "Levels"]), "Awakening": KH1RegionData([], ["Destiny Islands"]), @@ -134,15 +134,16 @@ def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool): regions["Monstro"].locations.append("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), regions["Monstro"].locations.append("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), regions["Monstro"].locations.append("Monstro Chamber 6 Low Chest"), - regions["Atlantica"].locations.append("Atlantica Sunken Ship In Flipped Boat Chest"), - regions["Atlantica"].locations.append("Atlantica Sunken Ship Seabed Chest"), - regions["Atlantica"].locations.append("Atlantica Sunken Ship Inside Ship Chest"), - regions["Atlantica"].locations.append("Atlantica Ariel's Grotto High Chest"), - regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Middle Chest"), - regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Low Chest"), - regions["Atlantica"].locations.append("Atlantica Ursula's Lair Use Fire on Urchin Chest"), - regions["Atlantica"].locations.append("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest"), - regions["Atlantica"].locations.append("Atlantica Triton's Palace White Trinity Chest"), + if atlantica: + regions["Atlantica"].locations.append("Atlantica Sunken Ship In Flipped Boat Chest"), + regions["Atlantica"].locations.append("Atlantica Sunken Ship Seabed Chest"), + regions["Atlantica"].locations.append("Atlantica Sunken Ship Inside Ship Chest"), + regions["Atlantica"].locations.append("Atlantica Ariel's Grotto High Chest"), + regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Middle Chest"), + regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Low Chest"), + regions["Atlantica"].locations.append("Atlantica Ursula's Lair Use Fire on Urchin Chest"), + regions["Atlantica"].locations.append("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest"), + regions["Atlantica"].locations.append("Atlantica Triton's Palace White Trinity Chest"), regions["Halloween Town"].locations.append("Halloween Town Moonlight Hill White Trinity Chest"), regions["Halloween Town"].locations.append("Halloween Town Bridge Under Bridge"), regions["Halloween Town"].locations.append("Halloween Town Boneyard Tombstone Puzzle Chest"), @@ -266,13 +267,15 @@ def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool): regions["Agrabah"].locations.append("Chronicles Agrabah") regions["Monstro"].locations.append("Chronicles Monstro") #regions["100 Acre Wood"].locations.append("Chronicles 100 Acre Wood") - regions["Atlantica"].locations.append("Chronicles Atlantica") + if atlantica: + regions["Atlantica"].locations.append("Chronicles Atlantica") regions["Halloween Town"].locations.append("Chronicles Halloween Town") #regions["Neverland"].locations.append("Chronicles Neverland") regions["Agrabah"].locations.append("Ansem's Secret Report 1") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 2") - regions["Atlantica"].locations.append("Ansem's Secret Report 3") + if atlantica: + regions["Atlantica"].locations.append("Ansem's Secret Report 3") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 4") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 5") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 6") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index e01d17a7608d..e38bc2c9af63 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -30,10 +30,10 @@ def has_x_worlds(state: CollectionState, player: int, num_of_worlds) -> bool: return False def has_slides(state: CollectionState, player: int) -> bool: - return state.has("Slide 1", player) and state.has("Slide 2", player) and state.has("Slide 3", player) and state.has("Slide 4", player) and state.has("Slide 5", player) and state.has("Slide 6", player) + return state.has("Slide 1", player) #and state.has("Slide 2", player) and state.has("Slide 3", player) and state.has("Slide 4", player) and state.has("Slide 5", player) and state.has("Slide 6", player) def has_evidence(state: CollectionState, player: int) -> bool: - return state.has("Footprints", player) or state.has("Stench", player) or state.has("Claw Marks", player) or state.has("Antenna", player) + return state.has("Footprints", player) #or state.has("Stench", player) or state.has("Claw Marks", player) or state.has("Antenna", player) def can_glide(state: CollectionState, player: int) -> bool: return state.has("Glide", player) or state.has("Super Glide", player) @@ -47,7 +47,7 @@ def has_item(state: CollectionState, player: int, item) -> bool: def has_at_least(state: CollectionState, player: int, item, x) -> bool: return state.count(item, player) >= x -def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool): +def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: bool): #Location rules. #Keys #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -151,15 +151,16 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool): #multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Ariel's Grotto High Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Ariel's Grotto Middle Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Ariel's Grotto Low Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_item(state, player, "Mermaid Kick") - #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + if atlantica: + #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Ariel's Grotto High Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Ariel's Grotto Middle Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Ariel's Grotto Low Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_item(state, player, "Mermaid Kick") + #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") #multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -283,13 +284,14 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool): #multiworld.get_location("Chronicles Agrabah" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Monstro" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Chronicles 100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") + if atlantica: + multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") + if atlantica: + multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") multiworld.get_location("Ansem's Secret Report 4" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 6" , player).access_rule = lambda state: has_emblems(state, player) @@ -313,7 +315,8 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool): multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: has_item(state, player,"Deep Jungle") multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: has_item(state, player,"Agrabah") multiworld.get_entrance("Monstro" , player).access_rule = lambda state: has_item(state, player,"Monstro") - multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) + if atlantica: + multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 33668d073885..15e040f399f3 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -77,11 +77,14 @@ def create_items(self): else: self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) total_locations = len(self.multiworld.get_unfilled_locations(self.player)) + non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades"] + if self.get_setting("atlantica"): + non_filler_item_categories.append("Atlantica") for name, data in item_table.items(): quantity = data.max_quantity # Ignore filler, it will be added in a later stage. - if data.category not in ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades"]: + if data.category not in non_filler_item_categories: continue item_pool += [self.create_item(name) for _ in range(0, quantity)] @@ -122,7 +125,7 @@ def create_event(self, name: str) -> KH1Item: return KH1Item(name, data.classification, data.code, self.player) def set_rules(self): - set_rules(self.multiworld, self.player, self.get_setting("sephiroth")) + set_rules(self.multiworld, self.player, self.get_setting("sephiroth"), self.get_setting("atlantica")) def create_regions(self): - create_regions(self.multiworld, self.player, self.get_setting("sephiroth")) \ No newline at end of file + create_regions(self.multiworld, self.player, self.get_setting("sephiroth"), self.get_setting("atlantica")) \ No newline at end of file From 8278bc08f9459669e7a86b7d1b2059c8e0f2d12d Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 5 Jan 2024 13:33:55 -0600 Subject: [PATCH 024/284] Update Rules.py --- worlds/kh1/Rules.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index e38bc2c9af63..e531d0c4d0c0 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -79,8 +79,8 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") - multiworld.get_location("Wonderland Lotus Forest Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") - multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") + multiworld.get_location("Wonderland Lotus Forest Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") and has_evidence(state, player) + multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") and has_evidence(state, player) multiworld.get_location("Wonderland Lotus Forest Glide Chest" , player).access_rule = lambda state: can_glide(state, player) #multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") @@ -89,7 +89,7 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) - multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_evidence(state, player) #multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Hippo's Lagoon Center Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -186,10 +186,10 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b multiworld.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: has_at_least(state, player, "Progressive Blizzard", 2) #multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and has_item(state, player, "Green Trinity") + multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: (has_item(state, player, "High Jump") or can_glide(state, player)) and has_item(state, player, "Green Trinity") #multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 2 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) @@ -197,7 +197,7 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b #multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Monstro Chamber 5 Low 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 5 Low 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") From b10840904bdbf942454ae6d5bce334e5e4444b3b Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 5 Jan 2024 13:35:05 -0600 Subject: [PATCH 025/284] Update Rules.py --- worlds/kh1/Rules.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index e531d0c4d0c0..f44fdab3a5bd 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -85,10 +85,10 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b #multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) or has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) or has_evidence(state, player) multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: can_glide(state, player) or has_evidence(state, player) multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_evidence(state, player) #multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: has_item(state, player, "") From ef8ae48fd8e7c7800b8254d5d18f62821f9ca7bb Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 5 Jan 2024 14:13:52 -0600 Subject: [PATCH 026/284] Added Chronicles win condition --- worlds/kh1/Options.py | 7 +++++++ worlds/kh1/__init__.py | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index edb6d5e17808..150ac07e621b 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -14,7 +14,14 @@ class Atlantica(Toggle): """ display_name = "Atlantica" +class Chronicles(Toggle): + """ + Toggle whether the win condition should be placed behind a random chronicle. Better for fast games. + """ + display_name = "Chronicles" + kh1_options: Dict[str, type(Option)] = { "sephiroth": Sephiroth, "atlantica": Atlantica, + "chronicles": Chronicles, } diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 15e040f399f3..b03a355a6280 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -72,8 +72,20 @@ def create_items(self): while i < 100: self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool[i])) i = i + 1 - if self.get_setting("sephiroth"): - self.multiworld.get_location("Ansem's Secret Report 12", self.player).place_locked_item(self.create_item("Victory")) + if self.get_setting("sephiroth") or self.get_setting("chronicles"): + possible_win_locations = [] + if self.get_setting("sephiroth"): + possible_win_locations.append("Ansem's Secret Report 12") + if self.get_setting("chronicles"): + possible_win_locations.append("Chronicles Wonderland") + possible_win_locations.append("Chronicles Olympus Coliseum") + possible_win_locations.append("Chronicles Deep Jungle") + possible_win_locations.append("Chronicles Agrabah") + possible_win_locations.append("Chronicles Monstro") + if self.get_setting("atlantica"): + possible_win_locations.append("Chronicles Atlantica") + possible_win_locations.append("Chronicles Halloween Town") + self.multiworld.get_location(random.choice(possible_win_locations), self.player).place_locked_item(self.create_item("Victory")) else: self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) total_locations = len(self.multiworld.get_unfilled_locations(self.player)) From f05121598517bd3e761a0d46e41b143698cd0574 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 5 Jan 2024 16:43:57 -0600 Subject: [PATCH 027/284] Update Rules.py --- worlds/kh1/Rules.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index f44fdab3a5bd..357a20bce9e5 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -85,10 +85,10 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b #multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) or has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) or has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: can_glide(state, player) or has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_evidence(state, player) #multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -142,8 +142,8 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b #multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Bridge Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") - multiworld.get_location("Agrabah Cave of Wonders Hidden Room Right Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") - multiworld.get_location("Agrabah Cave of Wonders Hidden Room Left Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") + multiworld.get_location("Agrabah Cave of Wonders Hidden Room Right Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") or has_item(state, player, "High Jump") + multiworld.get_location("Agrabah Cave of Wonders Hidden Room Left Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") or has_item(state, player, "High Jump") #multiworld.get_location("Agrabah Aladdin's House Main Street Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Aladdin's House Plaza Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") From 24f015a24c4dc18d018a73bfbd973c5383e59fc6 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 6 Jan 2024 10:32:05 -0600 Subject: [PATCH 028/284] Logic is always fun --- .gitignore | 1 + worlds/kh1/Rules.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 022abe38fe40..abeef96895fe 100644 --- a/.gitignore +++ b/.gitignore @@ -198,3 +198,4 @@ minecraft_versions.json .LSOverride Thumbs.db [Dd]esktop.ini +worlds/tracker.apworld diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 357a20bce9e5..7f594f99e62d 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -85,8 +85,8 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b #multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) or has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) or has_evidence(state, player) multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_evidence(state, player) From 5586a0ad096002c0800bf37c47fc3cedebc6fbfa Mon Sep 17 00:00:00 2001 From: JonasKru Date: Sat, 6 Jan 2024 18:03:48 +0100 Subject: [PATCH 029/284] in dev, item sent message for kh1 --- worlds/kh1/Client.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index f5e215ba046d..5a5b99a5fdfc 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -1,8 +1,10 @@ from __future__ import annotations import os +import json import sys import asyncio import shutil +import logging import ModuleUpdate ModuleUpdate.update() @@ -11,6 +13,8 @@ check_num = 0 +logger = logging.getLogger("Client") + if __name__ == "__main__": Utils.init_logging("KH1Client", exception_logger="Client") @@ -120,6 +124,22 @@ def on_package(self, cmd: str, args: dict): with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() + if cmd in {"PrintJSON"}: + data = args["data"] + if data[0]: + msg = str(data[0]["text"]); + #player send a location + if msg.startswith(self.auth + " sent "): + with open(os.path.join(self.game_communication_path, "sent"), 'w') as f: + f.write(msg.replace(msg.replace(self.auth + " sent ", ""), "\n")) + f.close() + + + + + + + def run_gui(self): """Import kivy UI system and start running it as self.ui_task.""" from kvui import GameManager From e1a497cfbf27ab086a1f29cb745b2ca9057fbaef Mon Sep 17 00:00:00 2001 From: JonasKru Date: Sun, 7 Jan 2024 10:04:30 +0100 Subject: [PATCH 030/284] probably working sending message --- worlds/kh1/Client.py | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 5a5b99a5fdfc..9780b7f24b36 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -12,6 +12,7 @@ import Utils check_num = 0 +sent_counter = 0 logger = logging.getLogger("Client") @@ -90,6 +91,7 @@ def on_package(self, cmd: str, args: dict): filename = f"send{ss}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() + if cmd in {"ReceivedItems"}: start_index = args["index"] if start_index != len(self.items_received): @@ -124,17 +126,41 @@ def on_package(self, cmd: str, args: dict): with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() - if cmd in {"PrintJSON"}: - data = args["data"] - if data[0]: - msg = str(data[0]["text"]); - #player send a location - if msg.startswith(self.auth + " sent "): - with open(os.path.join(self.game_communication_path, "sent"), 'w') as f: - f.write(msg.replace(msg.replace(self.auth + " sent ", ""), "\n")) - f.close() + if cmd in {"PrintJSON"} and args["type"] == "ItemSend": + print("ItemSend") + item = args["item"] + networkItem = NetworkItem(*item) + senderID = networkItem.player + + if senderID == self.slot: + itemName = self.item_names[networkItem.item] + recieverID = args["receiving"] + recieverName = self.player_names[recieverID] + + sent_counter += 1 + filename = f"sent" + str(sent_counter) + with open(os.path.join(self.game_communication_path, filename), 'w') as f: + f.write(itemName + "\n" + recieverName) + f.close() + +#f.write(self.item_names[NetworkItem(*item).item] + "\n" + self.location_names[NetworkItem(*item).location] + "\n" + self.player_names[NetworkItem(*item).player]) + + #last resort we can probably do better + #input: Krujo sent Magic Upgrade to Tim ((TT3) LocationName) + # if cmd in {"PrintJSON"}: + # data = args["data"] + # if data[0]: + # msg = str(data[0]["text"]); + # #player send a location + # # if msg.startswith(self.auth + " sent "): #debug + # with open(os.path.join(self.game_communication_path, "sent"), 'w') as f: + # msg = msg.replace(self.auth + " sent ", "") + # #Magic Upgrade to Tim ((TT3) LocationName) + # splitTo = msg.split(" to ") + # targetPlayer = splitTo[1].split(" ")[0] + # f.close() From a7a47337a80cb6562b19cba2966bd1886646493a Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 7 Jan 2024 08:48:49 -0600 Subject: [PATCH 031/284] Update Rules.py --- worlds/kh1/Rules.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 7f594f99e62d..1927d4bdb06b 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -85,10 +85,10 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b #multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) or has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) or has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: can_glide(state, player) and has_evidence(state, player) + multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: can_glide(state, player) multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_evidence(state, player) #multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: has_item(state, player, "") From de247619da0732755a95489c5bea5234f1e75441 Mon Sep 17 00:00:00 2001 From: JonasKru Date: Sun, 7 Jan 2024 16:58:03 +0100 Subject: [PATCH 032/284] writing down "sent" messages --- worlds/kh1/Client.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 9780b7f24b36..2ad15e7290b6 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -12,7 +12,6 @@ import Utils check_num = 0 -sent_counter = 0 logger = logging.getLogger("Client") @@ -38,6 +37,7 @@ class KH1Context(CommonContext): command_processor: int = KH1ClientCommandProcessor game = "Kingdom Hearts" items_handling = 0b111 # full remote + sent_counter = 0 def __init__(self, server_address, password): super(KH1Context, self).__init__(server_address, password) @@ -134,13 +134,17 @@ def on_package(self, cmd: str, args: dict): if senderID == self.slot: itemName = self.item_names[networkItem.item] + itemCategory = networkItem.flags recieverID = args["receiving"] recieverName = self.player_names[recieverID] - - sent_counter += 1 - filename = f"sent" + str(sent_counter) + filename = "sent" + str(self.sent_counter % 5) + self.sent_counter += 1 with open(os.path.join(self.game_communication_path, filename), 'w') as f: - f.write(itemName + "\n" + recieverName) + f.write( + str(itemName) + "\n" + + str(recieverName) + "\n" + + str(itemCategory) + "\n" + + str(self.sent_counter)) f.close() #f.write(self.item_names[NetworkItem(*item).item] + "\n" + self.location_names[NetworkItem(*item).location] + "\n" + self.player_names[NetworkItem(*item).player]) From 95723a1f24015d643e271df4c7e26706f43e264e Mon Sep 17 00:00:00 2001 From: JonasKru Date: Mon, 8 Jan 2024 14:06:11 +0100 Subject: [PATCH 033/284] fixed id --- worlds/kh1/Client.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 2ad15e7290b6..7f7e75aae6a8 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -127,18 +127,15 @@ def on_package(self, cmd: str, args: dict): f.close() if cmd in {"PrintJSON"} and args["type"] == "ItemSend": - print("ItemSend") item = args["item"] networkItem = NetworkItem(*item) senderID = networkItem.player - if senderID == self.slot: itemName = self.item_names[networkItem.item] itemCategory = networkItem.flags recieverID = args["receiving"] recieverName = self.player_names[recieverID] filename = "sent" + str(self.sent_counter % 5) - self.sent_counter += 1 with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.write( str(itemName) + "\n" @@ -147,6 +144,8 @@ def on_package(self, cmd: str, args: dict): + str(self.sent_counter)) f.close() + self.sent_counter += 1 + #f.write(self.item_names[NetworkItem(*item).item] + "\n" + self.location_names[NetworkItem(*item).location] + "\n" + self.player_names[NetworkItem(*item).player]) From 9985c3325895a710976ea38c91a7535d16326038 Mon Sep 17 00:00:00 2001 From: JonasKru Date: Mon, 8 Jan 2024 15:24:53 +0100 Subject: [PATCH 034/284] happens to the best, i hope --- worlds/kh1/Client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 7f7e75aae6a8..0c6cf3b55ab1 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -129,11 +129,11 @@ def on_package(self, cmd: str, args: dict): if cmd in {"PrintJSON"} and args["type"] == "ItemSend": item = args["item"] networkItem = NetworkItem(*item) + recieverID = args["receiving"] senderID = networkItem.player - if senderID == self.slot: + if recieverID != self.slot: itemName = self.item_names[networkItem.item] itemCategory = networkItem.flags - recieverID = args["receiving"] recieverName = self.player_names[recieverID] filename = "sent" + str(self.sent_counter % 5) with open(os.path.join(self.game_communication_path, filename), 'w') as f: From 2efc9d5fa7354ab55418e451e9bddd1d766efd24 Mon Sep 17 00:00:00 2001 From: JonasKru Date: Mon, 8 Jan 2024 15:31:12 +0100 Subject: [PATCH 035/284] we need both checks... --- worlds/kh1/Client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 0c6cf3b55ab1..ef109398f550 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -131,7 +131,7 @@ def on_package(self, cmd: str, args: dict): networkItem = NetworkItem(*item) recieverID = args["receiving"] senderID = networkItem.player - if recieverID != self.slot: + if recieverID != self.slot and senderID == self.slot: itemName = self.item_names[networkItem.item] itemCategory = networkItem.flags recieverName = self.player_names[recieverID] From acc4d55749429e4eaf9f878e7e61ab0aa72309d2 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 8 Jan 2024 09:06:56 -0600 Subject: [PATCH 036/284] Update Rules.py --- worlds/kh1/Rules.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 1927d4bdb06b..d2df180c938c 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -121,7 +121,7 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b multiworld.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Agrabah Palace Gates Low Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Agrabah Palace Gates High Opposite Palace Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - multiworld.get_location("Agrabah Palace Gates High Close to Palace Chest" , player).access_rule = lambda state: can_glide(state, player) + multiworld.get_location("Agrabah Palace Gates High Close to Palace Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) multiworld.get_location("Agrabah Storage Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Agrabah Storage Behind Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Entrance Left Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -176,7 +176,7 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and can_glide(state, player) + multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and (can_glide(state, player) or has_item(state, player, "High Jump")) multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) From 56c0d6c64263ff7f448819ac1741c58061d73524 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 8 Jan 2024 10:55:39 -0600 Subject: [PATCH 037/284] Update Client.py --- worlds/kh1/Client.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index ef109398f550..b05c9c6d67fb 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -37,7 +37,6 @@ class KH1Context(CommonContext): command_processor: int = KH1ClientCommandProcessor game = "Kingdom Hearts" items_handling = 0b111 # full remote - sent_counter = 0 def __init__(self, server_address, password): super(KH1Context, self).__init__(server_address, password) @@ -131,21 +130,20 @@ def on_package(self, cmd: str, args: dict): networkItem = NetworkItem(*item) recieverID = args["receiving"] senderID = networkItem.player + locationID = networkItem.location if recieverID != self.slot and senderID == self.slot: itemName = self.item_names[networkItem.item] itemCategory = networkItem.flags recieverName = self.player_names[recieverID] - filename = "sent" + str(self.sent_counter % 5) + filename = "sent" with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.write( str(itemName) + "\n" + str(recieverName) + "\n" + str(itemCategory) + "\n" - + str(self.sent_counter)) + + str(locationID)) f.close() - self.sent_counter += 1 - #f.write(self.item_names[NetworkItem(*item).item] + "\n" + self.location_names[NetworkItem(*item).location] + "\n" + self.player_names[NetworkItem(*item).player]) From 99e5e8953515444aef2fdfac943f907942aa5406 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 8 Jan 2024 12:40:22 -0600 Subject: [PATCH 038/284] Update Client.py --- worlds/kh1/Client.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index b05c9c6d67fb..bd9a947d5ee2 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -5,6 +5,7 @@ import asyncio import shutil import logging +import re import ModuleUpdate ModuleUpdate.update() @@ -138,8 +139,8 @@ def on_package(self, cmd: str, args: dict): filename = "sent" with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.write( - str(itemName) + "\n" - + str(recieverName) + "\n" + 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() From f935e0bfe5fd009b3962d8a9745aa15375ad6be4 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 8 Jan 2024 15:27:28 -0600 Subject: [PATCH 039/284] Update Regions.py --- worlds/kh1/Regions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index ad974ad78d35..1b7725a17586 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -261,7 +261,8 @@ def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, atlanti #regions["Awakening"].locations.append("Awakening Chest"), missable #regions["End of the World"].locations.append("Chronicles Sora's Story") - regions["Wonderland"].locations.append("Chronicles Wonderland") + if not sephiroth: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode + regions["Wonderland"].locations.append("Chronicles Wonderland") regions["Olympus Coliseum"].locations.append("Chronicles Olympus Coliseum") regions["Deep Jungle"].locations.append("Chronicles Deep Jungle") regions["Agrabah"].locations.append("Chronicles Agrabah") From d55285fc209f9820c87990e90cdaaac339135af9 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 8 Jan 2024 15:30:16 -0600 Subject: [PATCH 040/284] Unreachable location post HB, plus formatting. --- worlds/kh1/Rules.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index d2df180c938c..f4432951e5b7 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -152,15 +152,15 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: has_item(state, player, "") if atlantica: - #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Ariel's Grotto High Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Ariel's Grotto Middle Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Ariel's Grotto Low Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_item(state, player, "Mermaid Kick") - #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Ariel's Grotto High Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Ariel's Grotto Middle Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Ariel's Grotto Low Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_item(state, player, "Mermaid Kick") + #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") #multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -278,20 +278,21 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) - multiworld.get_location("Chronicles Wonderland" , player).access_rule = lambda state: has_evidence(state, player) + if not sephiroth: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode + multiworld.get_location("Chronicles Wonderland" , player).access_rule = lambda state: has_evidence(state, player) #multiworld.get_location("Chronicles Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Deep Jungle" , player).access_rule = lambda state: has_slides(state, player) #multiworld.get_location("Chronicles Agrabah" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Monstro" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Chronicles 100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "") if atlantica: - multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") + multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) if atlantica: - multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") + multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") multiworld.get_location("Ansem's Secret Report 4" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 6" , player).access_rule = lambda state: has_emblems(state, player) @@ -301,7 +302,7 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b multiworld.get_location("Ansem's Secret Report 10" , player).access_rule = lambda state: has_emblems(state, player) #multiworld.get_location("Ansem's Secret Report 11" , player).access_rule = lambda state: has_item(state, player, "") if sephiroth: - multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") #multiworld.get_location("Ansem's Secret Report 13" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") @@ -316,7 +317,7 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: has_item(state, player,"Agrabah") multiworld.get_entrance("Monstro" , player).access_rule = lambda state: has_item(state, player,"Monstro") if atlantica: - multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) + multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) From f6dc82f5002fcdb27bd52d94ff398e9ffcb21cd4 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 8 Jan 2024 22:48:02 -0600 Subject: [PATCH 041/284] Update Client.py --- worlds/kh1/Client.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index bd9a947d5ee2..ff94ba12f048 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -29,9 +29,10 @@ def check_stdin() -> None: print("WARNING: Console input is not routed reliably on Windows, use the GUI instead.") class KH1ClientCommandProcessor(ClientCommandProcessor): - def _cmd_test(self): - """Test""" - self.output(f"Test") + pass + #def _cmd_test(self): + # """Test""" + # self.output(f"Test") class KH1Context(CommonContext): From 5620658a2a597fb60ca641aed50e4470ebefc3b0 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 9 Jan 2024 16:10:05 -0600 Subject: [PATCH 042/284] Update Client.py --- worlds/kh1/Client.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index ff94ba12f048..c45e11eea19d 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -6,13 +6,14 @@ import shutil import logging import re +import time +from calendar import timegm import ModuleUpdate ModuleUpdate.update() import Utils - -check_num = 0 +death_link = False logger = logging.getLogger("Client") @@ -29,11 +30,15 @@ def check_stdin() -> None: print("WARNING: Console input is not routed reliably on Windows, use the GUI instead.") class KH1ClientCommandProcessor(ClientCommandProcessor): - pass - #def _cmd_test(self): - # """Test""" - # self.output(f"Test") - + 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") class KH1Context(CommonContext): command_processor: int = KH1ClientCommandProcessor @@ -146,6 +151,11 @@ def on_package(self, cmd: str, args: dict): + str(locationID)) f.close() + def on_deathlink(self, data: typing.Dict[str, typing.Any]): + with open(os.path.join(self.game_communication_path, 'dlreceive'), 'w') as f: + f.write(str(int(data["time"]))) + f.close() + #f.write(self.item_names[NetworkItem(*item).item] + "\n" + self.location_names[NetworkItem(*item).location] + "\n" + self.player_names[NetworkItem(*item).player]) @@ -186,6 +196,11 @@ class KH1Manager(GameManager): async def game_watcher(ctx: KH1Context): from worlds.kh1.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: sync_msg = [{'cmd': 'Sync'}] if ctx.locations_checked: @@ -202,6 +217,11 @@ async def game_watcher(ctx: KH1Context): sending = sending+[(int(st))] if file.find("victory") > -1: victory = True + if file.find("dlsend") > -1 and "DeathLink" in ctx.tags: + st = file.split("dlsend", -1)[1] + 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!") ctx.locations_checked = sending message = [{"cmd": 'LocationChecks', "locations": sending}] await ctx.send_msgs(message) From 7809bf8c6319b5ad09278bf3e90718206bc099dd Mon Sep 17 00:00:00 2001 From: JonasKru Date: Wed, 10 Jan 2024 20:50:13 +0100 Subject: [PATCH 043/284] refactor --- worlds/kh1/Client.py | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index ff94ba12f048..a65b7b748344 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -138,37 +138,17 @@ def on_package(self, cmd: str, args: dict): itemCategory = networkItem.flags recieverName = self.player_names[recieverID] filename = "sent" + sanitizedItemName = re.sub('[^A-Za-z0-9 ]+', '',str(itemName))[:15]; + sanitizedRecieverName = re.sub('[^A-Za-z0-9 ]+', '',str(recieverName))[:6] + 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" + sanitizedItemName + "\n" + + sanitizedRecieverName + "\n" + str(itemCategory) + "\n" + str(locationID)) f.close() -#f.write(self.item_names[NetworkItem(*item).item] + "\n" + self.location_names[NetworkItem(*item).location] + "\n" + self.player_names[NetworkItem(*item).player]) - - - - #last resort we can probably do better - #input: Krujo sent Magic Upgrade to Tim ((TT3) LocationName) - # if cmd in {"PrintJSON"}: - # data = args["data"] - # if data[0]: - # msg = str(data[0]["text"]); - # #player send a location - # # if msg.startswith(self.auth + " sent "): #debug - # with open(os.path.join(self.game_communication_path, "sent"), 'w') as f: - # msg = msg.replace(self.auth + " sent ", "") - # #Magic Upgrade to Tim ((TT3) LocationName) - # splitTo = msg.split(" to ") - # targetPlayer = splitTo[1].split(" ")[0] - # f.close() - - - - - def run_gui(self): """Import kivy UI system and start running it as self.ui_task.""" from kvui import GameManager From c500420a19808a9c71da0d8ae31e54c9df09d121 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 10 Jan 2024 16:36:44 -0600 Subject: [PATCH 044/284] Added level up customization --- worlds/kh1/Options.py | 77 +++++++++++++++++++++++++++--- worlds/kh1/Regions.py | 105 ++--------------------------------------- worlds/kh1/__init__.py | 66 +++++++++++++++----------- 3 files changed, 112 insertions(+), 136 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 150ac07e621b..e4fb3276fe27 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -1,6 +1,62 @@ -from typing import Dict +from dataclasses import dataclass -from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionSet +from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionSet, PerGameCommonOptions + +class StrengthIncrease(Range): + """ + Number of Strength Increases to Add to the Level Up Rewards + """ + range_start = 0 + range_end = 100 + default = 24 + +class DefenseIncrease(Range): + """ + Number of Defense Increases to Add to the Level Up Rewards + """ + range_start = 0 + range_end = 100 + default = 24 + +class HPIncrease(Range): + """ + Number of HP Increases to Add to the Level Up Rewards + """ + range_start = 0 + range_end = 100 + default = 23 + +class APIncrease(Range): + """ + Number of AP Increases to Add to the Level Up Rewards + """ + range_start = 0 + range_end = 100 + default = 18 + +class MPIncrease(Range): + """ + Number of MP Increases to Add to the Level Up Rewards + """ + range_start = 0 + range_end = 20 + default = 7 + +class AccessorySlotIncrease(Range): + """ + Number of Accessory Slot Increases to Add to the Level Up Rewards + """ + range_start = 0 + range_end = 6 + default = 1 + +class ItemSlotIncrease(Range): + """ + Number of Accessory Slot Increases to Add to the Level Up Rewards + """ + range_start = 0 + range_end = 5 + default = 3 class Sephiroth(Toggle): """ @@ -20,8 +76,15 @@ class Chronicles(Toggle): """ display_name = "Chronicles" -kh1_options: Dict[str, type(Option)] = { - "sephiroth": Sephiroth, - "atlantica": Atlantica, - "chronicles": Chronicles, -} +@dataclass +class KH1Options(PerGameCommonOptions): + sephiroth: Sephiroth + atlantica: Atlantica + chronicles: Chronicles + strength_increase: StrengthIncrease + defense_increase: DefenseIncrease + hp_increase: HPIncrease + ap_increase: APIncrease + mp_increase: MPIncrease + accessory_slot_increase: AccessorySlotIncrease + item_slot_increase: ItemSlotIncrease diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 1b7725a17586..602007d25846 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,7 +9,7 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: bool): +def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: bool, levels: int): regions: Dict[str, KH1RegionData] = { "Menu": KH1RegionData(None, ["Awakening", "Levels"]), "Awakening": KH1RegionData([], ["Destiny Islands"]), @@ -289,106 +289,9 @@ def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, atlanti regions["Olympus Coliseum"].locations.append("Ansem's Secret Report 12") #regions["Hollow Bastion"].locations.append("Ansem's Secret Report 13") - regions["Levels"].locations.append("Level 1") - regions["Levels"].locations.append("Level 2") - regions["Levels"].locations.append("Level 3") - regions["Levels"].locations.append("Level 4") - regions["Levels"].locations.append("Level 5") - regions["Levels"].locations.append("Level 6") - regions["Levels"].locations.append("Level 7") - regions["Levels"].locations.append("Level 8") - regions["Levels"].locations.append("Level 9") - regions["Levels"].locations.append("Level 10") - regions["Levels"].locations.append("Level 11") - regions["Levels"].locations.append("Level 12") - regions["Levels"].locations.append("Level 13") - regions["Levels"].locations.append("Level 14") - regions["Levels"].locations.append("Level 15") - regions["Levels"].locations.append("Level 16") - regions["Levels"].locations.append("Level 17") - regions["Levels"].locations.append("Level 18") - regions["Levels"].locations.append("Level 19") - regions["Levels"].locations.append("Level 20") - regions["Levels"].locations.append("Level 21") - regions["Levels"].locations.append("Level 22") - regions["Levels"].locations.append("Level 23") - regions["Levels"].locations.append("Level 24") - regions["Levels"].locations.append("Level 25") - regions["Levels"].locations.append("Level 26") - regions["Levels"].locations.append("Level 27") - regions["Levels"].locations.append("Level 28") - regions["Levels"].locations.append("Level 29") - regions["Levels"].locations.append("Level 30") - regions["Levels"].locations.append("Level 31") - regions["Levels"].locations.append("Level 32") - regions["Levels"].locations.append("Level 33") - regions["Levels"].locations.append("Level 34") - regions["Levels"].locations.append("Level 35") - regions["Levels"].locations.append("Level 36") - regions["Levels"].locations.append("Level 37") - regions["Levels"].locations.append("Level 38") - regions["Levels"].locations.append("Level 39") - regions["Levels"].locations.append("Level 40") - regions["Levels"].locations.append("Level 41") - regions["Levels"].locations.append("Level 42") - regions["Levels"].locations.append("Level 43") - regions["Levels"].locations.append("Level 44") - regions["Levels"].locations.append("Level 45") - regions["Levels"].locations.append("Level 46") - regions["Levels"].locations.append("Level 47") - regions["Levels"].locations.append("Level 48") - regions["Levels"].locations.append("Level 49") - regions["Levels"].locations.append("Level 50") - regions["Levels"].locations.append("Level 51") - regions["Levels"].locations.append("Level 52") - regions["Levels"].locations.append("Level 53") - regions["Levels"].locations.append("Level 54") - regions["Levels"].locations.append("Level 55") - regions["Levels"].locations.append("Level 56") - regions["Levels"].locations.append("Level 57") - regions["Levels"].locations.append("Level 58") - regions["Levels"].locations.append("Level 59") - regions["Levels"].locations.append("Level 60") - regions["Levels"].locations.append("Level 61") - regions["Levels"].locations.append("Level 62") - regions["Levels"].locations.append("Level 63") - regions["Levels"].locations.append("Level 64") - regions["Levels"].locations.append("Level 65") - regions["Levels"].locations.append("Level 66") - regions["Levels"].locations.append("Level 67") - regions["Levels"].locations.append("Level 68") - regions["Levels"].locations.append("Level 69") - regions["Levels"].locations.append("Level 70") - regions["Levels"].locations.append("Level 71") - regions["Levels"].locations.append("Level 72") - regions["Levels"].locations.append("Level 73") - regions["Levels"].locations.append("Level 74") - regions["Levels"].locations.append("Level 75") - regions["Levels"].locations.append("Level 76") - regions["Levels"].locations.append("Level 77") - regions["Levels"].locations.append("Level 78") - regions["Levels"].locations.append("Level 79") - regions["Levels"].locations.append("Level 80") - regions["Levels"].locations.append("Level 81") - regions["Levels"].locations.append("Level 82") - regions["Levels"].locations.append("Level 83") - regions["Levels"].locations.append("Level 84") - regions["Levels"].locations.append("Level 85") - regions["Levels"].locations.append("Level 86") - regions["Levels"].locations.append("Level 87") - regions["Levels"].locations.append("Level 88") - regions["Levels"].locations.append("Level 89") - regions["Levels"].locations.append("Level 90") - regions["Levels"].locations.append("Level 91") - regions["Levels"].locations.append("Level 92") - regions["Levels"].locations.append("Level 93") - regions["Levels"].locations.append("Level 94") - regions["Levels"].locations.append("Level 95") - regions["Levels"].locations.append("Level 96") - regions["Levels"].locations.append("Level 97") - regions["Levels"].locations.append("Level 98") - regions["Levels"].locations.append("Level 99") - regions["Levels"].locations.append("Level 100") + for i in range(levels): + regions["Levels"].locations.append("Level " + str(i+1)) + regions["Olympus Coliseum"].locations.append("Complete Phil Cup") regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup") diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index b03a355a6280..84012313bfa7 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -4,7 +4,7 @@ from worlds.AutoWorld import WebWorld, World from .Items import KH1Item, KH1ItemData, event_item_table, get_items_by_category, item_table from .Locations import KH1Location, location_table, get_locations_by_category -from .Options import kh1_options +from .Options import KH1Options from .Regions import create_regions from .Rules import set_rules from worlds.LauncherComponents import Component, components, Type, launch_subprocess @@ -37,7 +37,8 @@ class KH1World(World): through many worlds to find Riku and Kairi. """ game = "Kingdom Hearts" - option_definitions = kh1_options + options_dataclass = KH1Options + options: KH1Options topology_present = True data_version = 4 required_client_version = (0, 3, 5) @@ -46,43 +47,50 @@ class KH1World(World): item_name_to_id = {name: data.code for name, data in item_table.items()} location_name_to_id = {name: data.code for name, data in location_table.items()} - # TODO: Replace calls to this function with "options-dict", once that PR is completed and merged. - def get_setting(self, name: str): - return getattr(self.multiworld, name)[self.player] - - def fill_slot_data(self) -> dict: - return {option_name: self.get_setting(option_name).value for option_name in kh1_options} - def create_items(self): item_pool: List[KH1Item] = [] - level_up_locations = list(get_locations_by_category("Levels").keys()) - level_up_rewards = list(get_items_by_category("Level Up", []).keys()) + possible_level_up_item_pool = [] level_up_item_pool = [] - i = 0 - while i < 100: - if i < 6: - level_up_item_pool.append("Accessory Slot Increase") - elif i < 10: - level_up_item_pool.append("Item Slot Increase") - else: - level_up_item_pool.append(random.choice(level_up_rewards)) - i = i + 1 + + #Fill pool with mandatory items + for i in range(self.options.item_slot_increase): + level_up_item_pool.append("Item Slot Increase") + for i in range(self.options.accessory_slot_increase): + level_up_item_pool.append("Accessory Slot Increase") + + #Create other pool + for i in range(self.options.strength_increase): + possible_level_up_item_pool.append("Strength Increase") + for i in range(self.options.defense_increase): + possible_level_up_item_pool.append("Defense Increase") + for i in range(self.options.hp_increase): + possible_level_up_item_pool.append("Max HP Increase") + for i in range(self.options.mp_increase): + possible_level_up_item_pool.append("Max MP Increase") + for i in range(self.options.ap_increase): + possible_level_up_item_pool.append("Max AP Increase") + + #Fill remaining pool with items from other pool + while len(level_up_item_pool) < 100 and len(possible_level_up_item_pool) > 0: + level_up_item_pool.append(possible_level_up_item_pool.pop(random.randrange(len(possible_level_up_item_pool)))) + + level_up_locations = list(get_locations_by_category("Levels").keys()) random.shuffle(level_up_item_pool) i = 0 - while i < 100: + while i < len(level_up_item_pool): self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool[i])) i = i + 1 - if self.get_setting("sephiroth") or self.get_setting("chronicles"): + if self.options.sephiroth or self.options.chronicles: possible_win_locations = [] - if self.get_setting("sephiroth"): + if self.options.sephiroth: possible_win_locations.append("Ansem's Secret Report 12") - if self.get_setting("chronicles"): + if self.options.chronicles: possible_win_locations.append("Chronicles Wonderland") possible_win_locations.append("Chronicles Olympus Coliseum") possible_win_locations.append("Chronicles Deep Jungle") possible_win_locations.append("Chronicles Agrabah") possible_win_locations.append("Chronicles Monstro") - if self.get_setting("atlantica"): + if self.options.atlantica: possible_win_locations.append("Chronicles Atlantica") possible_win_locations.append("Chronicles Halloween Town") self.multiworld.get_location(random.choice(possible_win_locations), self.player).place_locked_item(self.create_item("Victory")) @@ -90,7 +98,7 @@ def create_items(self): self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) total_locations = len(self.multiworld.get_unfilled_locations(self.player)) non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades"] - if self.get_setting("atlantica"): + if self.options.atlantica: non_filler_item_categories.append("Atlantica") for name, data in item_table.items(): quantity = data.max_quantity @@ -137,7 +145,9 @@ def create_event(self, name: str) -> KH1Item: return KH1Item(name, data.classification, data.code, self.player) def set_rules(self): - set_rules(self.multiworld, self.player, self.get_setting("sephiroth"), self.get_setting("atlantica")) + set_rules(self.multiworld, self.player, self.options.sephiroth, self.options.atlantica) def create_regions(self): - create_regions(self.multiworld, self.player, self.get_setting("sephiroth"), self.get_setting("atlantica")) \ No newline at end of file + create_regions(self.multiworld, self.player, self.options.sephiroth, self.options.atlantica\ + , min((self.options.strength_increase + self.options.defense_increase + self.options.hp_increase + self.options.mp_increase\ + + self.options.ap_increase + self.options.accessory_slot_increase + self.options.item_slot_increase), 100)) \ No newline at end of file From cf2863075b846a58a062f038be22808e5c9c95a8 Mon Sep 17 00:00:00 2001 From: JonasKru Date: Thu, 11 Jan 2024 14:27:57 +0100 Subject: [PATCH 045/284] universal message --- worlds/kh1/Client.py | 24 ++++++++++- worlds/kh1/MessageHandler.py | 79 ++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 worlds/kh1/MessageHandler.py diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index a65b7b748344..da30b8dde808 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -6,6 +6,7 @@ import shutil import logging import re +from .MessageHandler import KH1_message_type, KH1_UniversalMessage, KH1_MessageHandler import ModuleUpdate ModuleUpdate.update() @@ -16,6 +17,8 @@ logger = logging.getLogger("Client") + + if __name__ == "__main__": Utils.init_logging("KH1Client", exception_logger="Client") @@ -34,7 +37,6 @@ class KH1ClientCommandProcessor(ClientCommandProcessor): # """Test""" # self.output(f"Test") - class KH1Context(CommonContext): command_processor: int = KH1ClientCommandProcessor game = "Kingdom Hearts" @@ -45,6 +47,7 @@ def __init__(self, server_address, password): self.send_index: int = 0 self.syncing = False self.awaiting_bridge = False + # 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") @@ -57,6 +60,19 @@ def __init__(self, server_address, password): if file.find("obtain") <= -1: os.remove(root+"/"+file) + self.message_handler = KH1_MessageHandler(2, self.game_communication_path) + # + # self.message_handler.receive_message(KH1_message_type.test, [ + # "I'm a test message", + # "with multiple values", + # "isn't that cool?" + # ]); + # + # self.message_handler.receive_message(KH1_message_type.test, [ + # "Thats a second test message", + # "with only two values", + # ]); + async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: await super(KH1Context, self).server_auth(password_requested) @@ -78,6 +94,7 @@ def endpoints(self): return [] async def shutdown(self): + self.message_handler.stop_sending(); await super(KH1Context, self).shutdown() for root, dirs, files in os.walk(self.game_communication_path): for file in files: @@ -92,6 +109,11 @@ def on_package(self, cmd: str, args: dict): filename = f"send{ss}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() + self.message_handler.receive_message(KH1_message_type.test, [ + "Connected to the Multiworld!" + ]); + + if cmd in {"ReceivedItems"}: start_index = args["index"] diff --git a/worlds/kh1/MessageHandler.py b/worlds/kh1/MessageHandler.py new file mode 100644 index 000000000000..b2746da09fdc --- /dev/null +++ b/worlds/kh1/MessageHandler.py @@ -0,0 +1,79 @@ +from enum import IntEnum +from datetime import datetime +import threading +import time +import os +import json +import sys +import asyncio +import shutil +import logging +import re + +#type of message that should be sent to the game +class KH1_message_type(IntEnum): + invalid = -1 + test = 0 + recieved_trap = 1 + sent_item = 2 + deathlink = 3 + player_joined = 4 + player_left = 5 + + +#non-persistent message that is sent to the game +class KH1_UniversalMessage(): + def __init__(self, type : KH1_message_type , values : list[str]): + self.type: KH1_message_type = type + self.values: list[str] = values + + def as_message(self): + as_string = str(self.type.value) + "\n" + for value in self.values: + as_string += value + "\n" + return as_string + +class KH1_MessageHandler(): + def __init__(self, intervalSeconds: int, directory: str): + self.interval = intervalSeconds + self.directory = directory + self.message_cache : list[KH1_UniversalMessage] = [] + self.timer = threading.Timer(self.interval, self.send_messages) + self.timer.start() + + def receive_message(self, type: KH1_message_type, values: list[str]): + new_message = KH1_UniversalMessage(type, values) + self.message_cache.append(new_message) + + def send_messages(self): + valid_messages = [] + for message in self.message_cache: + if message.type != KH1_message_type.invalid: + valid_messages.append(message) + + if len(valid_messages) > 0: + print("Sending messages to KH1") + current_time = datetime.now().strftime("%Y%m%d%H%M%S") + all_messages: str = "" + all_messages += current_time + "\n" + + for message in valid_messages: + all_messages += message.as_message() + all_messages += "-\n" + + with open(os.path.join(self.directory, "messages.sem"), 'w') as f: + f.write(all_messages) + f.close() + + os.rename( + os.path.join(self.directory, "messages.sem"), + os.path.join(self.directory, "messages") + ) + + self.message_cache.clear() + self.timer = threading.Timer(self.interval, self.send_messages) + self.timer.start() + + + def stop_sending(self): + self.timer.cancel() From 1640f5580adc751a9be51deb27c4d5f594e41785 Mon Sep 17 00:00:00 2001 From: gaithern Date: Thu, 11 Jan 2024 10:24:36 -0600 Subject: [PATCH 046/284] Update Items.py --- worlds/kh1/Items.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index e0870015c683..2210bed7ea3b 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -345,7 +345,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "EXP Zero": KH1ItemData("EXP Zero", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Max MP Increase": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15, weight = 10), From fab891d072ffaa8a9f3fd66f58d63c7f89c299f7 Mon Sep 17 00:00:00 2001 From: gaithern Date: Thu, 11 Jan 2024 12:51:17 -0600 Subject: [PATCH 047/284] Setting additions and fixes Added leading 0's to level locations to make the alphabetical Fixed chronicles logic, changed name to world_complete Added Unknown win condition --- worlds/kh1/Locations.py | 200 ++++++++++++++++++++-------------------- worlds/kh1/Options.py | 22 +++-- worlds/kh1/Regions.py | 9 +- worlds/kh1/Rules.py | 7 +- worlds/kh1/__init__.py | 17 ++-- 5 files changed, 134 insertions(+), 121 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 237bff7d9477..92bc46924136 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -271,106 +271,106 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Ansem's Secret Report 10": KH1LocationData("Reports", 265_7027), #"Ansem's Secret Report 11": KH1LocationData("Reports", 265_7026), "Ansem's Secret Report 12": KH1LocationData("Reports", 265_7025), - #"Ansem's Secret Report 13": KH1LocationData("Reports", 265_7024), - "Level 1": KH1LocationData("Levels", 265_8001), - "Level 2": KH1LocationData("Levels", 265_8002), - "Level 3": KH1LocationData("Levels", 265_8003), - "Level 4": KH1LocationData("Levels", 265_8004), - "Level 5": KH1LocationData("Levels", 265_8005), - "Level 6": KH1LocationData("Levels", 265_8006), - "Level 7": KH1LocationData("Levels", 265_8007), - "Level 8": KH1LocationData("Levels", 265_8008), - "Level 9": KH1LocationData("Levels", 265_8009), - "Level 10": KH1LocationData("Levels", 265_8010), - "Level 11": KH1LocationData("Levels", 265_8011), - "Level 12": KH1LocationData("Levels", 265_8012), - "Level 13": KH1LocationData("Levels", 265_8013), - "Level 14": KH1LocationData("Levels", 265_8014), - "Level 15": KH1LocationData("Levels", 265_8015), - "Level 16": KH1LocationData("Levels", 265_8016), - "Level 17": KH1LocationData("Levels", 265_8017), - "Level 18": KH1LocationData("Levels", 265_8018), - "Level 19": KH1LocationData("Levels", 265_8019), - "Level 20": KH1LocationData("Levels", 265_8020), - "Level 21": KH1LocationData("Levels", 265_8021), - "Level 22": KH1LocationData("Levels", 265_8022), - "Level 23": KH1LocationData("Levels", 265_8023), - "Level 24": KH1LocationData("Levels", 265_8024), - "Level 25": KH1LocationData("Levels", 265_8025), - "Level 26": KH1LocationData("Levels", 265_8026), - "Level 27": KH1LocationData("Levels", 265_8027), - "Level 28": KH1LocationData("Levels", 265_8028), - "Level 29": KH1LocationData("Levels", 265_8029), - "Level 30": KH1LocationData("Levels", 265_8030), - "Level 31": KH1LocationData("Levels", 265_8031), - "Level 32": KH1LocationData("Levels", 265_8032), - "Level 33": KH1LocationData("Levels", 265_8033), - "Level 34": KH1LocationData("Levels", 265_8034), - "Level 35": KH1LocationData("Levels", 265_8035), - "Level 36": KH1LocationData("Levels", 265_8036), - "Level 37": KH1LocationData("Levels", 265_8037), - "Level 38": KH1LocationData("Levels", 265_8038), - "Level 39": KH1LocationData("Levels", 265_8039), - "Level 40": KH1LocationData("Levels", 265_8040), - "Level 41": KH1LocationData("Levels", 265_8041), - "Level 42": KH1LocationData("Levels", 265_8042), - "Level 43": KH1LocationData("Levels", 265_8043), - "Level 44": KH1LocationData("Levels", 265_8044), - "Level 45": KH1LocationData("Levels", 265_8045), - "Level 46": KH1LocationData("Levels", 265_8046), - "Level 47": KH1LocationData("Levels", 265_8047), - "Level 48": KH1LocationData("Levels", 265_8048), - "Level 49": KH1LocationData("Levels", 265_8049), - "Level 50": KH1LocationData("Levels", 265_8050), - "Level 51": KH1LocationData("Levels", 265_8051), - "Level 52": KH1LocationData("Levels", 265_8052), - "Level 53": KH1LocationData("Levels", 265_8053), - "Level 54": KH1LocationData("Levels", 265_8054), - "Level 55": KH1LocationData("Levels", 265_8055), - "Level 56": KH1LocationData("Levels", 265_8056), - "Level 57": KH1LocationData("Levels", 265_8057), - "Level 58": KH1LocationData("Levels", 265_8058), - "Level 59": KH1LocationData("Levels", 265_8059), - "Level 60": KH1LocationData("Levels", 265_8060), - "Level 61": KH1LocationData("Levels", 265_8061), - "Level 62": KH1LocationData("Levels", 265_8062), - "Level 63": KH1LocationData("Levels", 265_8063), - "Level 64": KH1LocationData("Levels", 265_8064), - "Level 65": KH1LocationData("Levels", 265_8065), - "Level 66": KH1LocationData("Levels", 265_8066), - "Level 67": KH1LocationData("Levels", 265_8067), - "Level 68": KH1LocationData("Levels", 265_8068), - "Level 69": KH1LocationData("Levels", 265_8069), - "Level 70": KH1LocationData("Levels", 265_8070), - "Level 71": KH1LocationData("Levels", 265_8071), - "Level 72": KH1LocationData("Levels", 265_8072), - "Level 73": KH1LocationData("Levels", 265_8073), - "Level 74": KH1LocationData("Levels", 265_8074), - "Level 75": KH1LocationData("Levels", 265_8075), - "Level 76": KH1LocationData("Levels", 265_8076), - "Level 77": KH1LocationData("Levels", 265_8077), - "Level 78": KH1LocationData("Levels", 265_8078), - "Level 79": KH1LocationData("Levels", 265_8079), - "Level 80": KH1LocationData("Levels", 265_8080), - "Level 81": KH1LocationData("Levels", 265_8081), - "Level 82": KH1LocationData("Levels", 265_8082), - "Level 83": KH1LocationData("Levels", 265_8083), - "Level 84": KH1LocationData("Levels", 265_8084), - "Level 85": KH1LocationData("Levels", 265_8085), - "Level 86": KH1LocationData("Levels", 265_8086), - "Level 87": KH1LocationData("Levels", 265_8087), - "Level 88": KH1LocationData("Levels", 265_8088), - "Level 89": KH1LocationData("Levels", 265_8089), - "Level 90": KH1LocationData("Levels", 265_8090), - "Level 91": KH1LocationData("Levels", 265_8091), - "Level 92": KH1LocationData("Levels", 265_8092), - "Level 93": KH1LocationData("Levels", 265_8093), - "Level 94": KH1LocationData("Levels", 265_8094), - "Level 95": KH1LocationData("Levels", 265_8095), - "Level 96": KH1LocationData("Levels", 265_8096), - "Level 97": KH1LocationData("Levels", 265_8097), - "Level 98": KH1LocationData("Levels", 265_8098), - "Level 99": KH1LocationData("Levels", 265_8099), + "Ansem's Secret Report 13": KH1LocationData("Reports", 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("Cups", 265_9001), "Complete Pegasus Cup": KH1LocationData("Cups", 265_9002), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index e4fb3276fe27..4174311373cc 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -64,23 +64,31 @@ class Sephiroth(Toggle): """ display_name = "Sephiroth" -class Atlantica(Toggle): +class WorldComplete(Toggle): """ - Toggle whether Atlantica locations/items should be included. + Toggle whether the win condition should be placed behind a random world completion. + This could be that works Chronicles or Secret Report location. Better for fast games. """ - display_name = "Atlantica" + display_name = "World Complete" -class Chronicles(Toggle): +class Unknown(Toggle): """ - Toggle whether the win condition should be placed behind a random chronicle. Better for fast games. + Toggle whether the win condition should be changed to defeating Unknown. """ - display_name = "Chronicles" + display_name = "Unknown" + +class Atlantica(Toggle): + """ + Toggle whether Atlantica locations/items should be included. + """ + display_name = "Atlantica" @dataclass class KH1Options(PerGameCommonOptions): sephiroth: Sephiroth + world_complete: WorldComplete + unknown: Unknown atlantica: Atlantica - chronicles: Chronicles strength_increase: StrengthIncrease defense_increase: DefenseIncrease hp_increase: HPIncrease diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 602007d25846..0bcec32f03db 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,7 +9,7 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: bool, levels: int): +def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, world_complete: bool, unknown:bool, atlantica: bool, levels: int): regions: Dict[str, KH1RegionData] = { "Menu": KH1RegionData(None, ["Awakening", "Levels"]), "Awakening": KH1RegionData([], ["Destiny Islands"]), @@ -261,7 +261,7 @@ def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, atlanti #regions["Awakening"].locations.append("Awakening Chest"), missable #regions["End of the World"].locations.append("Chronicles Sora's Story") - if not sephiroth: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode + if not sephiroth and not world_complete: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode regions["Wonderland"].locations.append("Chronicles Wonderland") regions["Olympus Coliseum"].locations.append("Chronicles Olympus Coliseum") regions["Deep Jungle"].locations.append("Chronicles Deep Jungle") @@ -287,10 +287,11 @@ def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, atlanti #regions["Agrabah"].locations.append("Ansem's Secret Report 11") if sephiroth: regions["Olympus Coliseum"].locations.append("Ansem's Secret Report 12") - #regions["Hollow Bastion"].locations.append("Ansem's Secret Report 13") + if unknown: + regions["Hollow Bastion"].locations.append("Ansem's Secret Report 13") for i in range(levels): - regions["Levels"].locations.append("Level " + str(i+1)) + regions["Levels"].locations.append("Level " + str(i+1).rjust(3,'0')) regions["Olympus Coliseum"].locations.append("Complete Phil Cup") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index f4432951e5b7..3208d827b90e 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -47,7 +47,7 @@ def has_item(state: CollectionState, player: int, item) -> bool: def has_at_least(state: CollectionState, player: int, item, x) -> bool: return state.count(item, player) >= x -def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: bool): +def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, world_complete: bool, unknown: bool, atlantica: bool): #Location rules. #Keys #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -278,7 +278,7 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) - if not sephiroth: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode + if not sephiroth and not world_complete: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode multiworld.get_location("Chronicles Wonderland" , player).access_rule = lambda state: has_evidence(state, player) #multiworld.get_location("Chronicles Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Deep Jungle" , player).access_rule = lambda state: has_slides(state, player) @@ -303,7 +303,8 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, atlantica: b #multiworld.get_location("Ansem's Secret Report 11" , player).access_rule = lambda state: has_item(state, player, "") if sephiroth: multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - #multiworld.get_location("Ansem's Secret Report 13" , player).access_rule = lambda state: has_item(state, player, "") + if unknown: + multiworld.get_location("Ansem's Secret Report 13" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 84012313bfa7..ada2a9bdd7eb 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -80,19 +80,22 @@ def create_items(self): while i < len(level_up_item_pool): self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool[i])) i = i + 1 - if self.options.sephiroth or self.options.chronicles: + if self.options.sephiroth or self.options.world_complete or self.options.unknown: possible_win_locations = [] if self.options.sephiroth: possible_win_locations.append("Ansem's Secret Report 12") - if self.options.chronicles: - possible_win_locations.append("Chronicles Wonderland") - possible_win_locations.append("Chronicles Olympus Coliseum") + if self.options.unknown: + possible_win_locations.append("Ansem's Secret Report 13") + if self.options.world_complete: + #possible_win_locations.append("Chronicles Wonderland") If completing HB1, becomes inaccessible + #possible_win_locations.append("Chronicles Olympus Coliseum") Removing, the world is just too short possible_win_locations.append("Chronicles Deep Jungle") possible_win_locations.append("Chronicles Agrabah") possible_win_locations.append("Chronicles Monstro") if self.options.atlantica: - possible_win_locations.append("Chronicles Atlantica") + possible_win_locations.append("Ansem's Secret Report 3") #Replaces Chronicles Atlantica as it requires world completion possible_win_locations.append("Chronicles Halloween Town") + possible_win_locations.append("Ansem's Secret Report 9") #Complete Neverland, Chronicles Neverland is not a location self.multiworld.get_location(random.choice(possible_win_locations), self.player).place_locked_item(self.create_item("Victory")) else: self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) @@ -145,9 +148,9 @@ def create_event(self, name: str) -> KH1Item: return KH1Item(name, data.classification, data.code, self.player) def set_rules(self): - set_rules(self.multiworld, self.player, self.options.sephiroth, self.options.atlantica) + set_rules(self.multiworld, self.player, self.options.sephiroth, self.options.world_complete, self.options.unknown, self.options.atlantica) def create_regions(self): - create_regions(self.multiworld, self.player, self.options.sephiroth, self.options.atlantica\ + create_regions(self.multiworld, self.player, self.options.sephiroth, self.options.world_complete, self.options.unknown, self.options.atlantica\ , min((self.options.strength_increase + self.options.defense_increase + self.options.hp_increase + self.options.mp_increase\ + self.options.ap_increase + self.options.accessory_slot_increase + self.options.item_slot_increase), 100)) \ No newline at end of file From 95b51d4ade19620054f439b75d7362f39cda0584 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 12 Jan 2024 09:18:39 -0600 Subject: [PATCH 048/284] Consolidated goals into one choice --- worlds/kh1/Options.py | 20 ++++++++++++++++--- worlds/kh1/Regions.py | 14 +++++++------- worlds/kh1/Rules.py | 16 +++++++-------- worlds/kh1/__init__.py | 44 +++++++++++++++++++++--------------------- 4 files changed, 54 insertions(+), 40 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 4174311373cc..5513f7614462 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -83,11 +83,25 @@ class Atlantica(Toggle): """ display_name = "Atlantica" +class Goal(Choice): + """ + Determines the goal of your run. + """ + display_name = "Goal" + option_final_rest = 0 + option_deep_jungle = 1 + option_agrabah = 2 + option_monstro = 3 + option_atlantica = 4 + option_halloween_town = 5 + option_neverland = 6 + option_sephiroth = 7 + option_unknown = 8 + default = 0 + @dataclass class KH1Options(PerGameCommonOptions): - sephiroth: Sephiroth - world_complete: WorldComplete - unknown: Unknown + goal: Goal atlantica: Atlantica strength_increase: StrengthIncrease defense_increase: DefenseIncrease diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 0bcec32f03db..603975152b91 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,7 +9,7 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, world_complete: bool, unknown:bool, atlantica: bool, levels: int): +def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, levels: int): regions: Dict[str, KH1RegionData] = { "Menu": KH1RegionData(None, ["Awakening", "Levels"]), "Awakening": KH1RegionData([], ["Destiny Islands"]), @@ -134,7 +134,7 @@ def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, world_c regions["Monstro"].locations.append("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), regions["Monstro"].locations.append("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), regions["Monstro"].locations.append("Monstro Chamber 6 Low Chest"), - if atlantica: + if atlantica or goal == "atlantica": regions["Atlantica"].locations.append("Atlantica Sunken Ship In Flipped Boat Chest"), regions["Atlantica"].locations.append("Atlantica Sunken Ship Seabed Chest"), regions["Atlantica"].locations.append("Atlantica Sunken Ship Inside Ship Chest"), @@ -261,21 +261,21 @@ def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, world_c #regions["Awakening"].locations.append("Awakening Chest"), missable #regions["End of the World"].locations.append("Chronicles Sora's Story") - if not sephiroth and not world_complete: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode + if goal in ["final_rest", "unknown"]: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode regions["Wonderland"].locations.append("Chronicles Wonderland") regions["Olympus Coliseum"].locations.append("Chronicles Olympus Coliseum") regions["Deep Jungle"].locations.append("Chronicles Deep Jungle") regions["Agrabah"].locations.append("Chronicles Agrabah") regions["Monstro"].locations.append("Chronicles Monstro") #regions["100 Acre Wood"].locations.append("Chronicles 100 Acre Wood") - if atlantica: + if atlantica or goal == "atlantica": regions["Atlantica"].locations.append("Chronicles Atlantica") regions["Halloween Town"].locations.append("Chronicles Halloween Town") #regions["Neverland"].locations.append("Chronicles Neverland") regions["Agrabah"].locations.append("Ansem's Secret Report 1") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 2") - if atlantica: + if atlantica or goal == "atlantica": regions["Atlantica"].locations.append("Ansem's Secret Report 3") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 4") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 5") @@ -285,9 +285,9 @@ def create_regions(multiworld: MultiWorld, player: int, sephiroth: bool, world_c regions["Neverland"].locations.append("Ansem's Secret Report 9") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 10") #regions["Agrabah"].locations.append("Ansem's Secret Report 11") - if sephiroth: + if goal == "sephiroth": regions["Olympus Coliseum"].locations.append("Ansem's Secret Report 12") - if unknown: + if goal == "unknown": regions["Hollow Bastion"].locations.append("Ansem's Secret Report 13") for i in range(levels): diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 3208d827b90e..a1224d4df132 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -47,7 +47,7 @@ def has_item(state: CollectionState, player: int, item) -> bool: def has_at_least(state: CollectionState, player: int, item, x) -> bool: return state.count(item, player) >= x -def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, world_complete: bool, unknown: bool, atlantica: bool): +def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #Location rules. #Keys #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -151,7 +151,7 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, world_comple #multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: has_item(state, player, "") - if atlantica: + if atlantica or goal == "atlantica": #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -278,20 +278,20 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, world_comple #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) - if not sephiroth and not world_complete: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode + if goal in ["final_rest", "unknown"]: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode multiworld.get_location("Chronicles Wonderland" , player).access_rule = lambda state: has_evidence(state, player) #multiworld.get_location("Chronicles Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Deep Jungle" , player).access_rule = lambda state: has_slides(state, player) #multiworld.get_location("Chronicles Agrabah" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Monstro" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Chronicles 100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "") - if atlantica: + if atlantica or goal == "atlantica": multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) - if atlantica: + if atlantica or goal == "atlantica": multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") multiworld.get_location("Ansem's Secret Report 4" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) @@ -301,9 +301,9 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, world_comple multiworld.get_location("Ansem's Secret Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Ansem's Secret Report 10" , player).access_rule = lambda state: has_emblems(state, player) #multiworld.get_location("Ansem's Secret Report 11" , player).access_rule = lambda state: has_item(state, player, "") - if sephiroth: + if goal == "sephiroth": multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - if unknown: + if goal == "unknown": multiworld.get_location("Ansem's Secret Report 13" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") @@ -317,7 +317,7 @@ def set_rules(multiworld: MultiWorld, player: int, sephiroth: bool, world_comple multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: has_item(state, player,"Deep Jungle") multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: has_item(state, player,"Agrabah") multiworld.get_entrance("Monstro" , player).access_rule = lambda state: has_item(state, player,"Monstro") - if atlantica: + if atlantica or goal == "atlantica": multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index ada2a9bdd7eb..41a049190846 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -80,28 +80,28 @@ def create_items(self): while i < len(level_up_item_pool): self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool[i])) i = i + 1 - if self.options.sephiroth or self.options.world_complete or self.options.unknown: - possible_win_locations = [] - if self.options.sephiroth: - possible_win_locations.append("Ansem's Secret Report 12") - if self.options.unknown: - possible_win_locations.append("Ansem's Secret Report 13") - if self.options.world_complete: - #possible_win_locations.append("Chronicles Wonderland") If completing HB1, becomes inaccessible - #possible_win_locations.append("Chronicles Olympus Coliseum") Removing, the world is just too short - possible_win_locations.append("Chronicles Deep Jungle") - possible_win_locations.append("Chronicles Agrabah") - possible_win_locations.append("Chronicles Monstro") - if self.options.atlantica: - possible_win_locations.append("Ansem's Secret Report 3") #Replaces Chronicles Atlantica as it requires world completion - possible_win_locations.append("Chronicles Halloween Town") - possible_win_locations.append("Ansem's Secret Report 9") #Complete Neverland, Chronicles Neverland is not a location - self.multiworld.get_location(random.choice(possible_win_locations), self.player).place_locked_item(self.create_item("Victory")) - else: - self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) + match self.options.goal: + case "sephiroth": + self.multiworld.get_location("Ansem's Secret Report 12", self.player).place_locked_item(self.create_item("Victory")) + case "deep_jungle": + self.multiworld.get_location("Chronicles Deep Jungle", self.player).place_locked_item(self.create_item("Victory")) + case "agrabah": + self.multiworld.get_location("Chronicles Agrabah", self.player).place_locked_item(self.create_item("Victory")) + case "agrabah": + self.multiworld.get_location("Chronicles Monstro", self.player).place_locked_item(self.create_item("Victory")) + case "atlantica": + self.multiworld.get_location("Ansem's Secret Report 3", self.player).place_locked_item(self.create_item("Victory")) + case "halloween_town": + self.multiworld.get_location("Chronicles Halloween Town", self.player).place_locked_item(self.create_item("Victory")) + case "neverland": + self.multiworld.get_location("Ansem's Secret Report 9", self.player).place_locked_item(self.create_item("Victory")) + case "unknown": + self.multiworld.get_location("Ansem's Secret Report 13", self.player).place_locked_item(self.create_item("Victory")) + case "final_rest": + self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) total_locations = len(self.multiworld.get_unfilled_locations(self.player)) non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades"] - if self.options.atlantica: + if self.options.atlantica or self.options.goal == "atlantica": non_filler_item_categories.append("Atlantica") for name, data in item_table.items(): quantity = data.max_quantity @@ -148,9 +148,9 @@ def create_event(self, name: str) -> KH1Item: return KH1Item(name, data.classification, data.code, self.player) def set_rules(self): - set_rules(self.multiworld, self.player, self.options.sephiroth, self.options.world_complete, self.options.unknown, self.options.atlantica) + set_rules(self.multiworld, self.player, self.options.goal, self.options.atlantica) def create_regions(self): - create_regions(self.multiworld, self.player, self.options.sephiroth, self.options.world_complete, self.options.unknown, self.options.atlantica\ + create_regions(self.multiworld, self.player, self.options.goal, self.options.atlantica\ , min((self.options.strength_increase + self.options.defense_increase + self.options.hp_increase + self.options.mp_increase\ + self.options.ap_increase + self.options.accessory_slot_increase + self.options.item_slot_increase), 100)) \ No newline at end of file From bcfbf1e5b54b5a6e1d33d3ab25a828c0fb6d379d Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Fri, 12 Jan 2024 10:05:17 -0600 Subject: [PATCH 049/284] Revert "small refactor" --- worlds/kh1/Client.py | 54 ++++++++++++------------ worlds/kh1/MessageHandler.py | 79 ------------------------------------ 2 files changed, 25 insertions(+), 108 deletions(-) delete mode 100644 worlds/kh1/MessageHandler.py diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index a902f7b8c677..c45e11eea19d 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -6,7 +6,6 @@ import shutil import logging import re -from .MessageHandler import KH1_message_type, KH1_UniversalMessage, KH1_MessageHandler import time from calendar import timegm @@ -18,8 +17,6 @@ logger = logging.getLogger("Client") - - if __name__ == "__main__": Utils.init_logging("KH1Client", exception_logger="Client") @@ -33,7 +30,6 @@ def check_stdin() -> None: print("WARNING: Console input is not routed reliably on Windows, use the GUI instead.") class KH1ClientCommandProcessor(ClientCommandProcessor): - def _cmd_deathlink(self): """Toggles Deathlink""" global death_link @@ -54,7 +50,6 @@ def __init__(self, server_address, password): self.send_index: int = 0 self.syncing = False self.awaiting_bridge = False - # 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") @@ -67,19 +62,6 @@ def __init__(self, server_address, password): if file.find("obtain") <= -1: os.remove(root+"/"+file) - self.message_handler = KH1_MessageHandler(2, self.game_communication_path) - # - # self.message_handler.receive_message(KH1_message_type.test, [ - # "I'm a test message", - # "with multiple values", - # "isn't that cool?" - # ]); - # - # self.message_handler.receive_message(KH1_message_type.test, [ - # "Thats a second test message", - # "with only two values", - # ]); - async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: await super(KH1Context, self).server_auth(password_requested) @@ -101,7 +83,6 @@ def endpoints(self): return [] async def shutdown(self): - self.message_handler.stop_sending(); await super(KH1Context, self).shutdown() for root, dirs, files in os.walk(self.game_communication_path): for file in files: @@ -116,11 +97,6 @@ def on_package(self, cmd: str, args: dict): filename = f"send{ss}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() - self.message_handler.receive_message(KH1_message_type.test, [ - "Connected to the Multiworld!" - ]); - - if cmd in {"ReceivedItems"}: start_index = args["index"] @@ -167,13 +143,10 @@ def on_package(self, cmd: str, args: dict): itemCategory = networkItem.flags recieverName = self.player_names[recieverID] filename = "sent" - sanitizedItemName = re.sub('[^A-Za-z0-9 ]+', '',str(itemName))[:15]; - sanitizedRecieverName = re.sub('[^A-Za-z0-9 ]+', '',str(recieverName))[:6] - with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.write( - sanitizedItemName + "\n" - + sanitizedRecieverName + "\n" + 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() @@ -183,6 +156,29 @@ def on_deathlink(self, data: typing.Dict[str, typing.Any]): f.write(str(int(data["time"]))) f.close() +#f.write(self.item_names[NetworkItem(*item).item] + "\n" + self.location_names[NetworkItem(*item).location] + "\n" + self.player_names[NetworkItem(*item).player]) + + + + #last resort we can probably do better + #input: Krujo sent Magic Upgrade to Tim ((TT3) LocationName) + # if cmd in {"PrintJSON"}: + # data = args["data"] + # if data[0]: + # msg = str(data[0]["text"]); + # #player send a location + # # if msg.startswith(self.auth + " sent "): #debug + # with open(os.path.join(self.game_communication_path, "sent"), 'w') as f: + # msg = msg.replace(self.auth + " sent ", "") + # #Magic Upgrade to Tim ((TT3) LocationName) + # splitTo = msg.split(" to ") + # targetPlayer = splitTo[1].split(" ")[0] + # f.close() + + + + + def run_gui(self): """Import kivy UI system and start running it as self.ui_task.""" from kvui import GameManager diff --git a/worlds/kh1/MessageHandler.py b/worlds/kh1/MessageHandler.py deleted file mode 100644 index b2746da09fdc..000000000000 --- a/worlds/kh1/MessageHandler.py +++ /dev/null @@ -1,79 +0,0 @@ -from enum import IntEnum -from datetime import datetime -import threading -import time -import os -import json -import sys -import asyncio -import shutil -import logging -import re - -#type of message that should be sent to the game -class KH1_message_type(IntEnum): - invalid = -1 - test = 0 - recieved_trap = 1 - sent_item = 2 - deathlink = 3 - player_joined = 4 - player_left = 5 - - -#non-persistent message that is sent to the game -class KH1_UniversalMessage(): - def __init__(self, type : KH1_message_type , values : list[str]): - self.type: KH1_message_type = type - self.values: list[str] = values - - def as_message(self): - as_string = str(self.type.value) + "\n" - for value in self.values: - as_string += value + "\n" - return as_string - -class KH1_MessageHandler(): - def __init__(self, intervalSeconds: int, directory: str): - self.interval = intervalSeconds - self.directory = directory - self.message_cache : list[KH1_UniversalMessage] = [] - self.timer = threading.Timer(self.interval, self.send_messages) - self.timer.start() - - def receive_message(self, type: KH1_message_type, values: list[str]): - new_message = KH1_UniversalMessage(type, values) - self.message_cache.append(new_message) - - def send_messages(self): - valid_messages = [] - for message in self.message_cache: - if message.type != KH1_message_type.invalid: - valid_messages.append(message) - - if len(valid_messages) > 0: - print("Sending messages to KH1") - current_time = datetime.now().strftime("%Y%m%d%H%M%S") - all_messages: str = "" - all_messages += current_time + "\n" - - for message in valid_messages: - all_messages += message.as_message() - all_messages += "-\n" - - with open(os.path.join(self.directory, "messages.sem"), 'w') as f: - f.write(all_messages) - f.close() - - os.rename( - os.path.join(self.directory, "messages.sem"), - os.path.join(self.directory, "messages") - ) - - self.message_cache.clear() - self.timer = threading.Timer(self.interval, self.send_messages) - self.timer.start() - - - def stop_sending(self): - self.timer.cancel() From 1de842626b150bea540718ae648f4791e5dcd029 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 12 Jan 2024 10:26:23 -0600 Subject: [PATCH 050/284] Update Options.py --- worlds/kh1/Options.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 5513f7614462..7a61b3e47616 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -58,25 +58,6 @@ class ItemSlotIncrease(Range): range_end = 5 default = 3 -class Sephiroth(Toggle): - """ - Toggle whether the win condition should be changed to defeating Sephiroth. - """ - display_name = "Sephiroth" - -class WorldComplete(Toggle): - """ - Toggle whether the win condition should be placed behind a random world completion. - This could be that works Chronicles or Secret Report location. Better for fast games. - """ - display_name = "World Complete" - -class Unknown(Toggle): - """ - Toggle whether the win condition should be changed to defeating Unknown. - """ - display_name = "Unknown" - class Atlantica(Toggle): """ Toggle whether Atlantica locations/items should be included. From c6390775bb6d1699e0095dd58492bf66871d75f4 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 12 Jan 2024 13:00:34 -0600 Subject: [PATCH 051/284] Remove commented section --- worlds/kh1/Client.py | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index c45e11eea19d..47c8d89db87b 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -156,29 +156,6 @@ def on_deathlink(self, data: typing.Dict[str, typing.Any]): f.write(str(int(data["time"]))) f.close() -#f.write(self.item_names[NetworkItem(*item).item] + "\n" + self.location_names[NetworkItem(*item).location] + "\n" + self.player_names[NetworkItem(*item).player]) - - - - #last resort we can probably do better - #input: Krujo sent Magic Upgrade to Tim ((TT3) LocationName) - # if cmd in {"PrintJSON"}: - # data = args["data"] - # if data[0]: - # msg = str(data[0]["text"]); - # #player send a location - # # if msg.startswith(self.auth + " sent "): #debug - # with open(os.path.join(self.game_communication_path, "sent"), 'w') as f: - # msg = msg.replace(self.auth + " sent ", "") - # #Magic Upgrade to Tim ((TT3) LocationName) - # splitTo = msg.split(" to ") - # targetPlayer = splitTo[1].split(" ")[0] - # f.close() - - - - - def run_gui(self): """Import kivy UI system and start running it as self.ui_task.""" from kvui import GameManager From 4984ea8e73d0f40fd2839bc817a68fa918edd8e7 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 12 Jan 2024 13:11:32 -0600 Subject: [PATCH 052/284] Logic changes and fixing Monstro --- worlds/kh1/Rules.py | 11 +++++------ worlds/kh1/__init__.py | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index a1224d4df132..e9ac0bf7fc55 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -76,9 +76,9 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Trial Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest" , player).access_rule = lambda state: has_item(state, player, "Hollow Bastion") and has_x_worlds(state, player, 7) multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") - multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") - multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") + multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") or can_glide(state, player) + multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") or can_glide(state, player) + multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Wonderland Lotus Forest Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") and has_evidence(state, player) multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") and has_evidence(state, player) multiworld.get_location("Wonderland Lotus Forest Glide Chest" , player).access_rule = lambda state: can_glide(state, player) @@ -197,7 +197,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + #multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Monstro Chamber 5 Low 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 5 Low 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -285,8 +285,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("Chronicles Agrabah" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Monstro" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Chronicles 100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "") - if atlantica or goal == "atlantica": - multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") + #multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 41a049190846..fa83f8d0d8fe 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -87,7 +87,7 @@ def create_items(self): self.multiworld.get_location("Chronicles Deep Jungle", self.player).place_locked_item(self.create_item("Victory")) case "agrabah": self.multiworld.get_location("Chronicles Agrabah", self.player).place_locked_item(self.create_item("Victory")) - case "agrabah": + case "monstro": self.multiworld.get_location("Chronicles Monstro", self.player).place_locked_item(self.create_item("Victory")) case "atlantica": self.multiworld.get_location("Ansem's Secret Report 3", self.player).place_locked_item(self.create_item("Victory")) From be3308fc30b259813786f5e4f3d7364c01d8ff32 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 13 Jan 2024 01:09:53 -0600 Subject: [PATCH 053/284] Fixed starting items issue Added locations --- worlds/kh1/Client.py | 39 ++++++++++++++++++++------------------- worlds/kh1/Locations.py | 6 ++++-- worlds/kh1/Regions.py | 6 ++++-- worlds/kh1/Rules.py | 6 ++++-- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 47c8d89db87b..2d7f088ac08a 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -117,7 +117,7 @@ def on_package(self, cmd: str, args: dict): item_id = str(f.readline()).replace("\n", "") location_id = str(f.readline()).replace("\n", "") player = str(f.readline()).replace("\n", "") - if str(item_id) == str(NetworkItem(*item).item) and str(location_id) == str(NetworkItem(*item).location) and str(player) == str(NetworkItem(*item).player): + if str(item_id) == str(NetworkItem(*item).item) and str(location_id) == str(NetworkItem(*item).location) and str(player) == str(NetworkItem(*item).player) and int(location_id) > 0: found = True if not found: filename = f"AP_{str(check_num+1)}.item" @@ -132,24 +132,25 @@ def on_package(self, cmd: str, args: dict): with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() - if cmd in {"PrintJSON"} and args["type"] == "ItemSend": - item = args["item"] - networkItem = NetworkItem(*item) - recieverID = args["receiving"] - senderID = networkItem.player - locationID = networkItem.location - if recieverID != self.slot and senderID == self.slot: - itemName = self.item_names[networkItem.item] - 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() + if cmd in {"PrintJSON"} and "type" in args: + if args["type"] == "ItemSend": + item = args["item"] + networkItem = NetworkItem(*item) + recieverID = args["receiving"] + senderID = networkItem.player + locationID = networkItem.location + if recieverID != self.slot and senderID == self.slot: + itemName = self.item_names[networkItem.item] + 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() def on_deathlink(self, data: typing.Dict[str, typing.Any]): with open(os.path.join(self.game_communication_path, 'dlreceive'), 'w') as f: diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 92bc46924136..6e84367cd9ee 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -47,8 +47,9 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town Item Workshop Left Chest": KH1LocationData("Chests", 265_0893), "Traverse Town Secret Waterway Near Stairs Chest": KH1LocationData("Chests", 265_0894), "Wonderland Rabbit Hole Green Trinity Chest": KH1LocationData("Chests", 265_0931), - #"Wonderland Rabbit Hole Defeat Heartless After Trial Chest": KH1LocationData("Chests", 265_0933), missable - #"Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest": KH1LocationData("Chests", 265_0934), Go mode, just remove + "Wonderland Rabbit Hole Defeat Heartless 1 Chest": KH1LocationData("Chests", 265_0932), + "Wonderland Rabbit Hole Defeat Heartless 2 Chest": KH1LocationData("Chests", 265_0933), + "Wonderland Rabbit Hole Defeat Heartless 3 Chest": KH1LocationData("Chests", 265_0934), "Wonderland Bizarre Room Green Trinity Chest": KH1LocationData("Chests", 265_0971), "Wonderland Queen's Castle Hedge Left Red Chest": KH1LocationData("Chests", 265_1011), "Wonderland Queen's Castle Hedge Right Blue Chest": KH1LocationData("Chests", 265_1012), @@ -221,6 +222,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Chests", 265_4491), "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Chests", 265_4492), #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Chests", 265_4493), + "Hollow Bastion Entrance Hall Left of Emblem Door Chest": KH1LocationData("Chests", 265_4212), "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Chests", 265_4494), #"End of the World Final Dimension 1st Chest": KH1LocationData("Chests", 265_4531), #"End of the World Final Dimension 2nd Chest": KH1LocationData("Chests", 265_4532), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 603975152b91..d49d8b92f927 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -56,8 +56,9 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town Item Workshop Left Chest"), regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Near Stairs Chest"), regions["Wonderland"].locations.append("Wonderland Rabbit Hole Green Trinity Chest"), - #regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless After Trial Chest"), - #regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest"), + regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless 1 Chest"), + regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless 2 Chest"), + regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless 3 Chest"), regions["Wonderland"].locations.append("Wonderland Bizarre Room Green Trinity Chest"), regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Left Red Chest"), regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Right Blue Chest"), @@ -231,6 +232,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Oblivion Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Left of Gate Chest"), #regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Push the Statue Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Left of Emblem Door Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls White Trinity Chest"), #regions["End of the World"].locations.append("End of the World Final Dimension 1st Chest"), #regions["End of the World"].locations.append("End of the World Final Dimension 2nd Chest"), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index e9ac0bf7fc55..05b5b2d23ba2 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -73,8 +73,9 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Trial Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless After Hollow Bastion Chest" , player).access_rule = lambda state: has_item(state, player, "Hollow Bastion") and has_x_worlds(state, player, 7) + #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 1 Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 2 Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") or can_glide(state, player) @@ -248,6 +249,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Hollow Bastion Grand Hall Oblivion Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Grand Hall Left of Gate Chest" , player).access_rule = lambda state: has_emblems(state, player) #multiworld.get_location("Hollow Bastion Entrance Hall Push the Statue Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Hollow Bastion Rising Falls White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") #multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") From a9d7e97d625a8ff1e7a4ce070cb7870ce9cbe807 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 14 Jan 2024 22:02:33 -0600 Subject: [PATCH 054/284] Death link and rules fixes --- worlds/kh1/Client.py | 6 ++++++ worlds/kh1/Rules.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 2d7f088ac08a..df6981cabf6a 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -153,6 +153,12 @@ def on_package(self, cmd: str, args: dict): f.close() def on_deathlink(self, data: typing.Dict[str, typing.Any]): + self.last_death_link = max(data["time"], self.last_death_link) + text = data.get("cause", "") + if text: + logger.info(f"DeathLink: {text}") + else: + logger.info(f"DeathLink: Received from {data['source']}") with open(os.path.join(self.game_communication_path, 'dlreceive'), 'w') as f: f.write(str(int(data["time"]))) f.close() diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 05b5b2d23ba2..487c6c55ed1c 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -298,7 +298,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 6" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Ansem's Secret Report 8" , player).access_rule = lambda state: has_item(state, player, "Hades Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Ansem's Secret Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Ansem's Secret Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Ansem's Secret Report 10" , player).access_rule = lambda state: has_emblems(state, player) #multiworld.get_location("Ansem's Secret Report 11" , player).access_rule = lambda state: has_item(state, player, "") From 2c761613032c8c9c86c234202f4a576a85396e6f Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 14 Jan 2024 22:16:38 -0600 Subject: [PATCH 055/284] JaredWeakStrike adding testcases and fixing the prefill, fixing some rules, just generally being cool. --- worlds/kh1/Rules.py | 39 ++++-------------- worlds/kh1/__init__.py | 79 +++++++++++++++++------------------- worlds/kh1/test/__init__.py | 5 +++ worlds/kh1/test/test_goal.py | 53 ++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 71 deletions(-) create mode 100644 worlds/kh1/test/__init__.py create mode 100644 worlds/kh1/test/test_goal.py diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 487c6c55ed1c..a33f592dfe37 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,33 +1,12 @@ from BaseClasses import CollectionState, MultiWorld, LocationProgressType from .Locations import get_locations_by_category + def has_x_worlds(state: CollectionState, player: int, num_of_worlds) -> bool: - locations = 0 - if has_item(state, player,"Wonderland"): - locations = locations + 1 - if has_item(state, player,"Olympus Coliseum"): - locations = locations + 1 - if has_item(state, player,"Deep Jungle"): - locations = locations + 1 - if has_item(state, player,"Agrabah"): - locations = locations + 1 - if has_item(state, player,"Monstro"): - locations = locations + 1 - if has_item(state, player,"Atlantica"): - locations = locations + 1 - if has_item(state, player,"Halloween Town"): - locations = locations + 1 - if has_item(state, player,"Neverland"): - locations = locations + 1 - if has_item(state, player,"Hollow Bastion"): - locations = locations + 1 - #if has_item(state, player,"100 Acre Wood"): - # locations = locations + 1 - if has_item(state, player,"End of the World"): - locations = locations + 1 - if locations > num_of_worlds: - return True - return False + return sum([1 for world in ["Wonderland", "Olympus Coliseum", "Deep Jungle", + "Agrabah", "Monstro", "Atlantica", + "Halloween Town", "Neverland", "Hollow Bastion", + "End of the World"] if has_item(state, player, world)]) >= num_of_worlds def has_slides(state: CollectionState, player: int) -> bool: return state.has("Slide 1", player) #and state.has("Slide 2", player) and state.has("Slide 3", player) and state.has("Slide 4", player) and state.has("Slide 5", player) and state.has("Slide 6", player) @@ -278,7 +257,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("End of the World Final Rest Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") - + #multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) if goal in ["final_rest", "unknown"]: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode multiworld.get_location("Chronicles Wonderland" , player).access_rule = lambda state: has_evidence(state, player) @@ -306,12 +285,12 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") if goal == "unknown": multiworld.get_location("Ansem's Secret Report 13" , player).access_rule = lambda state: has_emblems(state, player) - + multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - + # Region rules. multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") multiworld.get_entrance("Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player,"Olympus Coliseum") @@ -324,6 +303,6 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_emblems(state, player) - + # Win condition. multiworld.completion_condition[player] = lambda state: state.has_all({"Victory"}, player) \ No newline at end of file diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index fa83f8d0d8fe..45b9b1ab11ce 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -11,7 +11,6 @@ import random - def launch_client(): from .Client import launch launch_subprocess(launch, name="KH1 Client") @@ -19,18 +18,20 @@ def launch_client(): components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT)) + class KH1Web(WebWorld): theme = "ocean" tutorials = [Tutorial( - "Multiworld Setup Guide", - "A guide to setting up the Kingdom Hearts Randomizer software on your computer. This guide covers single-player, " - "multiworld, and related software.", - "English", - "kh1_en.md", - "kh1/en", - ["Gicu"] + "Multiworld Setup Guide", + "A guide to setting up the Kingdom Hearts Randomizer software on your computer. This guide covers single-player, " + "multiworld, and related software.", + "English", + "kh1_en.md", + "kh1/en", + ["Gicu"] )] + class KH1World(World): """ Kingdom Hearts is an action RPG following Sora on his journey @@ -51,14 +52,14 @@ def create_items(self): item_pool: List[KH1Item] = [] possible_level_up_item_pool = [] level_up_item_pool = [] - - #Fill pool with mandatory items + + # Fill pool with mandatory items for i in range(self.options.item_slot_increase): level_up_item_pool.append("Item Slot Increase") for i in range(self.options.accessory_slot_increase): level_up_item_pool.append("Accessory Slot Increase") - - #Create other pool + + # Create other pool for i in range(self.options.strength_increase): possible_level_up_item_pool.append("Strength Increase") for i in range(self.options.defense_increase): @@ -69,43 +70,25 @@ def create_items(self): possible_level_up_item_pool.append("Max MP Increase") for i in range(self.options.ap_increase): possible_level_up_item_pool.append("Max AP Increase") - - #Fill remaining pool with items from other pool + + # Fill remaining pool with items from other pool while len(level_up_item_pool) < 100 and len(possible_level_up_item_pool) > 0: level_up_item_pool.append(possible_level_up_item_pool.pop(random.randrange(len(possible_level_up_item_pool)))) - + level_up_locations = list(get_locations_by_category("Levels").keys()) random.shuffle(level_up_item_pool) i = 0 while i < len(level_up_item_pool): self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool[i])) i = i + 1 - match self.options.goal: - case "sephiroth": - self.multiworld.get_location("Ansem's Secret Report 12", self.player).place_locked_item(self.create_item("Victory")) - case "deep_jungle": - self.multiworld.get_location("Chronicles Deep Jungle", self.player).place_locked_item(self.create_item("Victory")) - case "agrabah": - self.multiworld.get_location("Chronicles Agrabah", self.player).place_locked_item(self.create_item("Victory")) - case "monstro": - self.multiworld.get_location("Chronicles Monstro", self.player).place_locked_item(self.create_item("Victory")) - case "atlantica": - self.multiworld.get_location("Ansem's Secret Report 3", self.player).place_locked_item(self.create_item("Victory")) - case "halloween_town": - self.multiworld.get_location("Chronicles Halloween Town", self.player).place_locked_item(self.create_item("Victory")) - case "neverland": - self.multiworld.get_location("Ansem's Secret Report 9", self.player).place_locked_item(self.create_item("Victory")) - case "unknown": - self.multiworld.get_location("Ansem's Secret Report 13", self.player).place_locked_item(self.create_item("Victory")) - case "final_rest": - self.multiworld.get_location("End of the World Final Rest Chest", self.player).place_locked_item(self.create_item("Victory")) - total_locations = len(self.multiworld.get_unfilled_locations(self.player)) + + total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - 1 # for victory placement non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades"] if self.options.atlantica or self.options.goal == "atlantica": non_filler_item_categories.append("Atlantica") for name, data in item_table.items(): quantity = data.max_quantity - + # Ignore filler, it will be added in a later stage. if data.category not in non_filler_item_categories: continue @@ -113,7 +96,7 @@ def create_items(self): # Fill any empty locations with filler items. item_names = [] - attempts = 0 #If we ever try to add items 200 times, and all the items are used up, lets clear the item_names array, we probably don't have enough items + attempts = 0 # If we ever try to add items 200 times, and all the items are used up, lets clear the item_names array, we probably don't have enough items while len(item_pool) < total_locations: item_name = self.get_filler_item_name() if item_name not in item_names: @@ -128,6 +111,20 @@ def create_items(self): self.multiworld.itempool += item_pool + def pre_fill(self) -> None: + goal_dict = { + "sephiroth": "Ansem's Secret Report 12", + "deep_jungle": "Chronicles Deep Jungle", + "agrabah": "Chronicles Agrabah", + "monstro": "Chronicles Monstro", + "atlantica": "Ansem's Secret Report 3", + "halloween_town": "Chronicles Halloween Town", + "neverland": "Ansem's Secret Report 9", + "unknown": "Ansem's Secret Report 13", + "final_rest": "End of the World Final Rest Chest" + } + self.multiworld.get_location(goal_dict[self.options.goal.current_key], self.player).place_locked_item(self.create_item("Victory")) + def get_filler_item_name(self) -> str: fillers = {} disclude = [] @@ -138,7 +135,7 @@ def get_filler_item_name(self) -> str: fillers.update(get_items_by_category("Stat Ups", disclude)) weights = [data.weight for data in fillers.values()] return self.multiworld.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] - + def create_item(self, name: str) -> KH1Item: data = item_table[name] return KH1Item(name, data.classification, data.code, self.player) @@ -151,6 +148,6 @@ def set_rules(self): set_rules(self.multiworld, self.player, self.options.goal, self.options.atlantica) def create_regions(self): - create_regions(self.multiworld, self.player, self.options.goal, self.options.atlantica\ - , min((self.options.strength_increase + self.options.defense_increase + self.options.hp_increase + self.options.mp_increase\ - + self.options.ap_increase + self.options.accessory_slot_increase + self.options.item_slot_increase), 100)) \ No newline at end of file + create_regions(self.multiworld, self.player, self.options.goal, self.options.atlantica \ + , min((self.options.strength_increase + self.options.defense_increase + self.options.hp_increase + self.options.mp_increase \ + + self.options.ap_increase + self.options.accessory_slot_increase + self.options.item_slot_increase), 100)) \ No newline at end of file diff --git a/worlds/kh1/test/__init__.py b/worlds/kh1/test/__init__.py new file mode 100644 index 000000000000..960b527f8b8a --- /dev/null +++ b/worlds/kh1/test/__init__.py @@ -0,0 +1,5 @@ +from test.bases import WorldTestBase + + +class KH1TestBase(WorldTestBase): + game = "Kingdom Hearts" diff --git a/worlds/kh1/test/test_goal.py b/worlds/kh1/test/test_goal.py new file mode 100644 index 000000000000..89e8ca354dbc --- /dev/null +++ b/worlds/kh1/test/test_goal.py @@ -0,0 +1,53 @@ +from . import KH1TestBase + + +class TestDefault(KH1TestBase): + options = {} + + +class TestFinalRest(KH1TestBase): + options = { + "Goal": 0, + } + + +class TestDeepJungle(KH1TestBase): + options = { + "Goal": 1, + } + + +class TestAgrabah(KH1TestBase): + options = { + "Goal": 2, + } + + +class TestMonstro(KH1TestBase): + options = { + "Goal": 3, + } + + +class TestAtlantica(KH1TestBase): + options = { + "Goal": 4, + } + + +class TestHalloweenTown(KH1TestBase): + options = { + "Goal": 5, + } + + +class TestNeverland(KH1TestBase): + options = { + "Goal": 6, + } + + +class TestUnknown(KH1TestBase): + options = { + "Goal": 7, + } From 738588fadab9c31dec5336bab231a6bab26c3678 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 14 Jan 2024 22:37:48 -0600 Subject: [PATCH 056/284] Removed missable Blizzara chest --- worlds/kh1/Regions.py | 2 +- worlds/kh1/Rules.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index d49d8b92f927..67e7b133b2d7 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -168,7 +168,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest"), regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest"), regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates White Trinity Chest"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Blizzara Chest"), + #regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Blizzara Chest"), regions["Monstro"].locations.append("Monstro Mouth Boat Deck Chest"), regions["Monstro"].locations.append("Monstro Mouth High Platform Boat Side Chest"), regions["Monstro"].locations.append("Monstro Mouth High Platform Across from Boat Chest"), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index a33f592dfe37..23addb33c823 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -164,7 +164,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") multiworld.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") multiworld.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: has_at_least(state, player, "Progressive Blizzard", 2) + #multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: has_at_least(state, player, "Progressive Blizzard", 2) #multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) From fe2111ee2c12654d3fac45177f5f61ee3840c5ac Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 15 Jan 2024 14:16:24 -0600 Subject: [PATCH 057/284] Added events and postcards --- worlds/kh1/Items.py | 2 +- worlds/kh1/Locations.py | 62 +++++++++++++++++++++++++++------ worlds/kh1/Regions.py | 60 ++++++++++++++++++++++++++------ worlds/kh1/Rules.py | 76 +++++++++++++++++++++++++++++++++++------ worlds/kh1/__init__.py | 12 +++---- 5 files changed, 174 insertions(+), 38 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 2210bed7ea3b..f2c6f4e416c8 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -237,7 +237,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 3, weight = 10), #"Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 2": KH1ItemData("Key", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 3": KH1ItemData("Key", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 6e84367cd9ee..28b7de56f282 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -251,16 +251,58 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "End of the World Final Rest Chest": KH1LocationData("Chests", 265_4772), "Monstro Chamber 6 White Trinity Chest": KH1LocationData("Chests", 265_5092), #"Awakening Chest": KH1LocationData("Chests", 265_5093), missable - #"Chronicles Sora's Story": KH1LocationData("Chronicles", 265_6014), - "Chronicles Wonderland": KH1LocationData("Chronicles", 265_6056), - "Chronicles Olympus Coliseum": KH1LocationData("Chronicles", 265_6097), - "Chronicles Deep Jungle": KH1LocationData("Chronicles", 265_6136), - "Chronicles Agrabah": KH1LocationData("Chronicles", 265_6176), - "Chronicles Monstro": KH1LocationData("Chronicles", 265_6216), - #"Chronicles 100 Acre Wood": KH1LocationData("Chronicles", 265_6258), - "Chronicles Atlantica": KH1LocationData("Chronicles", 265_6297), - "Chronicles Halloween Town": KH1LocationData("Chronicles", 265_6336), - #"Chronicles Neverland": KH1LocationData("Chronicles", 265_6376), + + "Traverse Town Dodge Roll Event": KH1LocationData("Events", 265_6011), + "Traverse Town Fire Event": KH1LocationData("Events", 265_6012), + "Traverse Town Blue Trinity Event": KH1LocationData("Events", 265_6013), + "Traverse Town Earthshine Event": KH1LocationData("Events", 265_6014), + "Traverse Town Oathkeeper Event": KH1LocationData("Events", 265_6015), + "Deep Jungle White Fang Event": KH1LocationData("Events", 265_6021), + "Deep Jungle Cure Event": KH1LocationData("Events", 265_6022), + "Deep Jungle Jungle King Event": KH1LocationData("Events", 265_6023), + "Deep Jungle Red Trinity Event": KH1LocationData("Events", 265_6024), + "Olympus Coliseum Thunder Event": KH1LocationData("Events", 265_6031), + "Olympus Coliseum Sonic Blade Event": KH1LocationData("Events", 265_6032), + "Wonderland Blizzard Event": KH1LocationData("Events", 265_6041), + "Wonderland Ifrit's Horn Event": KH1LocationData("Events", 265_6042), + "Agrabah Ray of Light Event": KH1LocationData("Events", 265_6051), + "Agrabah Blizzard Event": KH1LocationData("Events", 265_6052), + "Agrabah Fire Event": KH1LocationData("Events", 265_6053), + "Agrabah Genie Event": KH1LocationData("Events", 265_6054), + "Agrabah Three Wishes Event": KH1LocationData("Events", 265_6055), + "Agrabah Green Trinity Event": KH1LocationData("Events", 265_6056), + "Monstro Goofy Cheer Event": KH1LocationData("Events", 265_6061), + "Monstro Stop Event": KH1LocationData("Events", 265_6062), + "Atlantica Mermaid Kick Event": KH1LocationData("Events", 265_6071), + "Atlantica Thunder Event": KH1LocationData("Events", 265_6072), + "Atlantica Crabclaw Event": KH1LocationData("Events", 265_6073), + "Halloween Town Holy Circlet Event": KH1LocationData("Events", 265_6081), + "Halloween Town Gravity Event": KH1LocationData("Events", 265_6082), + "Halloween Town Pumpkinhead Event": KH1LocationData("Events", 265_6083), + "Neverland Raven's Claw Event": KH1LocationData("Events", 265_6091), + "Neverland Cure Event": KH1LocationData("Events", 265_6092), + "Neverland Fairy Harp Event": KH1LocationData("Events", 265_6093), + "Neverland Tinker Bell Event": KH1LocationData("Events", 265_6094), + "Neverland Glide Event": KH1LocationData("Events", 265_6095), + "Hollow Bastion White Trinity Event": KH1LocationData("Events", 265_6101), + "Hollow Bastion Donald Cheer Event": KH1LocationData("Events", 265_6102), + "Hollow Bastion Fireglow Event": KH1LocationData("Events", 265_6103), + "Hollow Bastion Ragnarok Event": KH1LocationData("Events", 265_6104), + "Hollow Bastion Omega Arts Event": KH1LocationData("Events", 265_6105), + "Hollow Bastion Fire Event": KH1LocationData("Events", 265_6106), + "End of the World Superglide Event": KH1LocationData("Events", 265_6111), + + "Traverse Town Mail Postcard 01 Event": KH1LocationData("Events", 265_6120), + "Traverse Town Mail Postcard 02 Event": KH1LocationData("Events", 265_6121), + "Traverse Town Mail Postcard 03 Event": KH1LocationData("Events", 265_6122), + "Traverse Town Mail Postcard 04 Event": KH1LocationData("Events", 265_6123), + "Traverse Town Mail Postcard 05 Event": KH1LocationData("Events", 265_6124), + "Traverse Town Mail Postcard 06 Event": KH1LocationData("Events", 265_6125), + "Traverse Town Mail Postcard 07 Event": KH1LocationData("Events", 265_6126), + "Traverse Town Mail Postcard 08 Event": KH1LocationData("Events", 265_6127), + "Traverse Town Mail Postcard 09 Event": KH1LocationData("Events", 265_6128), + "Traverse Town Mail Postcard 10 Event": KH1LocationData("Events", 265_6129), + "Ansem's Secret Report 1": KH1LocationData("Reports", 265_7018), "Ansem's Secret Report 2": KH1LocationData("Reports", 265_7017), "Ansem's Secret Report 3": KH1LocationData("Reports", 265_7016), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 67e7b133b2d7..ad26c62612b3 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -262,18 +262,58 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Monstro"].locations.append("Monstro Chamber 6 White Trinity Chest"), #regions["Awakening"].locations.append("Awakening Chest"), missable - #regions["End of the World"].locations.append("Chronicles Sora's Story") + regions["Traverse Town"].locations.append("Traverse Town Dodge Roll Event"), + regions["Traverse Town"].locations.append("Traverse Town Fire Event"), + regions["Traverse Town"].locations.append("Traverse Town Blue Trinity Event"), + regions["Traverse Town"].locations.append("Traverse Town Earthshine Event"), + regions["Traverse Town"].locations.append("Traverse Town Oathkeeper Event"), + regions["Deep Jungle"].locations.append("Deep Jungle White Fang Event"), + regions["Deep Jungle"].locations.append("Deep Jungle Cure Event"), + regions["Deep Jungle"].locations.append("Deep Jungle Jungle King Event"), + regions["Deep Jungle"].locations.append("Deep Jungle Red Trinity Event"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Thunder Event"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Sonic Blade Event"), + regions["Wonderland"].locations.append("Wonderland Blizzard Event"), if goal in ["final_rest", "unknown"]: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode - regions["Wonderland"].locations.append("Chronicles Wonderland") - regions["Olympus Coliseum"].locations.append("Chronicles Olympus Coliseum") - regions["Deep Jungle"].locations.append("Chronicles Deep Jungle") - regions["Agrabah"].locations.append("Chronicles Agrabah") - regions["Monstro"].locations.append("Chronicles Monstro") - #regions["100 Acre Wood"].locations.append("Chronicles 100 Acre Wood") + regions["Wonderland"].locations.append("Wonderland Ifrit's Horn Event"), + regions["Agrabah"].locations.append("Agrabah Ray of Light Event"), + regions["Agrabah"].locations.append("Agrabah Blizzard Event"), + regions["Agrabah"].locations.append("Agrabah Fire Event"), + regions["Agrabah"].locations.append("Agrabah Genie Event"), + regions["Agrabah"].locations.append("Agrabah Three Wishes Event"), + regions["Agrabah"].locations.append("Agrabah Green Trinity Event"), + regions["Monstro"].locations.append("Monstro Goofy Cheer Event"), + regions["Monstro"].locations.append("Monstro Stop Event"), if atlantica or goal == "atlantica": - regions["Atlantica"].locations.append("Chronicles Atlantica") - regions["Halloween Town"].locations.append("Chronicles Halloween Town") - #regions["Neverland"].locations.append("Chronicles Neverland") + regions["Atlantica"].locations.append("Atlantica Mermaid Kick Event") + regions["Atlantica"].locations.append("Atlantica Thunder Event") + regions["Atlantica"].locations.append("Atlantica Crabclaw Event") + regions["Halloween Town"].locations.append("Halloween Town Holy Circlet Event") + regions["Halloween Town"].locations.append("Halloween Town Gravity Event") + regions["Halloween Town"].locations.append("Halloween Town Pumpkinhead Event") + regions["Neverland"].locations.append("Neverland Raven's Claw Event") + regions["Neverland"].locations.append("Neverland Cure Event") + regions["Neverland"].locations.append("Neverland Fairy Harp Event") + regions["Neverland"].locations.append("Neverland Tinker Bell Event") + regions["Neverland"].locations.append("Neverland Glide Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion White Trinity Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Donald Cheer Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Fireglow Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Ragnarok Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Omega Arts Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Fire Event") + regions["End of the World"].locations.append("End of the World Superglide Event") + + regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 01 Event") + regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 02 Event") + regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 03 Event") + regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 04 Event") + regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 05 Event") + regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 06 Event") + regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 07 Event") + regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 08 Event") + regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 09 Event") + regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 10 Event") regions["Agrabah"].locations.append("Ansem's Secret Report 1") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 2") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 23addb33c823..1ab432925a54 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -26,6 +26,18 @@ def has_item(state: CollectionState, player: int, item) -> bool: def has_at_least(state: CollectionState, player: int, item, x) -> bool: return state.count(item, player) >= x +def has_postcards(state: CollectionState, player: int, postcards_required: int) -> bool: + postcards_available = 3 #You can get three postcards without no items + if has_item(state, player, "Progressive Thunder"): + postcards_available = postcards_available + 2 #Gizmo Shop Postcards + if has_item(state, player, "Red Trinity") and has_item(state, player, "Green Trinity"): + postcards_available = postcards_available + 1 #After locking Traverse Town, examine the Synthesis Shop poster. + if has_item(state, player, "Monstro") and has_item(state, player, "High Jump"): + postcards_available = postcards_available + 1 #Gepetto's House Pot on Shelf + postcards_available = postcards_available + state.count("Postcard", player) #3 can be found in chests/events + return postcards_available >= postcards_required +end + def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #Location rules. #Keys @@ -258,17 +270,59 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Chronicles Sora's Story" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_item(state, player, "High Jump") and has_item(state, player, "Glide") and has_emblems(state, player) - if goal in ["final_rest", "unknown"]: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode - multiworld.get_location("Chronicles Wonderland" , player).access_rule = lambda state: has_evidence(state, player) - #multiworld.get_location("Chronicles Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Chronicles Deep Jungle" , player).access_rule = lambda state: has_slides(state, player) - #multiworld.get_location("Chronicles Agrabah" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Chronicles Monstro" , player).access_rule = lambda state: has_item(state, player, "High Jump") - #multiworld.get_location("Chronicles 100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Chronicles Atlantica" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Chronicles Halloween Town" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - #multiworld.get_location("Chronicles Neverland" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Traverse Town Dodge Roll Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Fire Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Blue Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Earthshine Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Traverse Town Oathkeeper Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Deep Jungle White Fang Event" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Cure Event" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Jungle King Event" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Red Trinity Event" , player).access_rule = lambda state: has_slides(state, player) + #multiworld.get_location("Olympus Coliseum Thunder Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Olympus Coliseum Sonic Blade Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Wonderland Blizzard Event" , player).access_rule = lambda state: has_item(state, player, "") + if goal in ["final_rest", "unknown"]: + multiworld.get_location("Wonderland Ifrit's Horn Event" , player).access_rule = lambda state: has_evidence(state, player) + #multiworld.get_location("Agrabah Ray of Light Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Blizzard Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Fire Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Genie Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Three Wishes Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Green Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Monstro Goofy Cheer Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Stop Event" , player).access_rule = lambda state: has_item(state, player, "High Jump") + if atlantica or goal == "atlantica": + #multiworld.get_location("Atlantica Mermaid Kick Event" , player).access_rule = lambda state: has_item(state, player "") + multiworld.get_location("Atlantica Thunder Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") + multiworld.get_location("Atlantica Crabclaw Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") + multiworld.get_location("Halloween Town Holy Circlet Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Gravity Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Pumpkinhead Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Neverland Raven's Claw Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Cure Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Fairy Harp Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Hollow Bastion White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Donald Cheer Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Fireglow Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Ragnarok Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Omega Arts Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Fire Event" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("End of the World Superglide Event" , player).access_rule = lambda state: has_item(state, player, "") + + multiworld.get_location("Traverse Town Mail Postcard 01 Event" , player).access_rule = lambda state: has_postcards(state, player, 1) + multiworld.get_location("Traverse Town Mail Postcard 02 Event" , player).access_rule = lambda state: has_postcards(state, player, 2) + multiworld.get_location("Traverse Town Mail Postcard 03 Event" , player).access_rule = lambda state: has_postcards(state, player, 3) + multiworld.get_location("Traverse Town Mail Postcard 04 Event" , player).access_rule = lambda state: has_postcards(state, player, 4) + multiworld.get_location("Traverse Town Mail Postcard 05 Event" , player).access_rule = lambda state: has_postcards(state, player, 5) + multiworld.get_location("Traverse Town Mail Postcard 06 Event" , player).access_rule = lambda state: has_postcards(state, player, 6) + multiworld.get_location("Traverse Town Mail Postcard 07 Event" , player).access_rule = lambda state: has_postcards(state, player, 7) + multiworld.get_location("Traverse Town Mail Postcard 08 Event" , player).access_rule = lambda state: has_postcards(state, player, 8) + multiworld.get_location("Traverse Town Mail Postcard 09 Event" , player).access_rule = lambda state: has_postcards(state, player, 9) + multiworld.get_location("Traverse Town Mail Postcard 10 Event" , player).access_rule = lambda state: has_postcards(state, player, 10) + #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) if atlantica or goal == "atlantica": diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 45b9b1ab11ce..d8a5b05864f8 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -114,12 +114,12 @@ def create_items(self): def pre_fill(self) -> None: goal_dict = { "sephiroth": "Ansem's Secret Report 12", - "deep_jungle": "Chronicles Deep Jungle", - "agrabah": "Chronicles Agrabah", - "monstro": "Chronicles Monstro", - "atlantica": "Ansem's Secret Report 3", - "halloween_town": "Chronicles Halloween Town", - "neverland": "Ansem's Secret Report 9", + "deep_jungle": "Deep Jungle Jungle King Event", + "agrabah": "Agrabah Genie Event", + "monstro": "Monstro Stop Event", + "atlantica": "Atlantica Crabclaw Event", + "halloween_town": "Halloween Town Pumpkinhead Event", + "neverland": "Neverland Fairy Harp Event", "unknown": "Ansem's Secret Report 13", "final_rest": "End of the World Final Rest Chest" } From 9895318261a6d42a8c3efc549226e019213dbacf Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 15 Jan 2024 14:16:57 -0600 Subject: [PATCH 058/284] Update Rules.py --- worlds/kh1/Rules.py | 1 - 1 file changed, 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 1ab432925a54..1b1f916eb87d 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -36,7 +36,6 @@ def has_postcards(state: CollectionState, player: int, postcards_required: int) postcards_available = postcards_available + 1 #Gepetto's House Pot on Shelf postcards_available = postcards_available + state.count("Postcard", player) #3 can be found in chests/events return postcards_available >= postcards_required -end def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #Location rules. From 3337145302580b8fa7e0481857762db7ad220687 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 15 Jan 2024 14:22:00 -0600 Subject: [PATCH 059/284] Adding postcards goal --- worlds/kh1/Options.py | 1 + worlds/kh1/__init__.py | 3 ++- worlds/kh1/test/test_goal.py | 11 ++++++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 7a61b3e47616..d53650e05df8 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -78,6 +78,7 @@ class Goal(Choice): option_neverland = 6 option_sephiroth = 7 option_unknown = 8 + option_postcards = 9 default = 0 @dataclass diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index d8a5b05864f8..7fcffa11eb63 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -121,7 +121,8 @@ def pre_fill(self) -> None: "halloween_town": "Halloween Town Pumpkinhead Event", "neverland": "Neverland Fairy Harp Event", "unknown": "Ansem's Secret Report 13", - "final_rest": "End of the World Final Rest Chest" + "final_rest": "End of the World Final Rest Chest", + "postcards": "Traverse Town Mail Postcard 10 Event" } self.multiworld.get_location(goal_dict[self.options.goal.current_key], self.player).place_locked_item(self.create_item("Victory")) diff --git a/worlds/kh1/test/test_goal.py b/worlds/kh1/test/test_goal.py index 89e8ca354dbc..f0e3a787b19e 100644 --- a/worlds/kh1/test/test_goal.py +++ b/worlds/kh1/test/test_goal.py @@ -46,8 +46,17 @@ class TestNeverland(KH1TestBase): "Goal": 6, } +class TestSephiroth(KH1TestBase): + options = { + "Goal": 7, + } class TestUnknown(KH1TestBase): options = { - "Goal": 7, + "Goal": 8, + } + +class TestPostcards(KH1TestBase): + options = { + "Goal": 9, } From 6884190f1e7daaa1fb7b91d90089bc92b2fe14a8 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 17 Jan 2024 16:34:07 -0600 Subject: [PATCH 060/284] Added aero event, fixed Wonderland --- worlds/kh1/Locations.py | 2 ++ worlds/kh1/Options.py | 19 ++++++++++--------- worlds/kh1/Regions.py | 5 +++-- worlds/kh1/Rules.py | 7 ++++--- worlds/kh1/test/test_goal.py | 29 +++++++++++++---------------- 5 files changed, 32 insertions(+), 30 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 28b7de56f282..b7d9fd7cc914 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -303,6 +303,8 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town Mail Postcard 09 Event": KH1LocationData("Events", 265_6128), "Traverse Town Mail Postcard 10 Event": KH1LocationData("Events", 265_6129), + "Traverse Town Aero Event": KH1LocationData("Events", 265_6131), + "Ansem's Secret Report 1": KH1LocationData("Reports", 265_7018), "Ansem's Secret Report 2": KH1LocationData("Reports", 265_7017), "Ansem's Secret Report 3": KH1LocationData("Reports", 265_7016), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index d53650e05df8..665daed5a1be 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -70,15 +70,16 @@ class Goal(Choice): """ display_name = "Goal" option_final_rest = 0 - option_deep_jungle = 1 - option_agrabah = 2 - option_monstro = 3 - option_atlantica = 4 - option_halloween_town = 5 - option_neverland = 6 - option_sephiroth = 7 - option_unknown = 8 - option_postcards = 9 + option_wonderland = 1 + option_deep_jungle = 2 + option_agrabah = 3 + option_monstro = 4 + option_atlantica = 5 + option_halloween_town = 6 + option_neverland = 7 + option_sephiroth = 8 + option_unknown = 9 + option_postcards = 10 default = 0 @dataclass diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index ad26c62612b3..92649b5d127f 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -274,8 +274,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Olympus Coliseum"].locations.append("Olympus Coliseum Thunder Event"), regions["Olympus Coliseum"].locations.append("Olympus Coliseum Sonic Blade Event"), regions["Wonderland"].locations.append("Wonderland Blizzard Event"), - if goal in ["final_rest", "unknown"]: #Not possible if HB is complete, could interefere with other win cons if 4 emblems is not go-mode - regions["Wonderland"].locations.append("Wonderland Ifrit's Horn Event"), + regions["Wonderland"].locations.append("Wonderland Ifrit's Horn Event"), regions["Agrabah"].locations.append("Agrabah Ray of Light Event"), regions["Agrabah"].locations.append("Agrabah Blizzard Event"), regions["Agrabah"].locations.append("Agrabah Fire Event"), @@ -315,6 +314,8 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 09 Event") regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 10 Event") + regions["Traverse Town"].locations.append("Traverse Town Aero Event") + regions["Agrabah"].locations.append("Ansem's Secret Report 1") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 2") if atlantica or goal == "atlantica": diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 1b1f916eb87d..982781e67e5c 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -30,7 +30,7 @@ def has_postcards(state: CollectionState, player: int, postcards_required: int) postcards_available = 3 #You can get three postcards without no items if has_item(state, player, "Progressive Thunder"): postcards_available = postcards_available + 2 #Gizmo Shop Postcards - if has_item(state, player, "Red Trinity") and has_item(state, player, "Green Trinity"): + if has_item(state, player, "Green Trinity"): postcards_available = postcards_available + 1 #After locking Traverse Town, examine the Synthesis Shop poster. if has_item(state, player, "Monstro") and has_item(state, player, "High Jump"): postcards_available = postcards_available + 1 #Gepetto's House Pot on Shelf @@ -281,8 +281,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("Olympus Coliseum Thunder Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Olympus Coliseum Sonic Blade Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Wonderland Blizzard Event" , player).access_rule = lambda state: has_item(state, player, "") - if goal in ["final_rest", "unknown"]: - multiworld.get_location("Wonderland Ifrit's Horn Event" , player).access_rule = lambda state: has_evidence(state, player) + multiworld.get_location("Wonderland Ifrit's Horn Event" , player).access_rule = lambda state: has_evidence(state, player) #multiworld.get_location("Agrabah Ray of Light Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Blizzard Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Fire Event" , player).access_rule = lambda state: has_item(state, player, "") @@ -321,6 +320,8 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Traverse Town Mail Postcard 08 Event" , player).access_rule = lambda state: has_postcards(state, player, 8) multiworld.get_location("Traverse Town Mail Postcard 09 Event" , player).access_rule = lambda state: has_postcards(state, player, 9) multiworld.get_location("Traverse Town Mail Postcard 10 Event" , player).access_rule = lambda state: has_postcards(state, player, 10) + + multiworld.get_location("Traverse Town Aero Event" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) diff --git a/worlds/kh1/test/test_goal.py b/worlds/kh1/test/test_goal.py index f0e3a787b19e..5edfe29e4019 100644 --- a/worlds/kh1/test/test_goal.py +++ b/worlds/kh1/test/test_goal.py @@ -1,62 +1,59 @@ from . import KH1TestBase - class TestDefault(KH1TestBase): options = {} - class TestFinalRest(KH1TestBase): options = { "Goal": 0, } - -class TestDeepJungle(KH1TestBase): +class TestWonderland(KH1TestBase): options = { "Goal": 1, } - -class TestAgrabah(KH1TestBase): +class TestDeepJungle(KH1TestBase): options = { "Goal": 2, } - -class TestMonstro(KH1TestBase): +class TestAgrabah(KH1TestBase): options = { "Goal": 3, } - -class TestAtlantica(KH1TestBase): +class TestMonstro(KH1TestBase): options = { "Goal": 4, } - -class TestHalloweenTown(KH1TestBase): +class TestAtlantica(KH1TestBase): options = { "Goal": 5, } +class TestHalloweenTown(KH1TestBase): + options = { + "Goal": 6, + } class TestNeverland(KH1TestBase): options = { - "Goal": 6, + "Goal": 7, } class TestSephiroth(KH1TestBase): options = { - "Goal": 7, + "Goal": 8, } class TestUnknown(KH1TestBase): options = { - "Goal": 8, + "Goal": 9, } class TestPostcards(KH1TestBase): options = { - "Goal": 9, + "Goal": 10, } From 5bcfda9cb932c6dac26f4ceba41440e33f9b1127 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 17 Jan 2024 17:26:49 -0600 Subject: [PATCH 061/284] Update __init__.py --- worlds/kh1/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 7fcffa11eb63..ea89ed73429d 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -114,6 +114,7 @@ def create_items(self): def pre_fill(self) -> None: goal_dict = { "sephiroth": "Ansem's Secret Report 12", + "wonderland": "Wonderland Ifrit's Horn Event", "deep_jungle": "Deep Jungle Jungle King Event", "agrabah": "Agrabah Genie Event", "monstro": "Monstro Stop Event", From 780bb3898067b5d06d8e6e0b203b05266cb69549 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 20 Jan 2024 00:10:00 -0600 Subject: [PATCH 062/284] Update Rules.py --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 982781e67e5c..99a33a01ed12 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -280,7 +280,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Deep Jungle Red Trinity Event" , player).access_rule = lambda state: has_slides(state, player) #multiworld.get_location("Olympus Coliseum Thunder Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Olympus Coliseum Sonic Blade Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Wonderland Blizzard Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Wonderland Blizzard Event" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Wonderland Ifrit's Horn Event" , player).access_rule = lambda state: has_evidence(state, player) #multiworld.get_location("Agrabah Ray of Light Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Blizzard Event" , player).access_rule = lambda state: has_item(state, player, "") From 3033d78ca450a0caedfbb72981d29ca71f6c9d3b Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 20 Jan 2024 17:49:09 -0600 Subject: [PATCH 063/284] Added OC Checks --- worlds/kh1/Locations.py | 21 ++++++++++++++++++--- worlds/kh1/Regions.py | 15 +++++++++++++++ worlds/kh1/Rules.py | 15 +++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index b7d9fd7cc914..84caf2987a74 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -419,9 +419,24 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Level 099": KH1LocationData("Levels", 265_8099), "Level 100": KH1LocationData("Levels", 265_8100), "Complete Phil Cup": KH1LocationData("Cups", 265_9001), - "Complete Pegasus Cup": KH1LocationData("Cups", 265_9002), - "Complete Hercules Cup": KH1LocationData("Cups", 265_9003), - "Complete Hades Cup": KH1LocationData("Cups", 265_9004), + "Complete Phil Cup Solo": KH1LocationData("Cups", 265_9002), + "Complete Phil Cup Time Trial": KH1LocationData("Cups", 265_9003), + "Complete Pegasus Cup": KH1LocationData("Cups", 265_9004), + "Complete Pegasus Cup Solo": KH1LocationData("Cups", 265_9005), + "Complete Pegasus Cup Time Trial": KH1LocationData("Cups", 265_9006), + "Complete Hercules Cup": KH1LocationData("Cups", 265_9007), + "Complete Hercules Cup Solo": KH1LocationData("Cups", 265_9008), + "Complete Hercules Cup Time Trial": KH1LocationData("Cups", 265_9009), + "Complete Hades Cup": KH1LocationData("Cups", 265_9010), + "Complete Hades Cup Solo": KH1LocationData("Cups", 265_9011), + "Complete Hades Cup Time Trial": KH1LocationData("Cups", 265_9012), + "Hades Cup Defeat Cloud and Leon Event": KH1LocationData("Cups", 265_9013), + "Hades Cup Defeat Yuffie Event": KH1LocationData("Cups", 265_9014), + "Hades Cup Defeat Cerberus Event": KH1LocationData("Cups", 265_9015), + "Hades Cup Defeat Behemoth Event": KH1LocationData("Cups", 265_9016), + "Hades Cup Defeat Hades Event": KH1LocationData("Cups", 265_9017), + "Pegasus Cup Defeat Cloud Event": KH1LocationData("Cups", 265_9018), + "Pegasus Cup Yellow Trinity Event": KH1LocationData("Cups", 265_9019) } event_location_table: Dict[str, KH1LocationData] = { diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 92649b5d127f..b71dc1b9095f 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -338,9 +338,24 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo 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") regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup") + regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup Solo") + regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup Time Trial") 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("Pegasus Cup Defeat Cloud Event") + regions["Olympus Coliseum"].locations.append("Pegasus Cup Yellow Trinity Event") # Set up the regions correctly. for name, data in regions.items(): diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 99a33a01ed12..7bc366febe39 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -341,9 +341,24 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Ansem's Secret Report 13" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") + multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") + multiworld.get_location("Complete Phil Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") + multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") + multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Pegasus Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") + multiworld.get_location("Pegasus Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") # Region rules. multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") From ab949f53074fa2b5d4ccc047f821997dad306053 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 20 Jan 2024 20:21:47 -0600 Subject: [PATCH 064/284] Fixed pegasus -> hercules checks --- worlds/kh1/Locations.py | 4 ++-- worlds/kh1/Regions.py | 4 ++-- worlds/kh1/Rules.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 84caf2987a74..d1117fb223b2 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -435,8 +435,8 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Hades Cup Defeat Cerberus Event": KH1LocationData("Cups", 265_9015), "Hades Cup Defeat Behemoth Event": KH1LocationData("Cups", 265_9016), "Hades Cup Defeat Hades Event": KH1LocationData("Cups", 265_9017), - "Pegasus Cup Defeat Cloud Event": KH1LocationData("Cups", 265_9018), - "Pegasus Cup Yellow Trinity Event": KH1LocationData("Cups", 265_9019) + "Hercules Cup Defeat Cloud Event": KH1LocationData("Cups", 265_9018), + "Hercules Cup Yellow Trinity Event": KH1LocationData("Cups", 265_9019) } event_location_table: Dict[str, KH1LocationData] = { diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index b71dc1b9095f..00e01fde9aa1 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -354,8 +354,8 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo 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("Pegasus Cup Defeat Cloud Event") - regions["Olympus Coliseum"].locations.append("Pegasus Cup Yellow Trinity Event") + regions["Olympus Coliseum"].locations.append("Hercules Cup Defeat Cloud Event") + regions["Olympus Coliseum"].locations.append("Hercules Cup Yellow Trinity Event") # Set up the regions correctly. for name, data in regions.items(): diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 7bc366febe39..94c6e21c06bc 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -357,8 +357,8 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - multiworld.get_location("Pegasus Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") - multiworld.get_location("Pegasus Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") + multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") # Region rules. multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") From 75c5986f0b51c04589f214c8f32b00f0d6c85052 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 21 Jan 2024 21:16:58 -0600 Subject: [PATCH 065/284] Update Rules.py --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 94c6e21c06bc..cb1beabda491 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -15,7 +15,7 @@ def has_evidence(state: CollectionState, player: int) -> bool: return state.has("Footprints", player) #or state.has("Stench", player) or state.has("Claw Marks", player) or state.has("Antenna", player) def can_glide(state: CollectionState, player: int) -> bool: - return state.has("Glide", player) or state.has("Super Glide", player) + return state.has("Glide", player) or state.has("Superglide", player) def has_emblems(state: CollectionState, player: int) -> bool: return state.has("Emblem Piece (Flame)", player) and state.has("Emblem Piece (Chest)", player) and state.has("Emblem Piece (Statue)", player) and state.has("Emblem Piece (Fountain)", player) From e42fce6a36126bc7791a0106d96f671ddfab67f0 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 21 Jan 2024 22:22:06 -0600 Subject: [PATCH 066/284] Added Atlantica Clams --- worlds/kh1/Locations.py | 17 +++++++++++++++++ worlds/kh1/Regions.py | 18 ++++++++++++++++++ worlds/kh1/Rules.py | 18 ++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index d1117fb223b2..399a2495e7c9 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -305,6 +305,23 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town Aero Event": KH1LocationData("Events", 265_6131), + "Atlantica Undersea Gorge Blizzard Clam": KH1LocationData("Clam", 265_6201), + "Atlantica Undersea Gorge Ocean Floor Clam": KH1LocationData("Clam", 265_6202), + "Atlantica Undersea Valley Higher Cave Clam": KH1LocationData("Clam", 265_6203), + "Atlantica Undersea Valley Lower Cave Clam": KH1LocationData("Clam", 265_6204), + "Atlantica Undersea Valley Fire Clam": KH1LocationData("Clam", 265_6205), + "Atlantica Undersea Valley Wall Clam": KH1LocationData("Clam", 265_6206), + "Atlantica Undersea Valley Pillar Clam": KH1LocationData("Clam", 265_6207), + "Atlantica Undersea Valley Ocean Floor Clam": KH1LocationData("Clam", 265_6208), + "Atlantica Triton's Palace Thunder Clam": KH1LocationData("Clam", 265_6209), + "Atlantica Triton's Palace Wall Right Clam": KH1LocationData("Clam", 265_6210), + "Atlantica Triton's Palace Near Path Clam": KH1LocationData("Clam", 265_6211), + "Atlantica Triton's Palace Wall Left Clam": KH1LocationData("Clam", 265_6212), + "Atlantica Cavern Nook Clam": KH1LocationData("Clam", 265_6213), + "Atlantica Below Deck Clam": KH1LocationData("Clam", 265_6214), + "Atlantica Undersea Garden Clam": KH1LocationData("Clam", 265_6215), + "Atlantica Undersea Cave Clam": KH1LocationData("Clam", 265_6216), + "Ansem's Secret Report 1": KH1LocationData("Reports", 265_7018), "Ansem's Secret Report 2": KH1LocationData("Reports", 265_7017), "Ansem's Secret Report 3": KH1LocationData("Reports", 265_7016), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 00e01fde9aa1..e5f3fe253a6b 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -316,6 +316,24 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town Aero Event") + if atlantica or goal == "atlantica": + regions["Atlantica"].locations.append("Atlantica Undersea Gorge Blizzard Clam") + regions["Atlantica"].locations.append("Atlantica Undersea Gorge Ocean Floor Clam") + regions["Atlantica"].locations.append("Atlantica Undersea Valley Higher Cave Clam") + regions["Atlantica"].locations.append("Atlantica Undersea Valley Lower Cave Clam") + regions["Atlantica"].locations.append("Atlantica Undersea Valley Fire Clam") + regions["Atlantica"].locations.append("Atlantica Undersea Valley Wall Clam") + regions["Atlantica"].locations.append("Atlantica Undersea Valley Pillar Clam") + regions["Atlantica"].locations.append("Atlantica Undersea Valley Ocean Floor Clam") + regions["Atlantica"].locations.append("Atlantica Triton's Palace Thunder Clam") + regions["Atlantica"].locations.append("Atlantica Triton's Palace Wall Right Clam") + regions["Atlantica"].locations.append("Atlantica Triton's Palace Near Path Clam") + regions["Atlantica"].locations.append("Atlantica Triton's Palace Wall Left Clam") + regions["Atlantica"].locations.append("Atlantica Cavern Nook Clam") + regions["Atlantica"].locations.append("Atlantica Below Deck Clam") + regions["Atlantica"].locations.append("Atlantica Undersea Garden Clam") + regions["Atlantica"].locations.append("Atlantica Undersea Cave Clam") + regions["Agrabah"].locations.append("Ansem's Secret Report 1") regions["Hollow Bastion"].locations.append("Ansem's Secret Report 2") if atlantica or goal == "atlantica": diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index cb1beabda491..7ae250e7708f 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -322,6 +322,24 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Traverse Town Mail Postcard 10 Event" , player).access_rule = lambda state: has_postcards(state, player, 10) multiworld.get_location("Traverse Town Aero Event" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") + + if atlantica or goal == "atlantica": + multiworld.get_location("Atlantica Undersea Gorge Blizzard Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") + #multiworld.get_location("Atlantica Undersea Gorge Ocean Floor Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Valley Higher Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Valley Lower Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Undersea Valley Fire Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") + #multiworld.get_location("Atlantica Undersea Valley Wall Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Valley Pillar Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Valley Ocean Floor Clam" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Triton's Palace Thunder Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") + #multiworld.get_location("Atlantica Triton's Palace Wall Right Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Triton's Palace Near Path Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Triton's Palace Wall Left Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Cavern Nook Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Below Deck Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Garden Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) From 9eb11add224c07a4f132c3ea72ec8d0768e7d42f Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 22 Jan 2024 11:57:59 -0600 Subject: [PATCH 067/284] Testing XP multiplier --- worlds/kh1/Client.py | 1 + worlds/kh1/__init__.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index df6981cabf6a..8a259a236c87 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -97,6 +97,7 @@ def on_package(self, cmd: str, args: dict): filename = f"send{ss}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() + print("Slot Data: " + str(args['slot_data'])) if cmd in {"ReceivedItems"}: start_index = args["index"] diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index ea89ed73429d..2fda49d2cdf4 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -138,6 +138,10 @@ def get_filler_item_name(self) -> str: weights = [data.weight for data in fillers.values()] return self.multiworld.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] + def fill_slot_data(self) -> dict: + slot_data = {"EXP Multiplier": 1.0} + return slot_data + def create_item(self, name: str) -> KH1Item: data = item_table[name] return KH1Item(name, data.classification, data.code, self.player) From 91e77d1da9f58788b15f498e206cbd91db2adede Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 22 Jan 2024 12:37:37 -0600 Subject: [PATCH 068/284] Added XP Multiplier Options --- worlds/kh1/Client.py | 8 +++++++- worlds/kh1/Options.py | 18 +++++++++++++++++- worlds/kh1/__init__.py | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 8a259a236c87..0e8b2268a4c1 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -97,7 +97,13 @@ def on_package(self, cmd: str, args: dict): filename = f"send{ss}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() - print("Slot Data: " + str(args['slot_data'])) + if "EXP Multiplier" in list(args['slot_data'].keys()): + xp_mult = args['slot_data']["EXP Multiplier"] + else: + xp_mult = 1.0 + with open(os.path.join(self.game_communication_path, "xpmult.cfg"), 'w') as f: + f.write(str(xp_mult)) + f.close() if cmd in {"ReceivedItems"}: start_index = args["index"] diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 665daed5a1be..6c1ca530c31b 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionSet, PerGameCommonOptions +from Options import NamedRange, Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionSet, PerGameCommonOptions class StrengthIncrease(Range): """ @@ -82,6 +82,21 @@ class Goal(Choice): option_postcards = 10 default = 0 +class EXPMultiplier(NamedRange): + """ + Determines the multiplier to apply to EXP gained + """ + display_name = "EXP Multiplier" + default = 16 + range_start = default / 2 + range_end = 48 + special_range_names = { + "half": default / 2, + "normal": default, + "double": default * 2, + "triple": default * 3, + } + @dataclass class KH1Options(PerGameCommonOptions): goal: Goal @@ -93,3 +108,4 @@ class KH1Options(PerGameCommonOptions): mp_increase: MPIncrease accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease + exp_multiplier: EXPMultiplier diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 2fda49d2cdf4..8c1097dda44d 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -139,7 +139,7 @@ def get_filler_item_name(self) -> str: return self.multiworld.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] def fill_slot_data(self) -> dict: - slot_data = {"EXP Multiplier": 1.0} + slot_data = {"EXP Multiplier": int(self.options.exp_multiplier)/16} return slot_data def create_item(self, name: str) -> KH1Item: From 8734f38335bfffcac756f8f9906f29e56bcd320e Mon Sep 17 00:00:00 2001 From: gaithern Date: Thu, 25 Jan 2024 22:55:34 -0600 Subject: [PATCH 069/284] Added Final Ansem Goal --- worlds/kh1/Locations.py | 5 +++-- worlds/kh1/Options.py | 19 ++++++++++++------- worlds/kh1/Regions.py | 3 +++ worlds/kh1/Rules.py | 4 +++- worlds/kh1/__init__.py | 3 ++- worlds/kh1/test/test_goal.py | 5 +++++ 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 399a2495e7c9..f806145c952b 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -452,8 +452,9 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Hades Cup Defeat Cerberus Event": KH1LocationData("Cups", 265_9015), "Hades Cup Defeat Behemoth Event": KH1LocationData("Cups", 265_9016), "Hades Cup Defeat Hades Event": KH1LocationData("Cups", 265_9017), - "Hercules Cup Defeat Cloud Event": KH1LocationData("Cups", 265_9018), - "Hercules Cup Yellow Trinity Event": KH1LocationData("Cups", 265_9019) + "Hercules Cup Defeat Cloud Event": KH1LocationData("Cups", 265_9018), + "Hercules Cup Yellow Trinity Event": KH1LocationData("Cups", 265_9019), + "Final Ansem": KH1LocationData("Final", 265_9999) } event_location_table: Dict[str, KH1LocationData] = { diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 6c1ca530c31b..25c0e7751698 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -80,7 +80,8 @@ class Goal(Choice): option_sephiroth = 8 option_unknown = 9 option_postcards = 10 - default = 0 + option_final_ansem = 11 + default = 11 class EXPMultiplier(NamedRange): """ @@ -88,13 +89,17 @@ class EXPMultiplier(NamedRange): """ display_name = "EXP Multiplier" default = 16 - range_start = default / 2 - range_end = 48 + range_start = default / 4 + range_end = 160 special_range_names = { - "half": default / 2, - "normal": default, - "double": default * 2, - "triple": default * 3, + "0.25x": default / 4, + "0.5x": default / 2, + "1x": default, + "2x": default * 2, + "3x": default * 3, + "4x": default * 4, + "8x": default * 8, + "10x": default * 10, } @dataclass diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index e5f3fe253a6b..7269d75719c4 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -374,6 +374,9 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo 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") + + if goal == "final_ansem": + regions["End of the World"].locations.append("Final Ansem") # Set up the regions correctly. for name, data in regions.items(): diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 7ae250e7708f..fbb1896e6306 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -179,7 +179,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + #multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: (has_item(state, player, "High Jump") or can_glide(state, player)) and has_item(state, player, "Green Trinity") #multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 2 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -377,6 +377,8 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + + #multiworld.get_location("Final Ansem" , player).access_rule = lambda state: has_item(state, player, "") # Region rules. multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 8c1097dda44d..5696f5245c60 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -123,7 +123,8 @@ def pre_fill(self) -> None: "neverland": "Neverland Fairy Harp Event", "unknown": "Ansem's Secret Report 13", "final_rest": "End of the World Final Rest Chest", - "postcards": "Traverse Town Mail Postcard 10 Event" + "postcards": "Traverse Town Mail Postcard 10 Event", + "final_ansem": "Final Ansem" } self.multiworld.get_location(goal_dict[self.options.goal.current_key], self.player).place_locked_item(self.create_item("Victory")) diff --git a/worlds/kh1/test/test_goal.py b/worlds/kh1/test/test_goal.py index 5edfe29e4019..d2932326113f 100644 --- a/worlds/kh1/test/test_goal.py +++ b/worlds/kh1/test/test_goal.py @@ -57,3 +57,8 @@ class TestPostcards(KH1TestBase): options = { "Goal": 10, } + +class TestFinalRest(KH1TestBase): + options = { + "Goal": 11, + } \ No newline at end of file From 653e155a941c633fd42624dfa3412279f12dc03d Mon Sep 17 00:00:00 2001 From: gaithern Date: Thu, 25 Jan 2024 23:37:28 -0600 Subject: [PATCH 070/284] Update __init__.py --- worlds/kh1/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 5696f5245c60..b93a8d7386e9 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -41,7 +41,6 @@ class KH1World(World): options_dataclass = KH1Options options: KH1Options topology_present = True - data_version = 4 required_client_version = (0, 3, 5) web = KH1Web() From 6991c03202ee49bdc3826b4e7d10427cf127e666 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 26 Jan 2024 08:44:07 -0600 Subject: [PATCH 071/284] Update Rules.py --- worlds/kh1/Rules.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index fbb1896e6306..da5c118dbae4 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -37,6 +37,9 @@ def has_postcards(state: CollectionState, player: int, postcards_required: int) postcards_available = postcards_available + state.count("Postcard", player) #3 can be found in chests/events return postcards_available >= postcards_required +def has_offensive_magic(state: CollectionState, player: int) -> bool: + return state.has("Progressive Fire", player) or state.has("Progressive Blizzard", player) or state.has("Progressive Thunder", player) or state.has("Progressive Gravity", player) or state.has("Progressive Stop", player) + def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #Location rules. #Keys @@ -74,7 +77,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") and has_evidence(state, player) multiworld.get_location("Wonderland Lotus Forest Glide Chest" , player).access_rule = lambda state: can_glide(state, player) #multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) @@ -85,7 +88,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Hippo's Lagoon Center Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Hippo's Lagoon Left Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Deep Jungle Hippo's Lagoon Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Deep Jungle Hippo's Lagoon Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Deep Jungle Vines Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Vines 2 Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Deep Jungle Climbing Trees Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") @@ -291,9 +294,9 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("Monstro Goofy Cheer Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Stop Event" , player).access_rule = lambda state: has_item(state, player, "High Jump") if atlantica or goal == "atlantica": - #multiworld.get_location("Atlantica Mermaid Kick Event" , player).access_rule = lambda state: has_item(state, player "") - multiworld.get_location("Atlantica Thunder Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") - multiworld.get_location("Atlantica Crabclaw Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") + multiworld.get_location("Atlantica Mermaid Kick Event" , player).access_rule = lambda state: has_offensive_magic(state, player) + multiworld.get_location("Atlantica Thunder Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) + multiworld.get_location("Atlantica Crabclaw Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) multiworld.get_location("Halloween Town Holy Circlet Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") multiworld.get_location("Halloween Town Gravity Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") multiworld.get_location("Halloween Town Pumpkinhead Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") @@ -344,7 +347,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) if atlantica or goal == "atlantica": - multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") + multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) multiworld.get_location("Ansem's Secret Report 4" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Ansem's Secret Report 6" , player).access_rule = lambda state: has_emblems(state, player) From ed63daa452ef85ca84df2dac34fef5146efd11a8 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 2 Feb 2024 10:04:03 -0600 Subject: [PATCH 072/284] New EotW logic --- worlds/kh1/Client.py | 11 +++ worlds/kh1/Items.py | 202 ++++++++++++++++++++-------------------- worlds/kh1/Locations.py | 26 +++--- worlds/kh1/Options.py | 20 ++++ worlds/kh1/Regions.py | 26 +++--- worlds/kh1/Rules.py | 41 ++++---- worlds/kh1/__init__.py | 17 ++-- 7 files changed, 193 insertions(+), 150 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 0e8b2268a4c1..8cdfad1c4490 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -97,6 +97,8 @@ def on_package(self, cmd: str, args: dict): filename = f"send{ss}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() + + #Handle Slot Data if "EXP Multiplier" in list(args['slot_data'].keys()): xp_mult = args['slot_data']["EXP Multiplier"] else: @@ -104,6 +106,15 @@ def on_package(self, cmd: str, args: dict): with open(os.path.join(self.game_communication_path, "xpmult.cfg"), 'w') as f: f.write(str(xp_mult)) f.close() + + if "Required Reports" in list(args['slot_data'].keys()): + reports_required = args['slot_data']["Required Reports"] + else: + reports_required = 4 + with open(os.path.join(self.game_communication_path, "required_reports.cfg"), 'w') as f: + f.write(str(reports_required)) + f.close() + #End Handle Slot Data if cmd in {"ReceivedItems"}: start_index = args["index"] diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index f2c6f4e416c8..7cbb68060fba 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -43,61 +43,61 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, weight = 10), #"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, weight = 10), #"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, weight = 10), - "Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + #"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, max_quantity = 1, weight = 10), @@ -130,36 +130,36 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Dream Shield": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Dream Shield": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, max_quantity = 1, weight = 10), @@ -175,9 +175,9 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, weight = 10), #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, weight = 10), #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, weight = 10), - #"Ansem's Report 11": KH1ItemData("Key", code = 264_1149, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Ansem's Report 12": KH1ItemData("Key", code = 264_1150, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Ansem's Report 13": KH1ItemData("Key", code = 264_1151, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Ansem's Report 11": KH1ItemData("Unlock", code = 264_1149, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Ansem's Report 12": KH1ItemData("Unlock", code = 264_1150, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Ansem's Report 13": KH1ItemData("Unlock", code = 264_1151, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, weight = 10), "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, weight = 10), "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, weight = 10), @@ -194,30 +194,30 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Shiitank Rank": KH1ItemData("Synthesis", code = 264_1165, classification = ItemClassification.filler, weight = 10), #"Matsutake Rank": KH1ItemData("Synthesis", code = 264_1166, classification = ItemClassification.filler, weight = 10), #"Mystery Mold": KH1ItemData("Synthesis", code = 264_1167, classification = ItemClassification.filler, weight = 10), - #"Ansem's Report 1": KH1ItemData("Key", code = 264_1168, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Ansem's Report 2": KH1ItemData("Key", code = 264_1169, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Ansem's Report 3": KH1ItemData("Key", code = 264_1170, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Ansem's Report 4": KH1ItemData("Key", code = 264_1171, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Ansem's Report 5": KH1ItemData("Key", code = 264_1172, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Ansem's Report 6": KH1ItemData("Key", code = 264_1173, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Ansem's Report 7": KH1ItemData("Key", code = 264_1174, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Ansem's Report 8": KH1ItemData("Key", code = 264_1175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Ansem's Report 9": KH1ItemData("Key", code = 264_1176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Ansem's Report 10": KH1ItemData("Key", code = 264_1177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 1": KH1ItemData("Unlock", code = 264_1168, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 2": KH1ItemData("Unlock", code = 264_1169, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 3": KH1ItemData("Unlock", code = 264_1170, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 4": KH1ItemData("Unlock", code = 264_1171, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 5": KH1ItemData("Unlock", code = 264_1172, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 6": KH1ItemData("Unlock", code = 264_1173, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 7": KH1ItemData("Unlock", code = 264_1174, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 8": KH1ItemData("Unlock", code = 264_1175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 9": KH1ItemData("Unlock", code = 264_1176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 10": KH1ItemData("Unlock", code = 264_1177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Khama Vol. 8": KH1ItemData("Key", code = 264_1178, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Salegg Vol. 6": KH1ItemData("Key", code = 264_1179, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Azal Vol. 3": KH1ItemData("Key", code = 264_1180, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Mava Vol. 3": KH1ItemData("Key", code = 264_1181, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Mava Vol. 6": KH1ItemData("Key", code = 264_1182, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Log": KH1ItemData("Key", code = 264_1192, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Cloth": KH1ItemData("Key", code = 264_1193, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Rope": KH1ItemData("Key", code = 264_1194, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index f806145c952b..1740d88a12ec 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -322,19 +322,19 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Atlantica Undersea Garden Clam": KH1LocationData("Clam", 265_6215), "Atlantica Undersea Cave Clam": KH1LocationData("Clam", 265_6216), - "Ansem's Secret Report 1": KH1LocationData("Reports", 265_7018), - "Ansem's Secret Report 2": KH1LocationData("Reports", 265_7017), - "Ansem's Secret Report 3": KH1LocationData("Reports", 265_7016), - "Ansem's Secret Report 4": KH1LocationData("Reports", 265_7015), - "Ansem's Secret Report 5": KH1LocationData("Reports", 265_7014), - "Ansem's Secret Report 6": KH1LocationData("Reports", 265_7013), - "Ansem's Secret Report 7": KH1LocationData("Reports", 265_7012), - "Ansem's Secret Report 8": KH1LocationData("Reports", 265_7011), - "Ansem's Secret Report 9": KH1LocationData("Reports", 265_7028), - "Ansem's Secret Report 10": KH1LocationData("Reports", 265_7027), - #"Ansem's Secret Report 11": KH1LocationData("Reports", 265_7026), - "Ansem's Secret Report 12": KH1LocationData("Reports", 265_7025), - "Ansem's Secret Report 13": KH1LocationData("Reports", 265_7024), + "Ansem's Report 1": KH1LocationData("Reports", 265_7018), + "Ansem's Report 2": KH1LocationData("Reports", 265_7017), + "Ansem's Report 3": KH1LocationData("Reports", 265_7016), + "Ansem's Report 4": KH1LocationData("Reports", 265_7015), + "Ansem's Report 5": KH1LocationData("Reports", 265_7014), + "Ansem's Report 6": KH1LocationData("Reports", 265_7013), + "Ansem's Report 7": KH1LocationData("Reports", 265_7012), + "Ansem's Report 8": KH1LocationData("Reports", 265_7011), + "Ansem's Report 9": KH1LocationData("Reports", 265_7028), + "Ansem's Report 10": KH1LocationData("Reports", 265_7027), + #"Ansem's Report 11": KH1LocationData("Reports", 265_7026), + "Ansem's Report 12": KH1LocationData("Reports", 265_7025), + "Ansem's Report 13": KH1LocationData("Reports", 265_7024), "Level 001": KH1LocationData("Levels", 265_8001), "Level 002": KH1LocationData("Levels", 265_8002), "Level 003": KH1LocationData("Levels", 265_8003), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 25c0e7751698..90dc72c8e3f5 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -102,6 +102,24 @@ class EXPMultiplier(NamedRange): "10x": default * 10, } +class RequiredReports(Range): + """ + Determines the number of Ansem's Reports needed to open End of the World + """ + diplay_name = "Reports to Open End of the World" + default = 4 + range_start = 1 + range_end = 13 + +class ReportsInPool(Range): + """ + Determines the number of Ansem's Reports in the item pool. + """ + diplay_name = "Reports in Pool" + default = 4 + range_start = 1 + range_end = 13 + @dataclass class KH1Options(PerGameCommonOptions): goal: Goal @@ -114,3 +132,5 @@ class KH1Options(PerGameCommonOptions): accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease exp_multiplier: EXPMultiplier + required_reports: RequiredReports + reports_in_pool: ReportsInPool diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 7269d75719c4..aa2b25a03522 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -334,22 +334,22 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Atlantica"].locations.append("Atlantica Undersea Garden Clam") regions["Atlantica"].locations.append("Atlantica Undersea Cave Clam") - regions["Agrabah"].locations.append("Ansem's Secret Report 1") - regions["Hollow Bastion"].locations.append("Ansem's Secret Report 2") + regions["Agrabah"].locations.append("Ansem's Report 1") + regions["Hollow Bastion"].locations.append("Ansem's Report 2") if atlantica or goal == "atlantica": - regions["Atlantica"].locations.append("Ansem's Secret Report 3") - regions["Hollow Bastion"].locations.append("Ansem's Secret Report 4") - regions["Hollow Bastion"].locations.append("Ansem's Secret Report 5") - regions["Hollow Bastion"].locations.append("Ansem's Secret Report 6") - regions["Halloween Town"].locations.append("Ansem's Secret Report 7") - regions["Olympus Coliseum"].locations.append("Ansem's Secret Report 8") - regions["Neverland"].locations.append("Ansem's Secret Report 9") - regions["Hollow Bastion"].locations.append("Ansem's Secret Report 10") - #regions["Agrabah"].locations.append("Ansem's Secret Report 11") + regions["Atlantica"].locations.append("Ansem's Report 3") + regions["Hollow Bastion"].locations.append("Ansem's Report 4") + regions["Hollow Bastion"].locations.append("Ansem's Report 5") + regions["Hollow Bastion"].locations.append("Ansem's Report 6") + regions["Halloween Town"].locations.append("Ansem's Report 7") + regions["Olympus Coliseum"].locations.append("Ansem's Report 8") + regions["Neverland"].locations.append("Ansem's Report 9") + regions["Hollow Bastion"].locations.append("Ansem's Report 10") + #regions["Agrabah"].locations.append("Ansem's Report 11") if goal == "sephiroth": - regions["Olympus Coliseum"].locations.append("Ansem's Secret Report 12") + regions["Olympus Coliseum"].locations.append("Ansem's Report 12") if goal == "unknown": - regions["Hollow Bastion"].locations.append("Ansem's Secret Report 13") + regions["Hollow Bastion"].locations.append("Ansem's Report 13") for i in range(levels): regions["Levels"].locations.append("Level " + str(i+1).rjust(3,'0')) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index da5c118dbae4..e922d62da331 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -18,7 +18,7 @@ def can_glide(state: CollectionState, player: int) -> bool: return state.has("Glide", player) or state.has("Superglide", player) def has_emblems(state: CollectionState, player: int) -> bool: - return state.has("Emblem Piece (Flame)", player) and state.has("Emblem Piece (Chest)", player) and state.has("Emblem Piece (Statue)", player) and state.has("Emblem Piece (Fountain)", player) + return state.has("Theon Vol. 6", player) and state.has("Red Trinity", player) and state.has("Progressive Fire", player) and (state.has("Progressive Thunder", player) or state.has("High Jump", player) or can_glide(state, player)) def has_item(state: CollectionState, player: int, item) -> bool: return state.has(item, player) @@ -40,7 +40,14 @@ def has_postcards(state: CollectionState, player: int, postcards_required: int) def has_offensive_magic(state: CollectionState, player: int) -> bool: return state.has("Progressive Fire", player) or state.has("Progressive Blizzard", player) or state.has("Progressive Thunder", player) or state.has("Progressive Gravity", player) or state.has("Progressive Stop", player) -def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): +def has_reports(state: CollectionState, player: int, required_reports: int) -> bool: + reports_acquired = 0 + for x in range(13): + if has_item(state, player, "Ansem's Report " + str(x+1)): + reports_acquired = reports_acquired + 1 + return reports_acquired >= required_reports + +def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, required_reports: int): #Location rules. #Keys #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -123,7 +130,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: can_glide(state, player) #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -344,22 +351,22 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): #multiworld.get_location("Atlantica Undersea Garden Clam" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Undersea Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Ansem's Secret Report 1" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Ansem's Secret Report 2" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("Ansem's Report 1" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Ansem's Report 2" , player).access_rule = lambda state: has_emblems(state, player) if atlantica or goal == "atlantica": - multiworld.get_location("Ansem's Secret Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) - multiworld.get_location("Ansem's Secret Report 4" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Ansem's Secret Report 5" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Ansem's Secret Report 6" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Ansem's Secret Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Ansem's Secret Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Ansem's Secret Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Ansem's Secret Report 10" , player).access_rule = lambda state: has_emblems(state, player) - #multiworld.get_location("Ansem's Secret Report 11" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Ansem's Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) + multiworld.get_location("Ansem's Report 4" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Ansem's Report 5" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Ansem's Report 6" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Ansem's Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Ansem's Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("Ansem's Report 11" , player).access_rule = lambda state: has_item(state, player, "") if goal == "sephiroth": - multiworld.get_location("Ansem's Secret Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") if goal == "unknown": - multiworld.get_location("Ansem's Secret Report 13" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") @@ -394,7 +401,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool): multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) - multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 7) and has_emblems(state, player) + multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_x_worlds(state, player, 7) and has_reports(state, player, required_reports) # Win condition. multiworld.completion_condition[player] = lambda state: state.has_all({"Victory"}, player) \ No newline at end of file diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index b93a8d7386e9..1d47b5423082 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -48,6 +48,9 @@ class KH1World(World): location_name_to_id = {name: data.code for name, data in location_table.items()} def create_items(self): + if self.options.reports_in_pool < self.options.required_reports): + print("LESS REPORTS IN POOL THAN REQUIRED REPORTS, SWAPPING") + item_pool: List[KH1Item] = [] possible_level_up_item_pool = [] level_up_item_pool = [] @@ -82,7 +85,7 @@ def create_items(self): i = i + 1 total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - 1 # for victory placement - non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades"] + non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades", "Accessory", "Weapons"] if self.options.atlantica or self.options.goal == "atlantica": non_filler_item_categories.append("Atlantica") for name, data in item_table.items(): @@ -92,6 +95,9 @@ def create_items(self): if data.category not in non_filler_item_categories: continue item_pool += [self.create_item(name) for _ in range(0, quantity)] + + for i in range(max(self.options.required_reports, self.options.reports_in_pool)): + item_pool += [self.create_item("Ansem's Report " + str(i+1))] # Fill any empty locations with filler items. item_names = [] @@ -112,7 +118,7 @@ def create_items(self): def pre_fill(self) -> None: goal_dict = { - "sephiroth": "Ansem's Secret Report 12", + "sephiroth": "Ansem's Report 12", "wonderland": "Wonderland Ifrit's Horn Event", "deep_jungle": "Deep Jungle Jungle King Event", "agrabah": "Agrabah Genie Event", @@ -120,7 +126,7 @@ def pre_fill(self) -> None: "atlantica": "Atlantica Crabclaw Event", "halloween_town": "Halloween Town Pumpkinhead Event", "neverland": "Neverland Fairy Harp Event", - "unknown": "Ansem's Secret Report 13", + "unknown": "Ansem's Report 13", "final_rest": "End of the World Final Rest Chest", "postcards": "Traverse Town Mail Postcard 10 Event", "final_ansem": "Final Ansem" @@ -131,8 +137,6 @@ def get_filler_item_name(self) -> str: fillers = {} disclude = [] fillers.update(get_items_by_category("Item", disclude)) - fillers.update(get_items_by_category("Accessory", disclude)) - fillers.update(get_items_by_category("Weapons", disclude)) fillers.update(get_items_by_category("Camping", disclude)) fillers.update(get_items_by_category("Stat Ups", disclude)) weights = [data.weight for data in fillers.values()] @@ -140,6 +144,7 @@ def get_filler_item_name(self) -> str: def fill_slot_data(self) -> dict: slot_data = {"EXP Multiplier": int(self.options.exp_multiplier)/16} + slot_data = {"Required Reports": min(int(self.options.required_reports), int(self.options.reports_in_pool))} return slot_data def create_item(self, name: str) -> KH1Item: @@ -151,7 +156,7 @@ def create_event(self, name: str) -> KH1Item: return KH1Item(name, data.classification, data.code, self.player) def set_rules(self): - set_rules(self.multiworld, self.player, self.options.goal, self.options.atlantica) + set_rules(self.multiworld, self.player, self.options.goal, self.options.atlantica, min(self.options.required_reports, self.options.reports_in_pool)) def create_regions(self): create_regions(self.multiworld, self.player, self.options.goal, self.options.atlantica \ From a13bac186475eba7f89eeb925f68a5a85e7c2bd8 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 2 Feb 2024 10:04:25 -0600 Subject: [PATCH 073/284] Update __init__.py --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 1d47b5423082..1310a679d66f 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -48,7 +48,7 @@ class KH1World(World): location_name_to_id = {name: data.code for name, data in location_table.items()} def create_items(self): - if self.options.reports_in_pool < self.options.required_reports): + if self.options.reports_in_pool < self.options.required_reports: print("LESS REPORTS IN POOL THAN REQUIRED REPORTS, SWAPPING") item_pool: List[KH1Item] = [] From bb50db28087a74516e1ebb18eb0234efa03cba53 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 2 Feb 2024 11:06:44 -0600 Subject: [PATCH 074/284] Update __init__.py --- worlds/kh1/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 1310a679d66f..0c5386ae3ed6 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -143,8 +143,8 @@ def get_filler_item_name(self) -> str: return self.multiworld.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] def fill_slot_data(self) -> dict: - slot_data = {"EXP Multiplier": int(self.options.exp_multiplier)/16} - slot_data = {"Required Reports": min(int(self.options.required_reports), int(self.options.reports_in_pool))} + slot_data = {"EXP Multiplier": int(self.options.exp_multiplier)/16 + ,"Required Reports": min(int(self.options.required_reports), int(self.options.reports_in_pool))} return slot_data def create_item(self, name: str) -> KH1Item: From 1c0be10e51c3e82eabe8531c39a9bf1f415ce8ef Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 2 Feb 2024 11:24:22 -0600 Subject: [PATCH 075/284] Update Items.py --- worlds/kh1/Items.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 7cbb68060fba..e4fbeac4293a 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -175,9 +175,9 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, weight = 10), #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, weight = 10), #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, weight = 10), - "Ansem's Report 11": KH1ItemData("Unlock", code = 264_1149, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Ansem's Report 12": KH1ItemData("Unlock", code = 264_1150, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Ansem's Report 13": KH1ItemData("Unlock", code = 264_1151, classification = ItemClassification.filler, max_quantity = 1, weight = 10), + "Ansem's Report 11": KH1ItemData("Unlock", code = 264_1149, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 12": KH1ItemData("Unlock", code = 264_1150, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 13": KH1ItemData("Unlock", code = 264_1151, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, weight = 10), "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, weight = 10), "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, weight = 10), From e82382758f8182c85e1bb30721bbf3b9ebb20a81 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 5 Feb 2024 15:44:54 -0600 Subject: [PATCH 076/284] Update Rules.py --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index e922d62da331..a8fa9c9ea2c7 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -283,7 +283,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Traverse Town Fire Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town Blue Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town Earthshine Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Oathkeeper Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Traverse Town Oathkeeper Event" , player).access_rule = lambda state: has_emblems(state, player) and has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) multiworld.get_location("Deep Jungle White Fang Event" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Cure Event" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Jungle King Event" , player).access_rule = lambda state: has_slides(state, player) From 431dfa06b0769a4206b7af7e08bd89391f022c00 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 17 Feb 2024 10:51:35 -0600 Subject: [PATCH 077/284] Rename Location to be more meaningful, logic fixes --- worlds/kh1/Locations.py | 106 +++++++++++++++--------------- worlds/kh1/Regions.py | 106 +++++++++++++++--------------- worlds/kh1/Rules.py | 140 ++++++++++++++++++++-------------------- 3 files changed, 176 insertions(+), 176 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 1740d88a12ec..5aeb9e027277 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -252,45 +252,45 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Monstro Chamber 6 White Trinity Chest": KH1LocationData("Chests", 265_5092), #"Awakening Chest": KH1LocationData("Chests", 265_5093), missable - "Traverse Town Dodge Roll Event": KH1LocationData("Events", 265_6011), - "Traverse Town Fire Event": KH1LocationData("Events", 265_6012), - "Traverse Town Blue Trinity Event": KH1LocationData("Events", 265_6013), - "Traverse Town Earthshine Event": KH1LocationData("Events", 265_6014), - "Traverse Town Oathkeeper Event": KH1LocationData("Events", 265_6015), - "Deep Jungle White Fang Event": KH1LocationData("Events", 265_6021), - "Deep Jungle Cure Event": KH1LocationData("Events", 265_6022), - "Deep Jungle Jungle King Event": KH1LocationData("Events", 265_6023), - "Deep Jungle Red Trinity Event": KH1LocationData("Events", 265_6024), - "Olympus Coliseum Thunder Event": KH1LocationData("Events", 265_6031), - "Olympus Coliseum Sonic Blade Event": KH1LocationData("Events", 265_6032), - "Wonderland Blizzard Event": KH1LocationData("Events", 265_6041), - "Wonderland Ifrit's Horn Event": KH1LocationData("Events", 265_6042), - "Agrabah Ray of Light Event": KH1LocationData("Events", 265_6051), - "Agrabah Blizzard Event": KH1LocationData("Events", 265_6052), - "Agrabah Fire Event": KH1LocationData("Events", 265_6053), - "Agrabah Genie Event": KH1LocationData("Events", 265_6054), - "Agrabah Three Wishes Event": KH1LocationData("Events", 265_6055), - "Agrabah Green Trinity Event": KH1LocationData("Events", 265_6056), - "Monstro Goofy Cheer Event": KH1LocationData("Events", 265_6061), - "Monstro Stop Event": KH1LocationData("Events", 265_6062), - "Atlantica Mermaid Kick Event": KH1LocationData("Events", 265_6071), - "Atlantica Thunder Event": KH1LocationData("Events", 265_6072), - "Atlantica Crabclaw Event": KH1LocationData("Events", 265_6073), - "Halloween Town Holy Circlet Event": KH1LocationData("Events", 265_6081), - "Halloween Town Gravity Event": KH1LocationData("Events", 265_6082), - "Halloween Town Pumpkinhead Event": KH1LocationData("Events", 265_6083), - "Neverland Raven's Claw Event": KH1LocationData("Events", 265_6091), - "Neverland Cure Event": KH1LocationData("Events", 265_6092), - "Neverland Fairy Harp Event": KH1LocationData("Events", 265_6093), - "Neverland Tinker Bell Event": KH1LocationData("Events", 265_6094), - "Neverland Glide Event": KH1LocationData("Events", 265_6095), - "Hollow Bastion White Trinity Event": KH1LocationData("Events", 265_6101), - "Hollow Bastion Donald Cheer Event": KH1LocationData("Events", 265_6102), - "Hollow Bastion Fireglow Event": KH1LocationData("Events", 265_6103), - "Hollow Bastion Ragnarok Event": KH1LocationData("Events", 265_6104), - "Hollow Bastion Omega Arts Event": KH1LocationData("Events", 265_6105), - "Hollow Bastion Fire Event": KH1LocationData("Events", 265_6106), - "End of the World Superglide Event": KH1LocationData("Events", 265_6111), + "Traverse Town Defeat Guard Armor Dodge Roll Event": KH1LocationData("Events", 265_6011), + "Traverse Town Defeat Guard Armor Fire Event": KH1LocationData("Events", 265_6012), + "Traverse Town Defeat Guard Armor Blue Trinity Event": KH1LocationData("Events", 265_6013), + "Traverse Town Leon Secret Waterway Earthshine Event": KH1LocationData("Events", 265_6014), + "Traverse Town Kairi Secret Waterway Oathkeeper Event": KH1LocationData("Events", 265_6015), + "Deep Jungle Defeat Sabor White Fang Event": KH1LocationData("Events", 265_6021), + "Deep Jungle Defeat Clayton Cure Event": KH1LocationData("Events", 265_6022), + "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Events", 265_6023), + "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Events", 265_6024), + "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Events", 265_6031), + "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Events", 265_6032), + "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Events", 265_6041), + "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Events", 265_6042), + "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Events", 265_6051), + "Agrabah Defeat Jafar Blizzard Event": KH1LocationData("Events", 265_6052), + "Agrabah Defeat Jafar Genie Fire Event": KH1LocationData("Events", 265_6053), + "Agrabah Seal Keyhole Genie Event": KH1LocationData("Events", 265_6054), + "Agrabah Seal Keyhole Three Wishes Event": KH1LocationData("Events", 265_6055), + "Agrabah Seal Keyhole Green Trinity Event": KH1LocationData("Events", 265_6056), + "Monstro Defeat Parasite Cage I Goofy Cheer Event": KH1LocationData("Events", 265_6061), + "Monstro Defeat Parasite Cage II Stop Event": KH1LocationData("Events", 265_6062), + "Atlantica Defeat Ursula I Mermaid Kick Event": KH1LocationData("Events", 265_6071), + "Atlantica Defeat Ursula II Thunder Event": KH1LocationData("Events", 265_6072), + "Atlantica Seal Keyhole Crabclaw Event": KH1LocationData("Events", 265_6073), + "Halloween Town Defeat Oogie Boogie Holy Circlet Event": KH1LocationData("Events", 265_6081), + "Halloween Town Defeat Oogie's Manor Gravity Event": KH1LocationData("Events", 265_6082), + "Halloween Town Seal Keyhole Pumpkinhead Event": KH1LocationData("Events", 265_6083), + "Neverland Defeat Anti Sora Raven's Claw Event": KH1LocationData("Events", 265_6091), + "Neverland Encounter Hook Cure Event": KH1LocationData("Events", 265_6092), + "Neverland Seal Keyhole Fairy Harp Event": KH1LocationData("Events", 265_6093), + "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Events", 265_6094), + "Neverland Seal Keyhole Glide Event": KH1LocationData("Events", 265_6095), + "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Events", 265_6101), + "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Events", 265_6102), + "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Events", 265_6103), + "Hollow Bastion Defeat Riku II Ragnarok Event": KH1LocationData("Events", 265_6104), + "Hollow Bastion Defeat Behemoth Omega Arts Event": KH1LocationData("Events", 265_6105), + "Hollow Bastion Speak to Princesses Fire Event": KH1LocationData("Events", 265_6106), + "End of the World Defeat Chernabog Superglide Event": KH1LocationData("Events", 265_6111), "Traverse Town Mail Postcard 01 Event": KH1LocationData("Events", 265_6120), "Traverse Town Mail Postcard 02 Event": KH1LocationData("Events", 265_6121), @@ -303,7 +303,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town Mail Postcard 09 Event": KH1LocationData("Events", 265_6128), "Traverse Town Mail Postcard 10 Event": KH1LocationData("Events", 265_6129), - "Traverse Town Aero Event": KH1LocationData("Events", 265_6131), + "Traverse Town Defeat Opposite Armor Aero Event": KH1LocationData("Events", 265_6131), "Atlantica Undersea Gorge Blizzard Clam": KH1LocationData("Clam", 265_6201), "Atlantica Undersea Gorge Ocean Floor Clam": KH1LocationData("Clam", 265_6202), @@ -322,19 +322,19 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Atlantica Undersea Garden Clam": KH1LocationData("Clam", 265_6215), "Atlantica Undersea Cave Clam": KH1LocationData("Clam", 265_6216), - "Ansem's Report 1": KH1LocationData("Reports", 265_7018), - "Ansem's Report 2": KH1LocationData("Reports", 265_7017), - "Ansem's Report 3": KH1LocationData("Reports", 265_7016), - "Ansem's Report 4": KH1LocationData("Reports", 265_7015), - "Ansem's Report 5": KH1LocationData("Reports", 265_7014), - "Ansem's Report 6": KH1LocationData("Reports", 265_7013), - "Ansem's Report 7": KH1LocationData("Reports", 265_7012), - "Ansem's Report 8": KH1LocationData("Reports", 265_7011), - "Ansem's Report 9": KH1LocationData("Reports", 265_7028), - "Ansem's Report 10": KH1LocationData("Reports", 265_7027), - #"Ansem's Report 11": KH1LocationData("Reports", 265_7026), - "Ansem's Report 12": KH1LocationData("Reports", 265_7025), - "Ansem's Report 13": KH1LocationData("Reports", 265_7024), + "Agrabah Defeat Jafar Genie Ansem's Report 1": KH1LocationData("Reports", 265_7018), + "Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Reports", 265_7017), + "Atlantica Defeat Ursula II Ansem's Report 3": KH1LocationData("Reports", 265_7016), + "Hollow Bastion Speak with Aerith Ansem's Report 4": KH1LocationData("Reports", 265_7015), + "Hollow Bastion Defeat Maleficent Ansem's Report 5": KH1LocationData("Reports", 265_7014), + "Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Reports", 265_7013), + "Halloween Town Defeat Oogie Boogie Ansem's Report 7": KH1LocationData("Reports", 265_7012), + "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Reports", 265_7011), + "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Reports", 265_7028), + "Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Reports", 265_7027), + #"Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Reports", 265_7026), + "Olympus Coliseum Defeat Sephiroth Ansem's Report 12": KH1LocationData("Reports", 265_7025), + "Hollow Bastion Defeat Unknown Ansem's Report 13": KH1LocationData("Reports", 265_7024), "Level 001": KH1LocationData("Levels", 265_8001), "Level 002": KH1LocationData("Levels", 265_8002), "Level 003": KH1LocationData("Levels", 265_8003), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index aa2b25a03522..96cb2bacf021 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -262,46 +262,46 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Monstro"].locations.append("Monstro Chamber 6 White Trinity Chest"), #regions["Awakening"].locations.append("Awakening Chest"), missable - regions["Traverse Town"].locations.append("Traverse Town Dodge Roll Event"), - regions["Traverse Town"].locations.append("Traverse Town Fire Event"), - regions["Traverse Town"].locations.append("Traverse Town Blue Trinity Event"), - regions["Traverse Town"].locations.append("Traverse Town Earthshine Event"), - regions["Traverse Town"].locations.append("Traverse Town Oathkeeper Event"), - regions["Deep Jungle"].locations.append("Deep Jungle White Fang Event"), - regions["Deep Jungle"].locations.append("Deep Jungle Cure Event"), - regions["Deep Jungle"].locations.append("Deep Jungle Jungle King Event"), - regions["Deep Jungle"].locations.append("Deep Jungle Red Trinity Event"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Thunder Event"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Sonic Blade Event"), - regions["Wonderland"].locations.append("Wonderland Blizzard Event"), - regions["Wonderland"].locations.append("Wonderland Ifrit's Horn Event"), - regions["Agrabah"].locations.append("Agrabah Ray of Light Event"), - regions["Agrabah"].locations.append("Agrabah Blizzard Event"), - regions["Agrabah"].locations.append("Agrabah Fire Event"), - regions["Agrabah"].locations.append("Agrabah Genie Event"), - regions["Agrabah"].locations.append("Agrabah Three Wishes Event"), - regions["Agrabah"].locations.append("Agrabah Green Trinity Event"), - regions["Monstro"].locations.append("Monstro Goofy Cheer Event"), - regions["Monstro"].locations.append("Monstro Stop Event"), + 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 Guard Armor Blue Trinity Event"), + regions["Traverse Town"].locations.append("Traverse Town Leon Secret Waterway Earthshine Event"), + regions["Traverse Town"].locations.append("Traverse Town Kairi Secret Waterway Oathkeeper Event"), + regions["Deep Jungle"].locations.append("Deep Jungle Defeat Sabor White Fang Event"), + regions["Deep Jungle"].locations.append("Deep Jungle Defeat Clayton Cure Event"), + 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["Olympus Coliseum"].locations.append("Olympus Coliseum Clear Phil's Training Thunder Event"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Cloud Sonic Blade Event"), + regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Blizzard Event"), + regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Ifrit's Horn Event"), + regions["Agrabah"].locations.append("Agrabah Defeat Pot Centipede Ray of Light Event"), + regions["Agrabah"].locations.append("Agrabah Defeat Jafar Blizzard Event"), + regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Fire Event"), + regions["Agrabah"].locations.append("Agrabah Seal Keyhole Genie Event"), + regions["Agrabah"].locations.append("Agrabah Seal Keyhole Three Wishes Event"), + regions["Agrabah"].locations.append("Agrabah Seal Keyhole Green Trinity Event"), + regions["Monstro"].locations.append("Monstro Defeat Parasite Cage I Goofy Cheer Event"), + regions["Monstro"].locations.append("Monstro Defeat Parasite Cage II Stop Event"), if atlantica or goal == "atlantica": - regions["Atlantica"].locations.append("Atlantica Mermaid Kick Event") - regions["Atlantica"].locations.append("Atlantica Thunder Event") - regions["Atlantica"].locations.append("Atlantica Crabclaw Event") - regions["Halloween Town"].locations.append("Halloween Town Holy Circlet Event") - regions["Halloween Town"].locations.append("Halloween Town Gravity Event") - regions["Halloween Town"].locations.append("Halloween Town Pumpkinhead Event") - regions["Neverland"].locations.append("Neverland Raven's Claw Event") - regions["Neverland"].locations.append("Neverland Cure Event") - regions["Neverland"].locations.append("Neverland Fairy Harp Event") - regions["Neverland"].locations.append("Neverland Tinker Bell Event") - regions["Neverland"].locations.append("Neverland Glide Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion White Trinity Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Donald Cheer Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Fireglow Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Ragnarok Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Omega Arts Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Fire Event") - regions["End of the World"].locations.append("End of the World Superglide Event") + regions["Atlantica"].locations.append("Atlantica Defeat Ursula I Mermaid Kick Event") + regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Thunder Event") + regions["Atlantica"].locations.append("Atlantica Seal Keyhole Crabclaw Event") + regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie Boogie Holy Circlet Event") + regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie's Manor Gravity Event") + regions["Halloween Town"].locations.append("Halloween Town Seal Keyhole Pumpkinhead Event") + regions["Neverland"].locations.append("Neverland Defeat Anti Sora Raven's Claw Event") + regions["Neverland"].locations.append("Neverland Encounter Hook Cure Event") + regions["Neverland"].locations.append("Neverland Seal Keyhole Fairy Harp Event") + regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event") + regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Donald Cheer Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Dragon Maleficent Fireglow Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku II Ragnarok Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Behemoth Omega Arts Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak to Princesses Fire Event") + regions["End of the World"].locations.append("End of the World Defeat Chernabog Superglide Event") regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 01 Event") regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 02 Event") @@ -314,7 +314,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 09 Event") regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 10 Event") - regions["Traverse Town"].locations.append("Traverse Town Aero Event") + regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Aero Event") if atlantica or goal == "atlantica": regions["Atlantica"].locations.append("Atlantica Undersea Gorge Blizzard Clam") @@ -334,22 +334,22 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Atlantica"].locations.append("Atlantica Undersea Garden Clam") regions["Atlantica"].locations.append("Atlantica Undersea Cave Clam") - regions["Agrabah"].locations.append("Ansem's Report 1") - regions["Hollow Bastion"].locations.append("Ansem's Report 2") + regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Ansem's Report 1") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 2") if atlantica or goal == "atlantica": - regions["Atlantica"].locations.append("Ansem's Report 3") - regions["Hollow Bastion"].locations.append("Ansem's Report 4") - regions["Hollow Bastion"].locations.append("Ansem's Report 5") - regions["Hollow Bastion"].locations.append("Ansem's Report 6") - regions["Halloween Town"].locations.append("Ansem's Report 7") - regions["Olympus Coliseum"].locations.append("Ansem's Report 8") - regions["Neverland"].locations.append("Ansem's Report 9") - regions["Hollow Bastion"].locations.append("Ansem's Report 10") - #regions["Agrabah"].locations.append("Ansem's Report 11") + regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Ansem's Report 3") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 4") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Ansem's Report 5") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 6") + regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie Boogie Ansem's Report 7") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") + regions["Neverland"].locations.append("Neverland Defeat Hook Ansem's Report 9") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") + #regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") if goal == "sephiroth": - regions["Olympus Coliseum"].locations.append("Ansem's Report 12") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") if goal == "unknown": - regions["Hollow Bastion"].locations.append("Ansem's Report 13") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") for i in range(levels): regions["Levels"].locations.append("Level " + str(i+1).rjust(3,'0')) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index a8fa9c9ea2c7..9460ee575b83 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -126,11 +126,11 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Agrabah Storage Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Agrabah Storage Behind Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Entrance Left Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + multiworld.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest" , player).access_rule = lambda state: can_glide(state, player) #multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: can_glide(state, player) + multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -148,9 +148,9 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Agrabah Aladdin's House Main Street Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Aladdin's House Plaza Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Monstro Chamber 6 Other Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - #multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + multiworld.get_location("Monstro Chamber 6 Other Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: has_item(state, player, "") if atlantica or goal == "atlantica": #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -193,13 +193,13 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: (has_item(state, player, "High Jump") or can_glide(state, player)) and has_item(state, player, "Green Trinity") #multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 2 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Monstro Chamber 3 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Monstro Chamber 5 Low 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Chamber 5 Low 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Neverland Pirate Ship Deck White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Green Trinity") @@ -279,46 +279,46 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Dodge Roll Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Fire Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Blue Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Earthshine Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Oathkeeper Event" , player).access_rule = lambda state: has_emblems(state, player) and has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) - multiworld.get_location("Deep Jungle White Fang Event" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Cure Event" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Jungle King Event" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Red Trinity Event" , player).access_rule = lambda state: has_slides(state, player) - #multiworld.get_location("Olympus Coliseum Thunder Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Olympus Coliseum Sonic Blade Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Wonderland Blizzard Event" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Ifrit's Horn Event" , player).access_rule = lambda state: has_evidence(state, player) - #multiworld.get_location("Agrabah Ray of Light Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Blizzard Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Fire Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Genie Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Three Wishes Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Green Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Monstro Goofy Cheer Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Stop Event" , player).access_rule = lambda state: has_item(state, player, "High Jump") + #multiworld.get_location("Traverse Town Defeat Guard Armor Dodge Roll Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Defeat Guard Armor Fire Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Defeat Guard Armor Blue Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town Leon Secret Waterway Earthshine Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event" , player).access_rule = lambda state: has_emblems(state, player) and has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) + multiworld.get_location("Deep Jungle Defeat Sabor White Fang Event" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Defeat Clayton Cure Event" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Seal Keyhole Jungle King Event" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Seal Keyhole Red Trinity Event" , player).access_rule = lambda state: has_slides(state, player) + #multiworld.get_location("Olympus Coliseum Clear Phil's Training Thunder Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Olympus Coliseum Cloud Sonic Blade Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Wonderland Defeat Trickmaster Blizzard Event" , player).access_rule = lambda state: has_evidence(state, player) + multiworld.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event" , player).access_rule = lambda state: has_evidence(state, player) + #multiworld.get_location("Agrabah Defeat Pot Centipede Ray of Light Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Defeat Jafar Blizzard Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Defeat Jafar Genie Fire Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Seal Keyhole Genie Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Seal Keyhole Three Wishes Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Agrabah Seal Keyhole Green Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Monstro Defeat Parasite Cage I Goofy Cheer Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Monstro Defeat Parasite Cage II Stop Event" , player).access_rule = lambda state: has_item(state, player, "High Jump") if atlantica or goal == "atlantica": - multiworld.get_location("Atlantica Mermaid Kick Event" , player).access_rule = lambda state: has_offensive_magic(state, player) - multiworld.get_location("Atlantica Thunder Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) - multiworld.get_location("Atlantica Crabclaw Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) - multiworld.get_location("Halloween Town Holy Circlet Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Gravity Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Pumpkinhead Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Neverland Raven's Claw Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Cure Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Fairy Harp Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Hollow Bastion White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Donald Cheer Event" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Fireglow Event" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Ragnarok Event" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Omega Arts Event" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Fire Event" , player).access_rule = lambda state: has_emblems(state, player) - #multiworld.get_location("End of the World Superglide Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Defeat Ursula I Mermaid Kick Event" , player).access_rule = lambda state: has_offensive_magic(state, player) + multiworld.get_location("Atlantica Defeat Ursula II Thunder Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) + multiworld.get_location("Atlantica Seal Keyhole Crabclaw Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) + multiworld.get_location("Halloween Town Defeat Oogie Boogie Holy Circlet Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Defeat Oogie's Manor Gravity Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Halloween Town Seal Keyhole Pumpkinhead Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Neverland Defeat Anti Sora Raven's Claw Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Encounter Hook Cure Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Seal Keyhole Fairy Harp Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Defeat Riku II Ragnarok Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Defeat Behemoth Omega Arts Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Speak to Princesses Fire Event" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("End of the World Defeat Chernabog Superglide Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Traverse Town Mail Postcard 01 Event" , player).access_rule = lambda state: has_postcards(state, player, 1) multiworld.get_location("Traverse Town Mail Postcard 02 Event" , player).access_rule = lambda state: has_postcards(state, player, 2) @@ -331,7 +331,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Traverse Town Mail Postcard 09 Event" , player).access_rule = lambda state: has_postcards(state, player, 9) multiworld.get_location("Traverse Town Mail Postcard 10 Event" , player).access_rule = lambda state: has_postcards(state, player, 10) - multiworld.get_location("Traverse Town Aero Event" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") + multiworld.get_location("Traverse Town Defeat Opposite Armor Aero Event" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") if atlantica or goal == "atlantica": multiworld.get_location("Atlantica Undersea Gorge Blizzard Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") @@ -351,22 +351,22 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Atlantica Undersea Garden Clam" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Undersea Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Ansem's Report 1" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Ansem's Report 2" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("Agrabah Defeat Jafar Genie Ansem's Report 1" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: has_emblems(state, player) if atlantica or goal == "atlantica": - multiworld.get_location("Ansem's Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) - multiworld.get_location("Ansem's Report 4" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Ansem's Report 5" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Ansem's Report 6" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Ansem's Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Ansem's Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) - #multiworld.get_location("Ansem's Report 11" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) + multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_item(state, player, "") if goal == "sephiroth": - multiworld.get_location("Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") if goal == "unknown": - multiworld.get_location("Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") @@ -377,14 +377,14 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") - multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") From d373f2881a6a1e5decc55015acc59b17441ed722 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 17 Feb 2024 15:23:28 -0600 Subject: [PATCH 078/284] Removed Aerith locations --- worlds/kh1/Locations.py | 9 +++++---- worlds/kh1/Regions.py | 11 ++++++----- worlds/kh1/Rules.py | 11 ++++++----- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 5aeb9e027277..a9464a6e1c10 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -159,6 +159,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Olympus Coliseum Coliseum Gates Left Blue Trinity Chest": KH1LocationData("Chests", 265_3334), "Olympus Coliseum Coliseum Gates White Trinity Chest": KH1LocationData("Chests", 265_3371), "Olympus Coliseum Coliseum Gates Blizzara Chest": KH1LocationData("Chests", 265_3372), + "Olympus Coliseum Coliseum Gates Blizzaga Chest": KH1LocationData("Chests", 265_3373), "Monstro Mouth Boat Deck Chest": KH1LocationData("Chests", 265_3454), "Monstro Mouth High Platform Boat Side Chest": KH1LocationData("Chests", 265_3491), "Monstro Mouth High Platform Across from Boat Chest": KH1LocationData("Chests", 265_3492), @@ -323,15 +324,15 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Atlantica Undersea Cave Clam": KH1LocationData("Clam", 265_6216), "Agrabah Defeat Jafar Genie Ansem's Report 1": KH1LocationData("Reports", 265_7018), - "Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Reports", 265_7017), + #"Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Reports", 265_7017), "Atlantica Defeat Ursula II Ansem's Report 3": KH1LocationData("Reports", 265_7016), - "Hollow Bastion Speak with Aerith Ansem's Report 4": KH1LocationData("Reports", 265_7015), + #"Hollow Bastion Speak with Aerith Ansem's Report 4": KH1LocationData("Reports", 265_7015), "Hollow Bastion Defeat Maleficent Ansem's Report 5": KH1LocationData("Reports", 265_7014), - "Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Reports", 265_7013), + #"Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Reports", 265_7013), "Halloween Town Defeat Oogie Boogie Ansem's Report 7": KH1LocationData("Reports", 265_7012), "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Reports", 265_7011), "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Reports", 265_7028), - "Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Reports", 265_7027), + #"Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Reports", 265_7027), #"Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Reports", 265_7026), "Olympus Coliseum Defeat Sephiroth Ansem's Report 12": KH1LocationData("Reports", 265_7025), "Hollow Bastion Defeat Unknown Ansem's Report 13": KH1LocationData("Reports", 265_7024), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 96cb2bacf021..ca6079f777b8 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -168,7 +168,8 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest"), regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest"), regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates White Trinity Chest"), - #regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Blizzara Chest"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Blizzara Chest"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Blizzaga Chest"), regions["Monstro"].locations.append("Monstro Mouth Boat Deck Chest"), regions["Monstro"].locations.append("Monstro Mouth High Platform Boat Side Chest"), regions["Monstro"].locations.append("Monstro Mouth High Platform Across from Boat Chest"), @@ -335,16 +336,16 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Atlantica"].locations.append("Atlantica Undersea Cave Clam") regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Ansem's Report 1") - regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 2") + #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 2") if atlantica or goal == "atlantica": regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Ansem's Report 3") - regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 4") + #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 4") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Ansem's Report 5") - regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 6") + #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 6") regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie Boogie Ansem's Report 7") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") regions["Neverland"].locations.append("Neverland Defeat Hook Ansem's Report 9") - regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") + #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") #regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") if goal == "sephiroth": regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 9460ee575b83..3f45cc9a346a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -185,7 +185,8 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") multiworld.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") multiworld.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - #multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: has_at_least(state, player, "Progressive Blizzard", 2) + multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: has_at_least(state, player, "Progressive Blizzard", 2) + multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzaga Chest" , player).access_rule = lambda state: has_at_least(state, player, "Progressive Blizzard", 3) #multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) @@ -352,16 +353,16 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Atlantica Undersea Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Defeat Jafar Genie Ansem's Report 1" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: has_emblems(state, player) if atlantica or goal == "atlantica": multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) - multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) #multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_item(state, player, "") if goal == "sephiroth": multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") From 562f72a99f1d7a9c4662a096360b6f5ff348369d Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 17 Feb 2024 20:20:16 -0600 Subject: [PATCH 079/284] Change to allow randomized keyblade stats --- worlds/kh1/Client.py | 5 +++++ worlds/kh1/Items.py | 2 +- worlds/kh1/Options.py | 47 ++++++++++++++++++++++++++++++++++++++++++ worlds/kh1/__init__.py | 9 ++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 8cdfad1c4490..c84dd087cbe0 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -114,6 +114,11 @@ def on_package(self, cmd: str, args: dict): with open(os.path.join(self.game_communication_path, "required_reports.cfg"), 'w') as f: f.write(str(reports_required)) f.close() + if "Keyblade Stats" in list(args['slot_data'].keys()): + keyblade_stats = args['slot_data']["Keyblade Stats"] + with open(os.path.join(self.game_communication_path, "keyblade_stats.cfg"), 'w') as f: + f.write(str(keyblade_stats)) + f.close() #End Handle Slot Data if cmd in {"ReceivedItems"}: diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index e4fbeac4293a..38e05a52d6a4 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -111,7 +111,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.useful, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 90dc72c8e3f5..2e5cfcf5a907 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -120,6 +120,48 @@ class ReportsInPool(Range): range_start = 1 range_end = 13 +class RandomizeKeybladeStats(DefaultOnToggle): + """ + Determines whether Keyblade stats should be randomized + """ + display_name = "Randomize Keyblade Stats" + +class KeybladeMinStrength(Range): + """ + Determines the lowest STR bonus a keyblade can have + """ + display_name = "Keyblade Minimum STR Bonus" + default = 3 + range_start = 1 + range_end = 19 + +class KeybladeMaxStrength(Range): + """ + Determines the maximum STR bonus a keyblade can have + """ + display_name = "Keyblade Maximum STR Bonus" + default = 14 + range_start = 2 + range_end = 20 + +class KeybladeMinMP(Range): + """ + Determines the minimum MP bonus a keyblade can have + """ + display_name = "Keyblade Maximum MP Bonus" + default = 0 + range_start = 0 + range_end = 4 + +class KeybladeMaxMP(Range): + """ + Determines the minimum MP bonus a keyblade can have + """ + display_name = "Keyblade Maximum MP Bonus" + default = 3 + range_start = 1 + range_end = 5 + @dataclass class KH1Options(PerGameCommonOptions): goal: Goal @@ -134,3 +176,8 @@ class KH1Options(PerGameCommonOptions): exp_multiplier: EXPMultiplier required_reports: RequiredReports reports_in_pool: ReportsInPool + randomize_keyblade_stats: RandomizeKeybladeStats + keyblade_max_str: KeybladeMaxStrength + keyblade_min_str: KeybladeMinStrength + keyblade_max_mp: KeybladeMaxMP + keyblade_min_mp: KeybladeMinMP diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 0c5386ae3ed6..53505466366a 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -145,6 +145,15 @@ def get_filler_item_name(self) -> str: def fill_slot_data(self) -> dict: slot_data = {"EXP Multiplier": int(self.options.exp_multiplier)/16 ,"Required Reports": min(int(self.options.required_reports), int(self.options.reports_in_pool))} + if self.options.randomize_keyblade_stats: + min_str_bonus = min(self.options.keyblade_min_str, self.options.keyblade_max_str) + max_str_bonus = max(self.options.keyblade_min_str, self.options.keyblade_max_str) + min_mp_bonus = min(self.options.keyblade_min_mp, self.options.keyblade_max_mp) + max_mp_bonus = max(self.options.keyblade_min_mp, self.options.keyblade_max_mp) + slot_data["Keyblade Stats"] = "" + for i in range(22): + slot_data["Keyblade Stats"] = slot_data["Keyblade Stats"] + str(int(self.random.randrange(min_str_bonus,max_str_bonus))) + "," + str(int(self.random.randrange(min_mp_bonus,max_mp_bonus))) + "," + slot_data["Keyblade Stats"] = slot_data["Keyblade Stats"][:-1] return slot_data def create_item(self, name: str) -> KH1Item: From 2bc4b0373db66fc142c2aec36949cc39b2e2d201 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 27 Feb 2024 19:36:15 -0600 Subject: [PATCH 080/284] Fixed incorrect option description. Fixed victory locations for alternative win condition settings --- worlds/kh1/Options.py | 4 ++-- worlds/kh1/__init__.py | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 2e5cfcf5a907..cb2f165b635b 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -52,7 +52,7 @@ class AccessorySlotIncrease(Range): class ItemSlotIncrease(Range): """ - Number of Accessory Slot Increases to Add to the Level Up Rewards + Number of Item Slot Increases to Add to the Level Up Rewards """ range_start = 0 range_end = 5 @@ -66,7 +66,7 @@ class Atlantica(Toggle): class Goal(Choice): """ - Determines the goal of your run. + Determines the goal of your playthrough. """ display_name = "Goal" option_final_rest = 0 diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 53505466366a..b2bf76ec9b69 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -118,15 +118,15 @@ def create_items(self): def pre_fill(self) -> None: goal_dict = { - "sephiroth": "Ansem's Report 12", - "wonderland": "Wonderland Ifrit's Horn Event", - "deep_jungle": "Deep Jungle Jungle King Event", - "agrabah": "Agrabah Genie Event", - "monstro": "Monstro Stop Event", - "atlantica": "Atlantica Crabclaw Event", - "halloween_town": "Halloween Town Pumpkinhead Event", - "neverland": "Neverland Fairy Harp Event", - "unknown": "Ansem's Report 13", + "sephiroth": "Olympus Coliseum Defeat Sephiroth Ansem's Report 12", + "wonderland": "Wonderland Defeat Trickmaster Ifrit's Horn Event", + "deep_jungle": "Deep Jungle Seal Keyhole Jungle King Event", + "agrabah": "Agrabah Seal Keyhole Genie Event", + "monstro": "Monstro Defeat Parasite Cage II Stop Event", + "atlantica": "Atlantica Seal Keyhole Crabclaw Event", + "halloween_town": "Halloween Town Seal Keyhole Pumpkinhead Event", + "neverland": "Neverland Seal Keyhole Fairy Harp Event", + "unknown": "Hollow Bastion Defeat Unknown Ansem's Report 13", "final_rest": "End of the World Final Rest Chest", "postcards": "Traverse Town Mail Postcard 10 Event", "final_ansem": "Final Ansem" From 02ee3482db03d1c7a1d270900be51ed35622d3eb Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 22 Mar 2024 22:23:55 -0500 Subject: [PATCH 081/284] Commit --- worlds/kh1/Items.py | 177 ++++++++++++++++++++++++++++++----- worlds/kh1/Locations.py | 132 +++++++++++++++++++++----- worlds/kh1/Options.py | 50 +++++++--- worlds/kh1/Regions.py | 154 +++++++++++++++++++++++------- worlds/kh1/Rules.py | 166 +++++++++++++++++++++++++++----- worlds/kh1/__init__.py | 73 ++++++++++----- worlds/kh1/test/test_goal.py | 42 ++------- 7 files changed, 617 insertions(+), 177 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 38e05a52d6a4..2711989e8a09 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -184,13 +184,13 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Serenity Power": KH1ItemData("Synthesis", code = 264_1155, classification = ItemClassification.filler, weight = 10), #"Dark Matter": KH1ItemData("Synthesis", code = 264_1156, classification = ItemClassification.filler, weight = 10), #"Mythril Stone": KH1ItemData("Synthesis", code = 264_1157, classification = ItemClassification.filler, weight = 10), - #"Fire Arts": KH1ItemData("Synthesis", code = 264_1158, classification = ItemClassification.filler, weight = 10), - #"Blizzard Arts": KH1ItemData("Synthesis", code = 264_1159, classification = ItemClassification.filler, weight = 10), - #"Thunder Arts": KH1ItemData("Synthesis", code = 264_1160, classification = ItemClassification.filler, weight = 10), - #"Cure Arts": KH1ItemData("Synthesis", code = 264_1161, classification = ItemClassification.filler, weight = 10), - #"Gravity Arts": KH1ItemData("Synthesis", code = 264_1162, classification = ItemClassification.filler, weight = 10), - #"Stop Arts": KH1ItemData("Synthesis", code = 264_1163, classification = ItemClassification.filler, weight = 10), - #"Aero Arts": KH1ItemData("Synthesis", code = 264_1164, classification = ItemClassification.filler, weight = 10), + "Fire Arts": KH1ItemData("Key", code = 264_1158, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Blizzard Arts": KH1ItemData("Key", code = 264_1159, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Thunder Arts": KH1ItemData("Key", code = 264_1160, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Cure Arts": KH1ItemData("Key", code = 264_1161, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Gravity Arts": KH1ItemData("Key", code = 264_1162, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Stop Arts": KH1ItemData("Key", code = 264_1163, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Aero Arts": KH1ItemData("Key", code = 264_1164, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Shiitank Rank": KH1ItemData("Synthesis", code = 264_1165, classification = ItemClassification.filler, weight = 10), #"Matsutake Rank": KH1ItemData("Synthesis", code = 264_1166, classification = ItemClassification.filler, weight = 10), #"Mystery Mold": KH1ItemData("Synthesis", code = 264_1167, classification = ItemClassification.filler, weight = 10), @@ -212,8 +212,8 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Material": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 6, weight = 10), + "Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -232,17 +232,17 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 3, weight = 10), - #"Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Torn Page 2": KH1ItemData("Key", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 2": KH1ItemData("Key", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 3": KH1ItemData("Key", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 4": KH1ItemData("Key", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Slide 1": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -286,6 +286,139 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Mermaid Kick": KH1ItemData("Atlantica" , code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 01": KH1ItemData("Puppies IND", code = 264_2101, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 02": KH1ItemData("Puppies IND", code = 264_2102, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 03": KH1ItemData("Puppies IND", code = 264_2103, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 04": KH1ItemData("Puppies IND", code = 264_2104, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 05": KH1ItemData("Puppies IND", code = 264_2105, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 06": KH1ItemData("Puppies IND", code = 264_2106, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 07": KH1ItemData("Puppies IND", code = 264_2107, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 08": KH1ItemData("Puppies IND", code = 264_2108, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 09": KH1ItemData("Puppies IND", code = 264_2109, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 10": KH1ItemData("Puppies IND", code = 264_2110, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 11": KH1ItemData("Puppies IND", code = 264_2111, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 12": KH1ItemData("Puppies IND", code = 264_2112, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 13": KH1ItemData("Puppies IND", code = 264_2113, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 14": KH1ItemData("Puppies IND", code = 264_2114, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 15": KH1ItemData("Puppies IND", code = 264_2115, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 16": KH1ItemData("Puppies IND", code = 264_2116, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 17": KH1ItemData("Puppies IND", code = 264_2117, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 18": KH1ItemData("Puppies IND", code = 264_2118, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 19": KH1ItemData("Puppies IND", code = 264_2119, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 20": KH1ItemData("Puppies IND", code = 264_2120, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 21": KH1ItemData("Puppies IND", code = 264_2121, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 22": KH1ItemData("Puppies IND", code = 264_2122, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 23": KH1ItemData("Puppies IND", code = 264_2123, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 24": KH1ItemData("Puppies IND", code = 264_2124, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 25": KH1ItemData("Puppies IND", code = 264_2125, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 26": KH1ItemData("Puppies IND", code = 264_2126, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 27": KH1ItemData("Puppies IND", code = 264_2127, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 28": KH1ItemData("Puppies IND", code = 264_2128, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 29": KH1ItemData("Puppies IND", code = 264_2129, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 30": KH1ItemData("Puppies IND", code = 264_2130, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 31": KH1ItemData("Puppies IND", code = 264_2131, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 32": KH1ItemData("Puppies IND", code = 264_2132, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 33": KH1ItemData("Puppies IND", code = 264_2133, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 34": KH1ItemData("Puppies IND", code = 264_2134, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 35": KH1ItemData("Puppies IND", code = 264_2135, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 36": KH1ItemData("Puppies IND", code = 264_2136, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 37": KH1ItemData("Puppies IND", code = 264_2137, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 38": KH1ItemData("Puppies IND", code = 264_2138, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 39": KH1ItemData("Puppies IND", code = 264_2139, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 40": KH1ItemData("Puppies IND", code = 264_2140, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 41": KH1ItemData("Puppies IND", code = 264_2141, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 42": KH1ItemData("Puppies IND", code = 264_2142, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 43": KH1ItemData("Puppies IND", code = 264_2143, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 44": KH1ItemData("Puppies IND", code = 264_2144, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 45": KH1ItemData("Puppies IND", code = 264_2145, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 46": KH1ItemData("Puppies IND", code = 264_2146, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 47": KH1ItemData("Puppies IND", code = 264_2147, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 48": KH1ItemData("Puppies IND", code = 264_2148, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 49": KH1ItemData("Puppies IND", code = 264_2149, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 50": KH1ItemData("Puppies IND", code = 264_2150, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 51": KH1ItemData("Puppies IND", code = 264_2151, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 52": KH1ItemData("Puppies IND", code = 264_2152, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 53": KH1ItemData("Puppies IND", code = 264_2153, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 54": KH1ItemData("Puppies IND", code = 264_2154, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 55": KH1ItemData("Puppies IND", code = 264_2155, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 56": KH1ItemData("Puppies IND", code = 264_2156, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 57": KH1ItemData("Puppies IND", code = 264_2157, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 58": KH1ItemData("Puppies IND", code = 264_2158, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 59": KH1ItemData("Puppies IND", code = 264_2159, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 60": KH1ItemData("Puppies IND", code = 264_2160, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 61": KH1ItemData("Puppies IND", code = 264_2161, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 62": KH1ItemData("Puppies IND", code = 264_2162, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 63": KH1ItemData("Puppies IND", code = 264_2163, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 64": KH1ItemData("Puppies IND", code = 264_2164, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 65": KH1ItemData("Puppies IND", code = 264_2165, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 66": KH1ItemData("Puppies IND", code = 264_2166, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 67": KH1ItemData("Puppies IND", code = 264_2167, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 68": KH1ItemData("Puppies IND", code = 264_2168, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 69": KH1ItemData("Puppies IND", code = 264_2169, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 70": KH1ItemData("Puppies IND", code = 264_2170, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 71": KH1ItemData("Puppies IND", code = 264_2171, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 72": KH1ItemData("Puppies IND", code = 264_2172, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 73": KH1ItemData("Puppies IND", code = 264_2173, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 74": KH1ItemData("Puppies IND", code = 264_2174, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 75": KH1ItemData("Puppies IND", code = 264_2175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 76": KH1ItemData("Puppies IND", code = 264_2176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 77": KH1ItemData("Puppies IND", code = 264_2177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 78": KH1ItemData("Puppies IND", code = 264_2178, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 79": KH1ItemData("Puppies IND", code = 264_2179, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 80": KH1ItemData("Puppies IND", code = 264_2180, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 81": KH1ItemData("Puppies IND", code = 264_2181, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 82": KH1ItemData("Puppies IND", code = 264_2182, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 83": KH1ItemData("Puppies IND", code = 264_2183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 84": KH1ItemData("Puppies IND", code = 264_2184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 85": KH1ItemData("Puppies IND", code = 264_2185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 86": KH1ItemData("Puppies IND", code = 264_2186, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 87": KH1ItemData("Puppies IND", code = 264_2187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 88": KH1ItemData("Puppies IND", code = 264_2188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 89": KH1ItemData("Puppies IND", code = 264_2189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 90": KH1ItemData("Puppies IND", code = 264_2190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 91": KH1ItemData("Puppies IND", code = 264_2191, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 92": KH1ItemData("Puppies IND", code = 264_2192, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 93": KH1ItemData("Puppies IND", code = 264_2193, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 94": KH1ItemData("Puppies IND", code = 264_2194, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 95": KH1ItemData("Puppies IND", code = 264_2195, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 96": KH1ItemData("Puppies IND", code = 264_2196, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 97": KH1ItemData("Puppies IND", code = 264_2197, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 98": KH1ItemData("Puppies IND", code = 264_2198, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 99": KH1ItemData("Puppies IND", code = 264_2199, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 01-03": KH1ItemData("Puppies TRP", code = 264_2201, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 04-06": KH1ItemData("Puppies TRP", code = 264_2202, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 07-09": KH1ItemData("Puppies TRP", code = 264_2203, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 10-12": KH1ItemData("Puppies TRP", code = 264_2204, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 13-15": KH1ItemData("Puppies TRP", code = 264_2205, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 16-18": KH1ItemData("Puppies TRP", code = 264_2206, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 19-21": KH1ItemData("Puppies TRP", code = 264_2207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 22-24": KH1ItemData("Puppies TRP", code = 264_2208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 25-27": KH1ItemData("Puppies TRP", code = 264_2209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 27-30": KH1ItemData("Puppies TRP", code = 264_2210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 31-33": KH1ItemData("Puppies TRP", code = 264_2211, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 34-36": KH1ItemData("Puppies TRP", code = 264_2212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 37-39": KH1ItemData("Puppies TRP", code = 264_2213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 40-42": KH1ItemData("Puppies TRP", code = 264_2214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 43-45": KH1ItemData("Puppies TRP", code = 264_2215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 46-48": KH1ItemData("Puppies TRP", code = 264_2216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 49-51": KH1ItemData("Puppies TRP", code = 264_2217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 52-54": KH1ItemData("Puppies TRP", code = 264_2218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 55-57": KH1ItemData("Puppies TRP", code = 264_2219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 58-60": KH1ItemData("Puppies TRP", code = 264_2220, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 61-63": KH1ItemData("Puppies TRP", code = 264_2221, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 64-66": KH1ItemData("Puppies TRP", code = 264_2222, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 67-69": KH1ItemData("Puppies TRP", code = 264_2223, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 70-72": KH1ItemData("Puppies TRP", code = 264_2224, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 73-75": KH1ItemData("Puppies TRP", code = 264_2225, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 76-78": KH1ItemData("Puppies TRP", code = 264_2226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 79-81": KH1ItemData("Puppies TRP", code = 264_2227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 82-84": KH1ItemData("Puppies TRP", code = 264_2228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 85-87": KH1ItemData("Puppies TRP", code = 264_2229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 88-90": KH1ItemData("Puppies TRP", code = 264_2230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 91-93": KH1ItemData("Puppies TRP", code = 264_2231, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 94-96": KH1ItemData("Puppies TRP", code = 264_2232, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 97-99": KH1ItemData("Puppies TRP", code = 264_2233, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "All Puppies": KH1ItemData("Puppies ALL", code = 264_2240, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2, weight = 10), "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 4, weight = 10), "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 2, weight = 10), @@ -302,7 +435,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.useful, max_quantity = 2, weight = 10), @@ -354,12 +487,12 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Defense Increase": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Tinker Bell": KH1ItemData("Summons", code = 264_5003, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Mushu": KH1ItemData("Summons", code = 264_5004, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Simba": KH1ItemData("Summons", code = 264_5005, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Tinker Bell": KH1ItemData("Summons", code = 264_5003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Mushu": KH1ItemData("Summons", code = 264_5004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Simba": KH1ItemData("Summons", code = 264_5005, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Progressive Fire": KH1ItemData("Magic", code = 264_6001, classification = ItemClassification.progression, max_quantity = 3, weight = 10), "Progressive Blizzard": KH1ItemData("Magic", code = 264_6002, classification = ItemClassification.progression, max_quantity = 3, weight = 10), "Progressive Thunder": KH1ItemData("Magic", code = 264_6003, classification = ItemClassification.progression, max_quantity = 3, weight = 10), diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index a9464a6e1c10..73950af0825c 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -84,7 +84,10 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Cliff Right Cliff Left Chest": KH1LocationData("Chests", 265_1411), "Deep Jungle Cliff Right Cliff Right Chest": KH1LocationData("Chests", 265_1412), "Deep Jungle Tree House Suspended Boat Chest": KH1LocationData("Chests", 265_1413), - #"100 Acre Wood Meadow Inside Log Chest": KH1LocationData("Chests", 265_1654), 100 Acre Wood + "100 Acre Wood Meadow Inside Log Chest": KH1LocationData("Chests", 265_1654), + "100 Acre Wood Bouncing Spot Left Cliff Chest": KH1LocationData("Chests", 265_1691), + "100 Acre Wood Bouncing Spot Right Tree Alcove Chest": KH1LocationData("Chests", 265_1692), + "100 Acre Wood Bouncing Spot Under Giant Pot Chest": KH1LocationData("Chests", 265_1693), "Agrabah Plaza By Storage Chest": KH1LocationData("Chests", 265_1972), "Agrabah Plaza Raised Terrace Chest": KH1LocationData("Chests", 265_1973), "Agrabah Plaza Top Corner Chest": KH1LocationData("Chests", 265_1974), @@ -222,31 +225,31 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Hollow Bastion Grand Hall Steps Right Side Chest": KH1LocationData("Chests", 265_4454), "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Chests", 265_4491), "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Chests", 265_4492), - #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Chests", 265_4493), + #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Chests", 265_4493), give vanilla reward "Hollow Bastion Entrance Hall Left of Emblem Door Chest": KH1LocationData("Chests", 265_4212), "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Chests", 265_4494), - #"End of the World Final Dimension 1st Chest": KH1LocationData("Chests", 265_4531), - #"End of the World Final Dimension 2nd Chest": KH1LocationData("Chests", 265_4532), - #"End of the World Final Dimension 3rd Chest": KH1LocationData("Chests", 265_4533), - #"End of the World Final Dimension 4th Chest": KH1LocationData("Chests", 265_4534), - #"End of the World Final Dimension 5th Chest": KH1LocationData("Chests", 265_4571), - #"End of the World Final Dimension 6th Chest": KH1LocationData("Chests", 265_4572), - #"End of the World Final Dimension 10th Chest": KH1LocationData("Chests", 265_4573), - #"End of the World Final Dimension 9th Chest": KH1LocationData("Chests", 265_4574), - #"End of the World Final Dimension 8th Chest": KH1LocationData("Chests", 265_4611), - #"End of the World Final Dimension 7th Chest": KH1LocationData("Chests", 265_4612), - #"End of the World Giant Crevasse 3rd Chest": KH1LocationData("Chests", 265_4613), - #"End of the World Giant Crevasse 1st Chest": KH1LocationData("Chests", 265_4651), - #"End of the World Giant Crevasse 4th Chest": KH1LocationData("Chests", 265_4652), - #"End of the World Giant Crevasse 2nd Chest": KH1LocationData("Chests", 265_4653), - #"End of the World World Terminus Traverse Town Chest": KH1LocationData("Chests", 265_4654), - #"End of the World World Terminus Wonderland Chest": KH1LocationData("Chests", 265_4691), - #"End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("Chests", 265_4692), - #"End of the World World Terminus Deep Jungle Chest": KH1LocationData("Chests", 265_4693), - #"End of the World World Terminus Agrabah Chest": KH1LocationData("Chests", 265_4694), - #"End of the World World Terminus Atlantica Chest": KH1LocationData("Chests", 265_4731), - #"End of the World World Terminus Halloween Town Chest": KH1LocationData("Chests", 265_4732), - #"End of the World World Terminus Neverland Chest": KH1LocationData("Chests", 265_4733), + "End of the World Final Dimension 1st Chest": KH1LocationData("Chests", 265_4531), + "End of the World Final Dimension 2nd Chest": KH1LocationData("Chests", 265_4532), + "End of the World Final Dimension 3rd Chest": KH1LocationData("Chests", 265_4533), + "End of the World Final Dimension 4th Chest": KH1LocationData("Chests", 265_4534), + "End of the World Final Dimension 5th Chest": KH1LocationData("Chests", 265_4571), + "End of the World Final Dimension 6th Chest": KH1LocationData("Chests", 265_4572), + "End of the World Final Dimension 10th Chest": KH1LocationData("Chests", 265_4573), + "End of the World Final Dimension 9th Chest": KH1LocationData("Chests", 265_4574), + "End of the World Final Dimension 8th Chest": KH1LocationData("Chests", 265_4611), + "End of the World Final Dimension 7th Chest": KH1LocationData("Chests", 265_4612), + "End of the World Giant Crevasse 3rd Chest": KH1LocationData("Chests", 265_4613), + "End of the World Giant Crevasse 1st Chest": KH1LocationData("Chests", 265_4651), + "End of the World Giant Crevasse 4th Chest": KH1LocationData("Chests", 265_4652), + "End of the World Giant Crevasse 2nd Chest": KH1LocationData("Chests", 265_4653), + "End of the World World Terminus Traverse Town Chest": KH1LocationData("Chests", 265_4654), + "End of the World World Terminus Wonderland Chest": KH1LocationData("Chests", 265_4691), + "End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("Chests", 265_4692), + "End of the World World Terminus Deep Jungle Chest": KH1LocationData("Chests", 265_4693), + "End of the World World Terminus Agrabah Chest": KH1LocationData("Chests", 265_4694), + "End of the World World Terminus Atlantica Chest": KH1LocationData("Chests", 265_4731), + "End of the World World Terminus Halloween Town Chest": KH1LocationData("Chests", 265_4732), + "End of the World World Terminus Neverland Chest": KH1LocationData("Chests", 265_4733), "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("Chests", 265_4734), "End of the World World Terminus Hollow Bastion Chest": KH1LocationData("Chests", 265_4771), "End of the World Final Rest Chest": KH1LocationData("Chests", 265_4772), @@ -263,7 +266,6 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Events", 265_6023), "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Events", 265_6024), "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Events", 265_6031), - "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Events", 265_6032), "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Events", 265_6041), "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Events", 265_6042), "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Events", 265_6051), @@ -285,6 +287,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Neverland Seal Keyhole Fairy Harp Event": KH1LocationData("Events", 265_6093), "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Events", 265_6094), "Neverland Seal Keyhole Glide Event": KH1LocationData("Events", 265_6095), + "Neverland Defeat Phantom Stop Event": KH1LocationData("Events", 265_6096), "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Events", 265_6101), "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Events", 265_6102), "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Events", 265_6103), @@ -323,6 +326,83 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Atlantica Undersea Garden Clam": KH1LocationData("Clam", 265_6215), "Atlantica Undersea Cave Clam": KH1LocationData("Clam", 265_6216), + "Traverse Town Magician's Study Turn in Naturespark": KH1LocationData("Misc", 265_6300), + "Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Misc", 265_6301), + "Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Misc", 265_6302), + "Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Misc", 265_6303), + #"Traverse Town Geppetto's House Defeat 500 Heartless": KH1LocationData("Misc", 265_6304), + #"Traverse Town Geppetto's House Defeat 1000 Heartless": KH1LocationData("Misc", 265_6305), + #"Traverse Town Geppetto's House Defeat 1500 Heartless": KH1LocationData("Misc", 265_6306), + #"Traverse Town Geppetto's House Defeat 3000 Heartless": KH1LocationData("Misc", 265_6307), + #"Traverse Town Geppetto's House Defeat 4000 Heartless": KH1LocationData("Misc", 265_6308), + #"Traverse Town Geppetto's House Defeat 5000 Heartless and Acquire All Summons": KH1LocationData("Misc", 265_6309), + "Traverse Town Geppetto's House Enter 30 Times": KH1LocationData("Misc", 265_6310), + "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Misc", 265_6311), + "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Misc", 265_6312), + "Traverse Town Magician's Study Obtained All LV3 Magic": KH1LocationData("Misc", 265_6313), + "Traverse Town Piano Room Return 12 Puppies": KH1LocationData("Misc", 265_6314), + "Traverse Town Piano Room Return 24 Puppies": KH1LocationData("Misc", 265_6315), + "Traverse Town Piano Room Return 30 Puppies": KH1LocationData("Misc", 265_6316), + "Traverse Town Piano Room Return 42 Puppies": KH1LocationData("Misc", 265_6317), + "Traverse Town Piano Room Return 51 Puppies Reward 1": KH1LocationData("Misc", 265_6318), + "Traverse Town Piano Room Return 51 Puppies Reward 2": KH1LocationData("Misc", 265_6319), + "Traverse Town Piano Room Return 60 Puppies": KH1LocationData("Misc", 265_6320), + "Traverse Town Piano Room Return 72 Puppies": KH1LocationData("Misc", 265_6321), + "Traverse Town Piano Room Return 81 Puppies": KH1LocationData("Misc", 265_6322), + "Traverse Town Piano Room Return 90 Puppies Reward 1": KH1LocationData("Misc", 265_6324), + "Traverse Town Piano Room Return 90 Puppies Reward 2": KH1LocationData("Misc", 265_6325), + "Traverse Town Piano Room Return 99 Puppies Reward 1": KH1LocationData("Misc", 265_6326), + "Traverse Town Piano Room Return 99 Puppies Reward 2": KH1LocationData("Misc", 265_6327), + "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Misc", 265_6032), #Had to change the way we send this check, not changing location_id + "Olympus Coliseum Defeat Sephiroth One-Winged Angel Event": KH1LocationData("Misc", 265_6328), + "Olympus Coliseum Defeat Ice Titan Diamond Dust Event": KH1LocationData("Misc", 265_6329), + "Olympus Coliseum Gates Purple Jar After Defeating Hades": KH1LocationData("Misc", 265_6330), + "Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times": KH1LocationData("Misc", 265_6331), + #"Neverland Clock Tower 01:00 Door": KH1LocationData("Misc", 265_6332), + #"Neverland Clock Tower 02:00 Door": KH1LocationData("Misc", 265_6333), + #"Neverland Clock Tower 03:00 Door": KH1LocationData("Misc", 265_6334), + #"Neverland Clock Tower 04:00 Door": KH1LocationData("Misc", 265_6335), + #"Neverland Clock Tower 05:00 Door": KH1LocationData("Misc", 265_6336), + #"Neverland Clock Tower 06:00 Door": KH1LocationData("Misc", 265_6337), + #"Neverland Clock Tower 07:00 Door": KH1LocationData("Misc", 265_6338), + #"Neverland Clock Tower 08:00 Door": KH1LocationData("Misc", 265_6339), + #"Neverland Clock Tower 09:00 Door": KH1LocationData("Misc", 265_6340), + #"Neverland Clock Tower 10:00 Door": KH1LocationData("Misc", 265_6341), + #"Neverland Clock Tower 11:00 Door": KH1LocationData("Misc", 265_6342), + #"Neverland Clock Tower 12:00 Door": KH1LocationData("Misc", 265_6343), + "Neverland Hold Aero Chest": KH1LocationData("Misc", 265_6344), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 1": KH1LocationData("Misc", 265_6345), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 2": KH1LocationData("Misc", 265_6346), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 3": KH1LocationData("Misc", 265_6347), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 4": KH1LocationData("Misc", 265_6348), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 5": KH1LocationData("Misc", 265_6349), + "100 Acre Wood Pooh's House Owl Cheer": KH1LocationData("Misc", 265_6350), + "100 Acre Wood Convert Torn Page 1": KH1LocationData("Misc", 265_6351), + "100 Acre Wood Convert Torn Page 2": KH1LocationData("Misc", 265_6352), + "100 Acre Wood Convert Torn Page 3": KH1LocationData("Misc", 265_6353), + "100 Acre Wood Convert Torn Page 4": KH1LocationData("Misc", 265_6354), + "100 Acre Wood Convert Torn Page 5": KH1LocationData("Misc", 265_6355), + "100 Acre Wood Pooh's House Start Fire": KH1LocationData("Misc", 265_6356), + "100 Acre Wood Pooh's Room Cabinet": KH1LocationData("Misc", 265_6357), + "100 Acre Wood Pooh's Room Chimney": KH1LocationData("Misc", 265_6358), + "100 Acre Wood Bouncing Spot Break Log": KH1LocationData("Misc", 265_6359), + "100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh": KH1LocationData("Misc", 265_6360), + "Deep Jungle Camp Hi-Potion Experiment": KH1LocationData("Misc", 265_6361), + "Deep Jungle Camp Ether Experiment": KH1LocationData("Misc", 265_6362), + "Deep Jungle Camp Replication Experiment": KH1LocationData("Misc", 265_6363), + "Deep Jungle Cliff Save Gorillas": KH1LocationData("Misc", 265_6364), + "Deep Jungle Tree House Save Gorillas": KH1LocationData("Misc", 265_6365), + "Deep Jungle Camp Save Gorillas": KH1LocationData("Misc", 265_6366), + "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Misc", 265_6367), + "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Misc", 265_6368), + + "Traverse Town Synth Log": KH1LocationData("Synth", 265_6401), + "Traverse Town Synth Cloth": KH1LocationData("Synth", 265_6402), + "Traverse Town Synth Rope": KH1LocationData("Synth", 265_6403), + "Traverse Town Synth Seagull Egg": KH1LocationData("Synth", 265_6404), + "Traverse Town Synth Fish": KH1LocationData("Synth", 265_6405), + "Traverse Town Synth Mushroom": KH1LocationData("Synth", 265_6406), + "Agrabah Defeat Jafar Genie Ansem's Report 1": KH1LocationData("Reports", 265_7018), #"Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Reports", 265_7017), "Atlantica Defeat Ursula II Ansem's Report 3": KH1LocationData("Reports", 265_7016), @@ -333,7 +413,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Reports", 265_7011), "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Reports", 265_7028), #"Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Reports", 265_7027), - #"Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Reports", 265_7026), + "Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Reports", 265_7026), "Olympus Coliseum Defeat Sephiroth Ansem's Report 12": KH1LocationData("Reports", 265_7025), "Hollow Bastion Defeat Unknown Ansem's Report 13": KH1LocationData("Reports", 265_7024), "Level 001": KH1LocationData("Levels", 265_8001), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index cb2f165b635b..fc1ae7d7bd98 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -67,21 +67,43 @@ class Atlantica(Toggle): class Goal(Choice): """ Determines the goal of your playthrough. + Depending on your setting for Require Final Ansem, this will either yield Victory or required Ansem Reports to enter End of the World. + Note: If requiring Final Ansem, with more than 1 Ansem Report in the pool (or more than 5 if you are using the Super Boss Hunt goal), the goal(s) will not be required, but will remain a way to get a report. + + Sephiroth: Defeat Sephiroth. + Unknown: Defeat Unknown. + Postcards: Turn in all 10 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. + Super Boss Hunt: Ansem Reports are set to appear as rewards for defeating Phantom, Kurt Zisa, Sephiroth and Unknown. Forces require Final Ansem on. """ display_name = "Goal" - option_final_rest = 0 - option_wonderland = 1 - option_deep_jungle = 2 - option_agrabah = 3 - option_monstro = 4 - option_atlantica = 5 - option_halloween_town = 6 - option_neverland = 7 - option_sephiroth = 8 - option_unknown = 9 - option_postcards = 10 - option_final_ansem = 11 - default = 11 + option_sephiroth = 0 + option_unknown = 1 + option_postcards = 2 + option_final_ansem = 3 + option_puppies = 4 + option_super_boss_hunt = 5 + default = 3 + +class RequireFinalAnsem(Toggle): + """ + Determines whether the Victory item is behind your goal or if your goal will provide an Ansem's Report to enter End of the World and defeat Ansem. + """ + display_name = "Require Final Ansem" + +class Puppies(Choice): + """ + Determines how dalmation 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 = 0 class EXPMultiplier(NamedRange): """ @@ -181,3 +203,5 @@ class KH1Options(PerGameCommonOptions): keyblade_min_str: KeybladeMinStrength keyblade_max_mp: KeybladeMaxMP keyblade_min_mp: KeybladeMinMP + puppies: Puppies + require_final_ansem: RequireFinalAnsem diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index ca6079f777b8..6df3d7b12995 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,7 +9,7 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, levels: int): +def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, levels: int, require_final_ansem: bool): regions: Dict[str, KH1RegionData] = { "Menu": KH1RegionData(None, ["Awakening", "Levels"]), "Awakening": KH1RegionData([], ["Destiny Islands"]), @@ -25,11 +25,12 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo "Neverland": KH1RegionData([], []), "Hollow Bastion": KH1RegionData([], []), "End of the World": KH1RegionData([], []), + "100 Acre Wood": KH1RegionData([], []), "Levels": KH1RegionData([], []), "World Map": KH1RegionData([], ["Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", - "End of the World"]) + "End of the World", "100 Acre Wood"]) } # Set up locations @@ -93,7 +94,10 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Deep Jungle"].locations.append("Deep Jungle Cliff Right Cliff Left Chest"), regions["Deep Jungle"].locations.append("Deep Jungle Cliff Right Cliff Right Chest"), regions["Deep Jungle"].locations.append("Deep Jungle Tree House Suspended Boat Chest"), - #regions["100 Acre Wood"].locations.append("100 Acre Wood Meadow Inside Log Chest"), + 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"), + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), regions["Agrabah"].locations.append("Agrabah Plaza By Storage Chest"), regions["Agrabah"].locations.append("Agrabah Plaza Raised Terrace Chest"), regions["Agrabah"].locations.append("Agrabah Plaza Top Corner Chest"), @@ -135,7 +139,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Monstro"].locations.append("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), regions["Monstro"].locations.append("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), regions["Monstro"].locations.append("Monstro Chamber 6 Low Chest"), - if atlantica or goal == "atlantica": + if atlantica: regions["Atlantica"].locations.append("Atlantica Sunken Ship In Flipped Boat Chest"), regions["Atlantica"].locations.append("Atlantica Sunken Ship Seabed Chest"), regions["Atlantica"].locations.append("Atlantica Sunken Ship Inside Ship Chest"), @@ -235,28 +239,28 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo #regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Push the Statue Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Left of Emblem Door Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls White Trinity Chest"), - #regions["End of the World"].locations.append("End of the World Final Dimension 1st Chest"), - #regions["End of the World"].locations.append("End of the World Final Dimension 2nd Chest"), - #regions["End of the World"].locations.append("End of the World Final Dimension 3rd Chest"), - #regions["End of the World"].locations.append("End of the World Final Dimension 4th Chest"), - #regions["End of the World"].locations.append("End of the World Final Dimension 5th Chest"), - #regions["End of the World"].locations.append("End of the World Final Dimension 6th Chest"), - #regions["End of the World"].locations.append("End of the World Final Dimension 10th Chest"), - #regions["End of the World"].locations.append("End of the World Final Dimension 9th Chest"), - #regions["End of the World"].locations.append("End of the World Final Dimension 8th Chest"), - #regions["End of the World"].locations.append("End of the World Final Dimension 7th Chest"), - #regions["End of the World"].locations.append("End of the World Giant Crevasse 3rd Chest"), - #regions["End of the World"].locations.append("End of the World Giant Crevasse 1st Chest"), - #regions["End of the World"].locations.append("End of the World Giant Crevasse 4th Chest"), - #regions["End of the World"].locations.append("End of the World Giant Crevasse 2nd Chest"), - #regions["End of the World"].locations.append("End of the World World Terminus Traverse Town Chest"), - #regions["End of the World"].locations.append("End of the World World Terminus Wonderland 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 Deep Jungle Chest"), - #regions["End of the World"].locations.append("End of the World World Terminus Agrabah Chest"), - #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 Halloween Town 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 Final Dimension 1st Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 2nd Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 3rd Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 4th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 5th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 6th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 10th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 9th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 8th Chest"), + regions["End of the World"].locations.append("End of the World Final Dimension 7th Chest"), + regions["End of the World"].locations.append("End of the World Giant Crevasse 3rd Chest"), + regions["End of the World"].locations.append("End of the World Giant Crevasse 1st Chest"), + regions["End of the World"].locations.append("End of the World Giant Crevasse 4th Chest"), + regions["End of the World"].locations.append("End of the World Giant Crevasse 2nd Chest"), + regions["End of the World"].locations.append("End of the World World Terminus Traverse Town Chest"), + regions["End of the World"].locations.append("End of the World World Terminus Wonderland 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 Deep Jungle Chest"), + regions["End of the World"].locations.append("End of the World World Terminus Agrabah Chest"), + 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 Halloween Town 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 100 Acre Wood 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 Final Rest Chest"), @@ -284,7 +288,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Agrabah"].locations.append("Agrabah Seal Keyhole Green Trinity Event"), regions["Monstro"].locations.append("Monstro Defeat Parasite Cage I Goofy Cheer Event"), regions["Monstro"].locations.append("Monstro Defeat Parasite Cage II Stop Event"), - if atlantica or goal == "atlantica": + if atlantica: regions["Atlantica"].locations.append("Atlantica Defeat Ursula I Mermaid Kick Event") regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Thunder Event") regions["Atlantica"].locations.append("Atlantica Seal Keyhole Crabclaw Event") @@ -296,6 +300,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Neverland"].locations.append("Neverland Seal Keyhole Fairy Harp Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") + regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Donald Cheer Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Dragon Maleficent Fireglow Event") @@ -317,7 +322,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Aero Event") - if atlantica or goal == "atlantica": + if atlantica: regions["Atlantica"].locations.append("Atlantica Undersea Gorge Blizzard Clam") regions["Atlantica"].locations.append("Atlantica Undersea Gorge Ocean Floor Clam") regions["Atlantica"].locations.append("Atlantica Undersea Valley Higher Cave Clam") @@ -337,7 +342,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Ansem's Report 1") #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 2") - if atlantica or goal == "atlantica": + if atlantica: regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Ansem's Report 3") #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 4") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Ansem's Report 5") @@ -346,11 +351,9 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") regions["Neverland"].locations.append("Neverland Defeat Hook Ansem's Report 9") #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") - #regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") - if goal == "sephiroth": - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") - if goal == "unknown": - regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") + regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") for i in range(levels): regions["Levels"].locations.append("Level " + str(i+1).rjust(3,'0')) @@ -376,7 +379,87 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Olympus Coliseum"].locations.append("Hercules Cup Defeat Cloud Event") regions["Olympus Coliseum"].locations.append("Hercules Cup Yellow Trinity Event") - if goal == "final_ansem": + regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Naturespark") + regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Watergleam") + regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Fireglow") + regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in all Summon Gems") + #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 500 Heartless") + #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 1000 Heartless") + #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 1500 Heartless") + #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 3000 Heartless") + #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 4000 Heartless") + #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 5000 Heartless and Acquire All Summons") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Enter 30 Times") + 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") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 12 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 24 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 30 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 42 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 51 Puppies Reward 1") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 51 Puppies Reward 2") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 60 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 72 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 81 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies Reward 1") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies Reward 2") + 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["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") + 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") + regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times") + #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 Hold Aero Chest") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 1") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 2") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 3") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 4") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 5") + if atlantica: + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Owl Cheer") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 1") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 2") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 3") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 4") + if atlantica: + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 5") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Cabinet") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Chimney") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Break Log") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh") + regions["Deep Jungle"].locations.append("Deep Jungle Camp Hi-Potion Experiment") + regions["Deep Jungle"].locations.append("Deep Jungle Camp Ether Experiment") + regions["Deep Jungle"].locations.append("Deep Jungle Camp Replication Experiment") + regions["Deep Jungle"].locations.append("Deep Jungle Cliff Save Gorillas") + regions["Deep Jungle"].locations.append("Deep Jungle Tree House Save Gorillas") + regions["Deep Jungle"].locations.append("Deep Jungle Camp Save Gorillas") + regions["Deep Jungle"].locations.append("Deep Jungle Bamboo Thicket Save Gorillas") + regions["Deep Jungle"].locations.append("Deep Jungle Climbing Trees Save Gorillas") + + regions["Traverse Town"].locations.append("Traverse Town Synth Log") + regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") + 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 Fish") + regions["Traverse Town"].locations.append("Traverse Town Synth Mushroom") + + + if goal == "final_ansem" or require_final_ansem: regions["End of the World"].locations.append("Final Ansem") # Set up the regions correctly. @@ -396,6 +479,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo multiworld.get_entrance("Neverland", player).connect(multiworld.get_region("Neverland", player)) multiworld.get_entrance("Hollow Bastion", player).connect(multiworld.get_region("Hollow Bastion", player)) multiworld.get_entrance("End of the World", player).connect(multiworld.get_region("End of the World", player)) + 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)) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 3f45cc9a346a..a4f10840777d 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -37,6 +37,42 @@ def has_postcards(state: CollectionState, player: int, postcards_required: int) postcards_available = postcards_available + state.count("Postcard", player) #3 can be found in chests/events return postcards_available >= postcards_required +def has_puppies(state: CollectionState, player: int, puppies_required: int) -> bool: + puppies_available = 0 + for i in range(1,100): + if state.has("Puppy " + str(i).rjust(2,"0"), player): + puppies_available = puppies_available + 1 + for i in range(1,34): + if state.has("Puppies " + str(3*(i-1)).rjust(2, "0") + "-" + str(3*(i-1)+2).rjust(2, "0"), player): + puppies_available = puppies_available + 3 + if state.has("All Puppies", player): + puppies_available = puppies_available + 99 + return puppies_available >= puppies_required + +def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> bool: + pages_available = 0 + if state.has("Atlantica", player): + pages_available = pages_available + 1 + if state.has("Halloween Town", player): + pages_available = pages_available + 1 + pages_available = pages_available + state.count("Torn Page 1", player) + pages_available = pages_available + state.count("Torn Page 2", player) + pages_available = pages_available + state.count("Torn Page 5", player) + return pages_available >= pages_required + +def has_all_arts(state: CollectionState, player: int) -> bool: + return state.has("Fire Arts", player) and state.has("Blizzard Arts", player) and state.has("Thunder Arts", player) \ + and state.has("Cure Arts", player) and state.has("Gravity Arts", player) and state.has("Stop Arts", player) and state.has("Aero Arts", player) + +def has_all_summons(state: CollectionState, player: int) -> bool: + return state.has("Simba", player) and state.has("Bambi", player) and state.has("Genie", player) \ + and state.has("Dumbo", player) and state.has("Mushu", player) and state.has("Tinker Bell", player) + +def has_all_magic_lvx(state: CollectionState, player: int, level) -> bool: + return state.count("Progressive Fire", player) >= level and state.count("Progressive Blizzard", player) >= level and state.count("Progressive Thunder", player) >= level \ + and state.count("Progressive Cure", player) >= level and state.count("Progressive Gravity", player) >= level and state.count("Progressive Aero", player) >= level \ + and state.count("Progressive Stop", player) >= level + def has_offensive_magic(state: CollectionState, player: int) -> bool: return state.has("Progressive Fire", player) or state.has("Progressive Blizzard", player) or state.has("Progressive Thunder", player) or state.has("Progressive Gravity", player) or state.has("Progressive Stop", player) @@ -111,6 +147,9 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Deep Jungle Cliff Right Cliff Right Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Deep Jungle Tree House Suspended Boat Chest" , player).access_rule = lambda state: can_glide(state, player) #multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) #multiworld.get_location("Agrabah Plaza By Storage Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Plaza Raised Terrace Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Plaza Top Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -152,7 +191,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: has_item(state, player, "") - if atlantica or goal == "atlantica": + if atlantica: #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -252,20 +291,20 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Hollow Bastion Entrance Hall Push the Statue Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Hollow Bastion Rising Falls White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - #multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 4th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 5th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 6th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 10th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 9th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Final Dimension 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Final Dimension 4th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Final Dimension 5th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Final Dimension 6th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Final Dimension 10th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Final Dimension 9th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) #multiworld.get_location("End of the World World Terminus Traverse Town Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Wonderland Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Olympus Coliseum Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -301,7 +340,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Agrabah Seal Keyhole Green Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Defeat Parasite Cage I Goofy Cheer Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Defeat Parasite Cage II Stop Event" , player).access_rule = lambda state: has_item(state, player, "High Jump") - if atlantica or goal == "atlantica": + if atlantica: multiworld.get_location("Atlantica Defeat Ursula I Mermaid Kick Event" , player).access_rule = lambda state: has_offensive_magic(state, player) multiworld.get_location("Atlantica Defeat Ursula II Thunder Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) multiworld.get_location("Atlantica Seal Keyhole Crabclaw Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) @@ -313,6 +352,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Neverland Seal Keyhole Fairy Harp Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event" , player).access_rule = lambda state: has_emblems(state, player) @@ -334,7 +374,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Traverse Town Defeat Opposite Armor Aero Event" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") - if atlantica or goal == "atlantica": + if atlantica: multiworld.get_location("Atlantica Undersea Gorge Blizzard Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") #multiworld.get_location("Atlantica Undersea Gorge Ocean Floor Clam" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Undersea Valley Higher Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") @@ -354,7 +394,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Agrabah Defeat Jafar Genie Ansem's Report 1" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: has_emblems(state, player) - if atlantica or goal == "atlantica": + if atlantica: multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5" , player).access_rule = lambda state: has_emblems(state, player) @@ -363,11 +403,9 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) - #multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_item(state, player, "") - if goal == "sephiroth": - multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") - if goal == "unknown": - multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") @@ -389,6 +427,85 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Traverse Town Magician's Study Turn in Naturespark" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Traverse Town Magician's Study Turn in Watergleam" , player).access_rule = lambda state: has_item(state, player, "Watergleam") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Traverse Town Magician's Study Turn in Fireglow" , player).access_rule = lambda state: has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Traverse Town Magician's Study Turn in all Summon Gems" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Watergleam") and has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") + #multiworld.get_location("Traverse Town Geppetto's House Defeat 500 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + #multiworld.get_location("Traverse Town Geppetto's House Defeat 1000 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + #multiworld.get_location("Traverse Town Geppetto's House Defeat 1500 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + #multiworld.get_location("Traverse Town Geppetto's House Defeat 3000 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + #multiworld.get_location("Traverse Town Geppetto's House Defeat 4000 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + #multiworld.get_location("Traverse Town Geppetto's House Defeat 5000 Heartless and Acquire All Summons" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) and has_all_summons(state, player) + multiworld.get_location("Traverse Town Geppetto's House Enter 30 Times" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_all_arts(state, player) + multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 1) + multiworld.get_location("Traverse Town Magician's Study Obtained All LV3 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 3) + multiworld.get_location("Traverse Town Piano Room Return 12 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 12) + multiworld.get_location("Traverse Town Piano Room Return 24 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 24) + multiworld.get_location("Traverse Town Piano Room Return 30 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 30) + multiworld.get_location("Traverse Town Piano Room Return 42 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 42) + multiworld.get_location("Traverse Town Piano Room Return 51 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 51) + multiworld.get_location("Traverse Town Piano Room Return 51 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 51) + multiworld.get_location("Traverse Town Piano Room Return 60 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 60) + multiworld.get_location("Traverse Town Piano Room Return 72 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 72) + multiworld.get_location("Traverse Town Piano Room Return 81 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 81) + multiworld.get_location("Traverse Town Piano Room Return 90 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 90) + multiworld.get_location("Traverse Town Piano Room Return 90 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 90) + multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 99) + multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 99) + multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Guard") + multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + #multiworld.get_location("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 02:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 03:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 04:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 05:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 06:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 07:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 08:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 09:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 10:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 11:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Neverland Clock Tower 12:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Hold Aero Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + if atlantica: + multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: has_torn_pages(state, player, 5) + multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: has_torn_pages(state, player, 1) + multiworld.get_location("100 Acre Wood Convert Torn Page 2" , player).access_rule = lambda state: has_torn_pages(state, player, 2) + multiworld.get_location("100 Acre Wood Convert Torn Page 3" , player).access_rule = lambda state: has_torn_pages(state, player, 3) + multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + if atlantica: + multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: has_torn_pages(state, player, 5) + multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") + #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("Deep Jungle Camp Hi-Potion Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") + multiworld.get_location("Deep Jungle Camp Ether Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") + #multiworld.get_location("Deep Jungle Camp Replication Experiment" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Deep Jungle Cliff Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Tree House Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Camp Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) + + multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) + multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) + multiworld.get_location("Traverse Town Synth Rope" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) + multiworld.get_location("Traverse Town Synth Seagull Egg" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) + multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) + multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) + + #multiworld.get_location("Final Ansem" , player).access_rule = lambda state: has_item(state, player, "") # Region rules. @@ -397,12 +514,13 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: has_item(state, player,"Deep Jungle") multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: has_item(state, player,"Agrabah") multiworld.get_entrance("Monstro" , player).access_rule = lambda state: has_item(state, player,"Monstro") - if atlantica or goal == "atlantica": + if atlantica: multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_x_worlds(state, player, 7) and has_reports(state, player, required_reports) + multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "Old Book") # Win condition. multiworld.completion_condition[player] = lambda state: state.has_all({"Victory"}, player) \ No newline at end of file diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index b2bf76ec9b69..44491f909790 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -83,10 +83,19 @@ def create_items(self): while i < len(level_up_item_pool): self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool[i])) i = i + 1 - - total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - 1 # for victory placement + total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - 1 + if self.options.goal.current_key == "super_boss_hunt": + total_locations = total_locations - 5 + elif self.options.goal.current_key != "Final Ansem" and self.options.require_final_ansem: + total_locations = total_locations - 1 non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades", "Accessory", "Weapons"] - if self.options.atlantica or self.options.goal == "atlantica": + if self.options.puppies == "full": + non_filler_item_categories.append("Puppies ALL") + if self.options.puppies == "triplets": + non_filler_item_categories.append("Puppies TRP") + if self.options.puppies == "individual": + non_filler_item_categories.append("Puppies IND") + if self.options.atlantica: non_filler_item_categories.append("Atlantica") for name, data in item_table.items(): quantity = data.max_quantity @@ -96,9 +105,17 @@ def create_items(self): continue item_pool += [self.create_item(name) for _ in range(0, quantity)] - for i in range(max(self.options.required_reports, self.options.reports_in_pool)): + reports_in_pool = max(int(self.options.required_reports), int(self.options.reports_in_pool)) + if self.options.goal.current_key == "super_boss_hunt": + i = 5 + elif self.options.require_final_ansem: + i = 1 + else: + i = 0 + while i < reports_in_pool: item_pool += [self.create_item("Ansem's Report " + str(i+1))] - + i = i + 1 + # Fill any empty locations with filler items. item_names = [] attempts = 0 # If we ever try to add items 200 times, and all the items are used up, lets clear the item_names array, we probably don't have enough items @@ -118,20 +135,25 @@ def create_items(self): def pre_fill(self) -> None: goal_dict = { - "sephiroth": "Olympus Coliseum Defeat Sephiroth Ansem's Report 12", - "wonderland": "Wonderland Defeat Trickmaster Ifrit's Horn Event", - "deep_jungle": "Deep Jungle Seal Keyhole Jungle King Event", - "agrabah": "Agrabah Seal Keyhole Genie Event", - "monstro": "Monstro Defeat Parasite Cage II Stop Event", - "atlantica": "Atlantica Seal Keyhole Crabclaw Event", - "halloween_town": "Halloween Town Seal Keyhole Pumpkinhead Event", - "neverland": "Neverland Seal Keyhole Fairy Harp Event", - "unknown": "Hollow Bastion Defeat Unknown Ansem's Report 13", - "final_rest": "End of the World Final Rest Chest", - "postcards": "Traverse Town Mail Postcard 10 Event", - "final_ansem": "Final Ansem" + "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"], + "super_boss_hunt": ["Olympus Coliseum Defeat Sephiroth Ansem's Report 12" + , "Hollow Bastion Defeat Unknown Ansem's Report 13" + , "Agrabah Defeat Kurt Zisa Ansem's Report 11" + , "Neverland Defeat Phantom Stop Event" + , "Olympus Coliseum Defeat Ice Titan Diamond Dust Event"], } - self.multiworld.get_location(goal_dict[self.options.goal.current_key], self.player).place_locked_item(self.create_item("Victory")) + if (self.options.require_final_ansem or self.options.goal.current_key == "super_boss_hunt") and self.options.goal.current_key != "final_ansem": + self.multiworld.get_location("Final Ansem", self.player).place_locked_item(self.create_item("Victory")) + report_no = 1 + for location_name in goal_dict[self.options.goal.current_key]: + self.multiworld.get_location(location_name, self.player).place_locked_item(self.create_item("Ansem's Report " + str(report_no))) + report_no = report_no + 1 + else: + self.multiworld.get_location(goal_dict[self.options.goal.current_key][0], self.player).place_locked_item(self.create_item("Victory")) def get_filler_item_name(self) -> str: fillers = {} @@ -143,8 +165,13 @@ def get_filler_item_name(self) -> str: return self.multiworld.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] def fill_slot_data(self) -> dict: + if self.options.goal.current_key == "super_boss_hunt": + reports_in_pool = max(self.options.reports_in_pool, 5) + else: + reports_in_pool = self.options.reports_in_pool + required_reports = min(int(self.options.required_reports), reports_in_pool) slot_data = {"EXP Multiplier": int(self.options.exp_multiplier)/16 - ,"Required Reports": min(int(self.options.required_reports), int(self.options.reports_in_pool))} + ,"Required Reports": required_reports} if self.options.randomize_keyblade_stats: min_str_bonus = min(self.options.keyblade_min_str, self.options.keyblade_max_str) max_str_bonus = max(self.options.keyblade_min_str, self.options.keyblade_max_str) @@ -165,9 +192,13 @@ def create_event(self, name: str) -> KH1Item: return KH1Item(name, data.classification, data.code, self.player) def set_rules(self): - set_rules(self.multiworld, self.player, self.options.goal, self.options.atlantica, min(self.options.required_reports, self.options.reports_in_pool)) + if self.options.goal.current_key == "super_boss_hunt": + reports_in_pool = max(self.options.reports_in_pool, 5) + else: + reports_in_pool = self.options.reports_in_pool + set_rules(self.multiworld, self.player, self.options.goal, self.options.atlantica, min(self.options.required_reports, reports_in_pool)) def create_regions(self): create_regions(self.multiworld, self.player, self.options.goal, self.options.atlantica \ , min((self.options.strength_increase + self.options.defense_increase + self.options.hp_increase + self.options.mp_increase \ - + self.options.ap_increase + self.options.accessory_slot_increase + self.options.item_slot_increase), 100)) \ No newline at end of file + + self.options.ap_increase + self.options.accessory_slot_increase + self.options.item_slot_increase), 100), self.options.require_final_ansem) \ No newline at end of file diff --git a/worlds/kh1/test/test_goal.py b/worlds/kh1/test/test_goal.py index d2932326113f..8c1b65e76c73 100644 --- a/worlds/kh1/test/test_goal.py +++ b/worlds/kh1/test/test_goal.py @@ -3,62 +3,32 @@ class TestDefault(KH1TestBase): options = {} -class TestFinalRest(KH1TestBase): +class TestSephiroth(KH1TestBase): options = { "Goal": 0, } -class TestWonderland(KH1TestBase): +class TestUnknown(KH1TestBase): options = { "Goal": 1, } -class TestDeepJungle(KH1TestBase): +class TestPostcards(KH1TestBase): options = { "Goal": 2, } -class TestAgrabah(KH1TestBase): +class TestFinalAnsem(KH1TestBase): options = { "Goal": 3, } -class TestMonstro(KH1TestBase): +class TestPuppies(KH1TestBase): options = { "Goal": 4, } -class TestAtlantica(KH1TestBase): +class TestSuperBossHunt(KH1TestBase): options = { "Goal": 5, - } - -class TestHalloweenTown(KH1TestBase): - options = { - "Goal": 6, - } - -class TestNeverland(KH1TestBase): - options = { - "Goal": 7, - } - -class TestSephiroth(KH1TestBase): - options = { - "Goal": 8, - } - -class TestUnknown(KH1TestBase): - options = { - "Goal": 9, - } - -class TestPostcards(KH1TestBase): - options = { - "Goal": 10, - } - -class TestFinalRest(KH1TestBase): - options = { - "Goal": 11, } \ No newline at end of file From ffd50a2cfea87867776289f06a00d3b655578ff1 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 10:39:23 -0500 Subject: [PATCH 082/284] Lots of changes --- worlds/kh1/Items.py | 10 +++++----- worlds/kh1/Locations.py | 26 ++++++++++++-------------- worlds/kh1/Regions.py | 25 +++++++++++-------------- worlds/kh1/Rules.py | 41 ++++++++++++++++++++--------------------- 4 files changed, 48 insertions(+), 54 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 2711989e8a09..891a50de8784 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -212,7 +212,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Material": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 6, weight = 10), + "Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 6, weight = 10), "Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -232,9 +232,9 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 3, weight = 10), @@ -242,7 +242,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Torn Page 2": KH1ItemData("Key", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 3": KH1ItemData("Key", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 4": KH1ItemData("Key", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Slide 1": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 73950af0825c..ce113ced3147 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -326,10 +326,10 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Atlantica Undersea Garden Clam": KH1LocationData("Clam", 265_6215), "Atlantica Undersea Cave Clam": KH1LocationData("Clam", 265_6216), - "Traverse Town Magician's Study Turn in Naturespark": KH1LocationData("Misc", 265_6300), - "Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Misc", 265_6301), - "Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Misc", 265_6302), - "Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Misc", 265_6303), + #"Traverse Town Magician's Study Turn in Naturespark": KH1LocationData("Misc", 265_6300), + #"Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Misc", 265_6301), + #"Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Misc", 265_6302), + #"Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Misc", 265_6303), #"Traverse Town Geppetto's House Defeat 500 Heartless": KH1LocationData("Misc", 265_6304), #"Traverse Town Geppetto's House Defeat 1000 Heartless": KH1LocationData("Misc", 265_6305), #"Traverse Town Geppetto's House Defeat 1500 Heartless": KH1LocationData("Misc", 265_6306), @@ -340,17 +340,15 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Misc", 265_6311), "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Misc", 265_6312), "Traverse Town Magician's Study Obtained All LV3 Magic": KH1LocationData("Misc", 265_6313), - "Traverse Town Piano Room Return 12 Puppies": KH1LocationData("Misc", 265_6314), - "Traverse Town Piano Room Return 24 Puppies": KH1LocationData("Misc", 265_6315), + "Traverse Town Piano Room Return 10 Puppies": KH1LocationData("Misc", 265_6314), + "Traverse Town Piano Room Return 20 Puppies": KH1LocationData("Misc", 265_6315), "Traverse Town Piano Room Return 30 Puppies": KH1LocationData("Misc", 265_6316), - "Traverse Town Piano Room Return 42 Puppies": KH1LocationData("Misc", 265_6317), - "Traverse Town Piano Room Return 51 Puppies Reward 1": KH1LocationData("Misc", 265_6318), - "Traverse Town Piano Room Return 51 Puppies Reward 2": KH1LocationData("Misc", 265_6319), + "Traverse Town Piano Room Return 40 Puppies": KH1LocationData("Misc", 265_6317), + "Traverse Town Piano Room Return 50 Puppies": KH1LocationData("Misc", 265_6318), "Traverse Town Piano Room Return 60 Puppies": KH1LocationData("Misc", 265_6320), - "Traverse Town Piano Room Return 72 Puppies": KH1LocationData("Misc", 265_6321), - "Traverse Town Piano Room Return 81 Puppies": KH1LocationData("Misc", 265_6322), - "Traverse Town Piano Room Return 90 Puppies Reward 1": KH1LocationData("Misc", 265_6324), - "Traverse Town Piano Room Return 90 Puppies Reward 2": KH1LocationData("Misc", 265_6325), + "Traverse Town Piano Room Return 70 Puppies": KH1LocationData("Misc", 265_6321), + "Traverse Town Piano Room Return 80 Puppies": KH1LocationData("Misc", 265_6322), + "Traverse Town Piano Room Return 90 Puppies": KH1LocationData("Misc", 265_6324), "Traverse Town Piano Room Return 99 Puppies Reward 1": KH1LocationData("Misc", 265_6326), "Traverse Town Piano Room Return 99 Puppies Reward 2": KH1LocationData("Misc", 265_6327), "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Misc", 265_6032), #Had to change the way we send this check, not changing location_id @@ -382,7 +380,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "100 Acre Wood Convert Torn Page 3": KH1LocationData("Misc", 265_6353), "100 Acre Wood Convert Torn Page 4": KH1LocationData("Misc", 265_6354), "100 Acre Wood Convert Torn Page 5": KH1LocationData("Misc", 265_6355), - "100 Acre Wood Pooh's House Start Fire": KH1LocationData("Misc", 265_6356), + #"100 Acre Wood Pooh's House Start Fire": KH1LocationData("Misc", 265_6356), "100 Acre Wood Pooh's Room Cabinet": KH1LocationData("Misc", 265_6357), "100 Acre Wood Pooh's Room Chimney": KH1LocationData("Misc", 265_6358), "100 Acre Wood Bouncing Spot Break Log": KH1LocationData("Misc", 265_6359), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 6df3d7b12995..b096b22ad9a7 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -379,10 +379,10 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Olympus Coliseum"].locations.append("Hercules Cup Defeat Cloud Event") regions["Olympus Coliseum"].locations.append("Hercules Cup Yellow Trinity Event") - regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Naturespark") - regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Watergleam") - regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Fireglow") - regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in all Summon Gems") + #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Naturespark") + #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Watergleam") + #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Fireglow") + #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in all Summon Gems") #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 500 Heartless") #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 1000 Heartless") #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 1500 Heartless") @@ -393,18 +393,15 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo 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") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 12 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 24 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 10 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 20 Puppies") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 30 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 42 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 51 Puppies Reward 1") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 51 Puppies Reward 2") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 40 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 50 Puppies") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 60 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 72 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 81 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 70 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 80 Puppies") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies Reward 1") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies Reward 2") 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["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") @@ -437,7 +434,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 4") if atlantica: regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 5") - regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") + #regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Cabinet") regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Chimney") regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Break Log") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index a4f10840777d..ce9ec154b44c 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -55,9 +55,10 @@ def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> pages_available = pages_available + 1 if state.has("Halloween Town", player): pages_available = pages_available + 1 + if has_puppies(state, player, 51): + pages_available = pages_available + 1 pages_available = pages_available + state.count("Torn Page 1", player) pages_available = pages_available + state.count("Torn Page 2", player) - pages_available = pages_available + state.count("Torn Page 5", player) return pages_available >= pages_required def has_all_arts(state: CollectionState, player: int) -> bool: @@ -427,10 +428,10 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") - multiworld.get_location("Traverse Town Magician's Study Turn in Naturespark" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Traverse Town Magician's Study Turn in Watergleam" , player).access_rule = lambda state: has_item(state, player, "Watergleam") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Traverse Town Magician's Study Turn in Fireglow" , player).access_rule = lambda state: has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Traverse Town Magician's Study Turn in all Summon Gems" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Watergleam") and has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") + #multiworld.get_location("Traverse Town Magician's Study Turn in Naturespark" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Progressive Fire") + #multiworld.get_location("Traverse Town Magician's Study Turn in Watergleam" , player).access_rule = lambda state: has_item(state, player, "Watergleam") and has_item(state, player, "Progressive Fire") + #multiworld.get_location("Traverse Town Magician's Study Turn in Fireglow" , player).access_rule = lambda state: has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") + #multiworld.get_location("Traverse Town Magician's Study Turn in all Summon Gems" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Watergleam") and has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Geppetto's House Defeat 500 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) #multiworld.get_location("Traverse Town Geppetto's House Defeat 1000 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) #multiworld.get_location("Traverse Town Geppetto's House Defeat 1500 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) @@ -441,17 +442,15 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_all_arts(state, player) multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 1) multiworld.get_location("Traverse Town Magician's Study Obtained All LV3 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 3) - multiworld.get_location("Traverse Town Piano Room Return 12 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 12) - multiworld.get_location("Traverse Town Piano Room Return 24 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 24) + multiworld.get_location("Traverse Town Piano Room Return 10 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 12) + multiworld.get_location("Traverse Town Piano Room Return 20 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 24) multiworld.get_location("Traverse Town Piano Room Return 30 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 30) - multiworld.get_location("Traverse Town Piano Room Return 42 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 42) - multiworld.get_location("Traverse Town Piano Room Return 51 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 51) - multiworld.get_location("Traverse Town Piano Room Return 51 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 51) + multiworld.get_location("Traverse Town Piano Room Return 40 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 41) + multiworld.get_location("Traverse Town Piano Room Return 50 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 51) multiworld.get_location("Traverse Town Piano Room Return 60 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 60) - multiworld.get_location("Traverse Town Piano Room Return 72 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 72) - multiworld.get_location("Traverse Town Piano Room Return 81 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 81) - multiworld.get_location("Traverse Town Piano Room Return 90 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 90) - multiworld.get_location("Traverse Town Piano Room Return 90 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 90) + multiworld.get_location("Traverse Town Piano Room Return 70 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 72) + multiworld.get_location("Traverse Town Piano Room Return 80 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 81) + multiworld.get_location("Traverse Town Piano Room Return 90 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 90) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 99) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 99) multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) @@ -484,7 +483,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) if atlantica: multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: has_torn_pages(state, player, 5) - multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") + #multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: has_torn_pages(state, player, 4) @@ -498,12 +497,12 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) - multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) - multiworld.get_location("Traverse Town Synth Rope" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) - multiworld.get_location("Traverse Town Synth Seagull Egg" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) - multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) - multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) + multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Rope" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Seagull Egg" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") #multiworld.get_location("Final Ansem" , player).access_rule = lambda state: has_item(state, player, "") From 80bd2b8d5f651e9d03b74e2d6db84d7592743bac Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 13:45:46 -0500 Subject: [PATCH 083/284] Fixes --- worlds/kh1/Items.py | 4 ++-- worlds/kh1/Locations.py | 18 ++++++++++-------- worlds/kh1/Regions.py | 18 ++++++++++-------- worlds/kh1/Rules.py | 20 +++++++++++--------- 4 files changed, 33 insertions(+), 27 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 891a50de8784..caa37462bfd9 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -238,9 +238,9 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 3, weight = 10), - "Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Torn Page 2": KH1ItemData("Key", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Torn Page 3": KH1ItemData("Key", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 3": KH1ItemData("Key", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 4": KH1ItemData("Key", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Slide 1": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index ce113ced3147..0d091f08f150 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -239,6 +239,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "End of the World Final Dimension 8th Chest": KH1LocationData("Chests", 265_4611), "End of the World Final Dimension 7th Chest": KH1LocationData("Chests", 265_4612), "End of the World Giant Crevasse 3rd Chest": KH1LocationData("Chests", 265_4613), + "End of the World Giant Crevasse 5th Chest": KH1LocationData("Chests", 265_4614), "End of the World Giant Crevasse 1st Chest": KH1LocationData("Chests", 265_4651), "End of the World Giant Crevasse 4th Chest": KH1LocationData("Chests", 265_4652), "End of the World Giant Crevasse 2nd Chest": KH1LocationData("Chests", 265_4653), @@ -249,7 +250,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "End of the World World Terminus Agrabah Chest": KH1LocationData("Chests", 265_4694), "End of the World World Terminus Atlantica Chest": KH1LocationData("Chests", 265_4731), "End of the World World Terminus Halloween Town Chest": KH1LocationData("Chests", 265_4732), - "End of the World World Terminus Neverland Chest": KH1LocationData("Chests", 265_4733), + #"End of the World World Terminus Neverland Chest": KH1LocationData("Chests", 265_4733), "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("Chests", 265_4734), "End of the World World Terminus Hollow Bastion Chest": KH1LocationData("Chests", 265_4771), "End of the World Final Rest Chest": KH1LocationData("Chests", 265_4772), @@ -330,12 +331,12 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: #"Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Misc", 265_6301), #"Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Misc", 265_6302), #"Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Misc", 265_6303), - #"Traverse Town Geppetto's House Defeat 500 Heartless": KH1LocationData("Misc", 265_6304), - #"Traverse Town Geppetto's House Defeat 1000 Heartless": KH1LocationData("Misc", 265_6305), - #"Traverse Town Geppetto's House Defeat 1500 Heartless": KH1LocationData("Misc", 265_6306), - #"Traverse Town Geppetto's House Defeat 3000 Heartless": KH1LocationData("Misc", 265_6307), - #"Traverse Town Geppetto's House Defeat 4000 Heartless": KH1LocationData("Misc", 265_6308), - #"Traverse Town Geppetto's House Defeat 5000 Heartless and Acquire All Summons": KH1LocationData("Misc", 265_6309), + "Traverse Town Geppetto's House Geppetto Reward 1": KH1LocationData("Misc", 265_6304), + "Traverse Town Geppetto's House Geppetto Reward 2": KH1LocationData("Misc", 265_6305), + "Traverse Town Geppetto's House Geppetto Reward 3": KH1LocationData("Misc", 265_6306), + "Traverse Town Geppetto's House Geppetto Reward 4": KH1LocationData("Misc", 265_6307), + "Traverse Town Geppetto's House Geppetto Reward 5": KH1LocationData("Misc", 265_6308), + "Traverse Town Geppetto's House Geppetto All Summons Reward": KH1LocationData("Misc", 265_6309), "Traverse Town Geppetto's House Enter 30 Times": KH1LocationData("Misc", 265_6310), "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Misc", 265_6311), "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Misc", 265_6312), @@ -380,7 +381,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "100 Acre Wood Convert Torn Page 3": KH1LocationData("Misc", 265_6353), "100 Acre Wood Convert Torn Page 4": KH1LocationData("Misc", 265_6354), "100 Acre Wood Convert Torn Page 5": KH1LocationData("Misc", 265_6355), - #"100 Acre Wood Pooh's House Start Fire": KH1LocationData("Misc", 265_6356), + "100 Acre Wood Pooh's House Start Fire": KH1LocationData("Misc", 265_6356), "100 Acre Wood Pooh's Room Cabinet": KH1LocationData("Misc", 265_6357), "100 Acre Wood Pooh's Room Chimney": KH1LocationData("Misc", 265_6358), "100 Acre Wood Bouncing Spot Break Log": KH1LocationData("Misc", 265_6359), @@ -393,6 +394,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Camp Save Gorillas": KH1LocationData("Misc", 265_6366), "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Misc", 265_6367), "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Misc", 265_6368), + "Olympus Coliseum Olympia Chest": KH1LocationData("Misc", 265_6369), "Traverse Town Synth Log": KH1LocationData("Synth", 265_6401), "Traverse Town Synth Cloth": KH1LocationData("Synth", 265_6402), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index b096b22ad9a7..86c832a07015 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -250,6 +250,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["End of the World"].locations.append("End of the World Final Dimension 8th Chest"), regions["End of the World"].locations.append("End of the World Final Dimension 7th Chest"), regions["End of the World"].locations.append("End of the World Giant Crevasse 3rd Chest"), + regions["End of the World"].locations.append("End of the World Giant Crevasse 5th Chest"), regions["End of the World"].locations.append("End of the World Giant Crevasse 1st Chest"), regions["End of the World"].locations.append("End of the World Giant Crevasse 4th Chest"), regions["End of the World"].locations.append("End of the World Giant Crevasse 2nd Chest"), @@ -260,7 +261,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["End of the World"].locations.append("End of the World World Terminus Agrabah Chest"), 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 Halloween Town 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 Neverland Chest"), regions["End of the World"].locations.append("End of the World World Terminus 100 Acre Wood 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 Final Rest Chest"), @@ -383,12 +384,12 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Watergleam") #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Fireglow") #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in all Summon Gems") - #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 500 Heartless") - #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 1000 Heartless") - #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 1500 Heartless") - #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 3000 Heartless") - #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 4000 Heartless") - #regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Defeat 5000 Heartless and Acquire All Summons") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 1") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 2") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 3") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 4") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 5") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto All Summons Reward") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Enter 30 Times") 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") @@ -434,7 +435,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 4") if atlantica: regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 5") - #regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Cabinet") regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Chimney") regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Break Log") @@ -447,6 +448,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Deep Jungle"].locations.append("Deep Jungle Camp Save Gorillas") regions["Deep Jungle"].locations.append("Deep Jungle Bamboo Thicket Save Gorillas") regions["Deep Jungle"].locations.append("Deep Jungle Climbing Trees Save Gorillas") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Olympia Chest") regions["Traverse Town"].locations.append("Traverse Town Synth Log") regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index ce9ec154b44c..2ec95b576134 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -303,14 +303,15 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World Giant Crevasse 5th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + #multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) #multiworld.get_location("End of the World World Terminus Traverse Town Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Wonderland Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Olympus Coliseum Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Deep Jungle Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World World Terminus Agrabah Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("End of the World World Terminus Agrabah Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) #multiworld.get_location("End of the World World Terminus Atlantica Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Halloween Town Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Neverland Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -432,12 +433,12 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Traverse Town Magician's Study Turn in Watergleam" , player).access_rule = lambda state: has_item(state, player, "Watergleam") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Magician's Study Turn in Fireglow" , player).access_rule = lambda state: has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Magician's Study Turn in all Summon Gems" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Watergleam") and has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") - #multiworld.get_location("Traverse Town Geppetto's House Defeat 500 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) - #multiworld.get_location("Traverse Town Geppetto's House Defeat 1000 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) - #multiworld.get_location("Traverse Town Geppetto's House Defeat 1500 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) - #multiworld.get_location("Traverse Town Geppetto's House Defeat 3000 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) - #multiworld.get_location("Traverse Town Geppetto's House Defeat 4000 Heartless" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) - #multiworld.get_location("Traverse Town Geppetto's House Defeat 5000 Heartless and Acquire All Summons" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) and has_all_summons(state, player) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 1" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 2" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 3" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 4" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 5" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) and has_all_summons(state, player) multiworld.get_location("Traverse Town Geppetto's House Enter 30 Times" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_all_arts(state, player) multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 1) @@ -483,7 +484,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) if atlantica: multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: has_torn_pages(state, player, 5) - #multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") + multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_torn_pages(state, player, 1) #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: has_torn_pages(state, player, 4) @@ -496,6 +497,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Deep Jungle Camp Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") From 43224f9dd32dbfe29014017fb5a74edcb632e4b5 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 14:10:56 -0500 Subject: [PATCH 084/284] Fixes --- worlds/kh1/Locations.py | 2 ++ worlds/kh1/Regions.py | 2 ++ worlds/kh1/Rules.py | 14 ++++++++------ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 0d091f08f150..63b4f936db05 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -262,6 +262,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town Defeat Guard Armor Blue Trinity Event": KH1LocationData("Events", 265_6013), "Traverse Town Leon Secret Waterway Earthshine Event": KH1LocationData("Events", 265_6014), "Traverse Town Kairi Secret Waterway Oathkeeper Event": KH1LocationData("Events", 265_6015), + "Traverse Town Defeat Guard Armor Brave Warrior Event": KH1LocationData("Events", 265_6016), "Deep Jungle Defeat Sabor White Fang Event": KH1LocationData("Events", 265_6021), "Deep Jungle Defeat Clayton Cure Event": KH1LocationData("Events", 265_6022), "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Events", 265_6023), @@ -289,6 +290,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Events", 265_6094), "Neverland Seal Keyhole Glide Event": KH1LocationData("Events", 265_6095), "Neverland Defeat Phantom Stop Event": KH1LocationData("Events", 265_6096), + "Neverland Defeat Captain Hook Ars Aracanum Event": KH1LocationData("Events", 265_6097), "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Events", 265_6101), "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Events", 265_6102), "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Events", 265_6103), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 86c832a07015..132b5bccdff8 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -273,6 +273,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Blue Trinity Event"), regions["Traverse Town"].locations.append("Traverse Town Leon Secret Waterway Earthshine Event"), regions["Traverse Town"].locations.append("Traverse Town Kairi Secret Waterway Oathkeeper Event"), + regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Brave Warrior Event"), regions["Deep Jungle"].locations.append("Deep Jungle Defeat Sabor White Fang Event"), regions["Deep Jungle"].locations.append("Deep Jungle Defeat Clayton Cure Event"), regions["Deep Jungle"].locations.append("Deep Jungle Seal Keyhole Jungle King Event"), @@ -302,6 +303,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") + regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Aracanum Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Donald Cheer Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Dragon Maleficent Fireglow Event") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 2ec95b576134..b6bda544f0d5 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -326,6 +326,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Traverse Town Defeat Guard Armor Blue Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town Leon Secret Waterway Earthshine Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event" , player).access_rule = lambda state: has_emblems(state, player) and has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) + #multiworld.get_location("Traverse Town Defeat Guard Armor Brave Warrior Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Deep Jungle Defeat Sabor White Fang Event" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Defeat Clayton Cure Event" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Seal Keyhole Jungle King Event" , player).access_rule = lambda state: has_slides(state, player) @@ -355,6 +356,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) + multiworld.get_location("Neverland Defeat Captain Hook Ars Aracanum Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event" , player).access_rule = lambda state: has_emblems(state, player) @@ -443,14 +445,14 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_all_arts(state, player) multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 1) multiworld.get_location("Traverse Town Magician's Study Obtained All LV3 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 3) - multiworld.get_location("Traverse Town Piano Room Return 10 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 12) - multiworld.get_location("Traverse Town Piano Room Return 20 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 24) + multiworld.get_location("Traverse Town Piano Room Return 10 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 10) + multiworld.get_location("Traverse Town Piano Room Return 20 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 20) multiworld.get_location("Traverse Town Piano Room Return 30 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 30) - multiworld.get_location("Traverse Town Piano Room Return 40 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 41) - multiworld.get_location("Traverse Town Piano Room Return 50 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 51) + multiworld.get_location("Traverse Town Piano Room Return 40 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 40) + multiworld.get_location("Traverse Town Piano Room Return 50 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 50) multiworld.get_location("Traverse Town Piano Room Return 60 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 60) - multiworld.get_location("Traverse Town Piano Room Return 70 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 72) - multiworld.get_location("Traverse Town Piano Room Return 80 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 81) + multiworld.get_location("Traverse Town Piano Room Return 70 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 70) + multiworld.get_location("Traverse Town Piano Room Return 80 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 80) multiworld.get_location("Traverse Town Piano Room Return 90 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 90) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 99) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 99) From ce1cdeb4ff37ad72b27edd9625304bf13cc3b816 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 14:11:47 -0500 Subject: [PATCH 085/284] Update Rules.py --- worlds/kh1/Rules.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index b6bda544f0d5..9dfc146be597 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -476,8 +476,8 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1" , player).access_rule = lambda state: has_torn_pages(state, player, 4) multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: has_torn_pages(state, player, 4) multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and can_glide(state, player) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and can_glide(state, player) if atlantica: multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: has_torn_pages(state, player, 5) multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: has_torn_pages(state, player, 1) From 2553aad31bdd1431c754516999b911b2b186e3f3 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 14:15:08 -0500 Subject: [PATCH 086/284] Update Rules.py --- worlds/kh1/Rules.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 9dfc146be597..788b2ee1436d 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -148,8 +148,8 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Deep Jungle Cliff Right Cliff Right Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Deep Jungle Tree House Suspended Boat Chest" , player).access_rule = lambda state: can_glide(state, player) #multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) multiworld.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) #multiworld.get_location("Agrabah Plaza By Storage Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Plaza Raised Terrace Chest" , player).access_rule = lambda state: has_item(state, player, "") From 0a042258008c5352ce5560c21433d5541cafce7d Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 14:19:16 -0500 Subject: [PATCH 087/284] Update Rules.py --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 788b2ee1436d..132e4e7de7cf 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -490,7 +490,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) multiworld.get_location("Deep Jungle Camp Hi-Potion Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") multiworld.get_location("Deep Jungle Camp Ether Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") #multiworld.get_location("Deep Jungle Camp Replication Experiment" , player).access_rule = lambda state: has_item(state, player, "") From cd87fe97aeb7313f2243eec7d10e453eba9815a3 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 14:21:37 -0500 Subject: [PATCH 088/284] Update Rules.py --- worlds/kh1/Rules.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 132e4e7de7cf..e829086b1648 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -474,10 +474,10 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Neverland Clock Tower 12:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Hold Aero Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and can_glide(state, player) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and can_glide(state, player) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) if atlantica: multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: has_torn_pages(state, player, 5) multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: has_torn_pages(state, player, 1) From 3526163891428efb1abaf2eaf57ed470ab381634 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 14:34:12 -0500 Subject: [PATCH 089/284] Fixes --- worlds/kh1/Locations.py | 2 +- worlds/kh1/Regions.py | 2 +- worlds/kh1/Rules.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 63b4f936db05..8e43d5f35e0c 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -290,7 +290,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Events", 265_6094), "Neverland Seal Keyhole Glide Event": KH1LocationData("Events", 265_6095), "Neverland Defeat Phantom Stop Event": KH1LocationData("Events", 265_6096), - "Neverland Defeat Captain Hook Ars Aracanum Event": KH1LocationData("Events", 265_6097), + "Neverland Defeat Captain Hook Ars Arcanum Event": KH1LocationData("Events", 265_6097), "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Events", 265_6101), "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Events", 265_6102), "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Events", 265_6103), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 132b5bccdff8..42aab0bbbdef 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -303,7 +303,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") - regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Aracanum Event") + regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Arcanum Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Donald Cheer Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Dragon Maleficent Fireglow Event") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index e829086b1648..4b6cb346880a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -356,7 +356,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) - multiworld.get_location("Neverland Defeat Captain Hook Ars Aracanum Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event" , player).access_rule = lambda state: has_emblems(state, player) @@ -486,7 +486,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) if atlantica: multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: has_torn_pages(state, player, 5) - multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_torn_pages(state, player, 1) + multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_torn_pages(state, player, 3) #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: has_torn_pages(state, player, 4) From 3f439cd5a8629420662bd410c6331ef9bc7de0cd Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 14:35:14 -0500 Subject: [PATCH 090/284] Update Rules.py --- worlds/kh1/Rules.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 4b6cb346880a..2dcb6ac7fc5f 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -292,16 +292,16 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Hollow Bastion Entrance Hall Push the Statue Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Hollow Bastion Rising Falls White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Final Dimension 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Final Dimension 4th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Final Dimension 5th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Final Dimension 6th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Final Dimension 10th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Final Dimension 9th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + #multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 4th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 5th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 6th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 10th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 9th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) multiworld.get_location("End of the World Giant Crevasse 5th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) From 6e64b0889c817726a2f4be39e1c7fd3163e908ff Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 14:45:14 -0500 Subject: [PATCH 091/284] Update Rules.py --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 2dcb6ac7fc5f..11cb419d0759 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -493,7 +493,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) multiworld.get_location("Deep Jungle Camp Hi-Potion Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") multiworld.get_location("Deep Jungle Camp Ether Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") - #multiworld.get_location("Deep Jungle Camp Replication Experiment" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Deep Jungle Camp Replication Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") multiworld.get_location("Deep Jungle Cliff Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Tree House Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Camp Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) From 38256c69b66c4e99b26be8c37a0e6fc633fc97c3 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 15:21:39 -0500 Subject: [PATCH 092/284] Update Options.py --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index fc1ae7d7bd98..58e2092926c5 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -75,7 +75,7 @@ class Goal(Choice): Postcards: Turn in all 10 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. - Super Boss Hunt: Ansem Reports are set to appear as rewards for defeating Phantom, Kurt Zisa, Sephiroth and Unknown. Forces require Final Ansem on. + Super Boss Hunt: Ansem Reports are set to appear as rewards for defeating Phantom, Kurt Zisa, Sephiroth, Ice Titan, and Unknown. Forces require Final Ansem on. """ display_name = "Goal" option_sephiroth = 0 From bc9b5b071148ca47546c76dc574699d42707246e Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 15:57:44 -0500 Subject: [PATCH 093/284] Old Book is not required --- worlds/kh1/Items.py | 2 +- worlds/kh1/Rules.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index caa37462bfd9..b2d2e003f12c 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -213,7 +213,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 6, weight = 10), - "Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 11cb419d0759..5a417f537935 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -486,7 +486,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) if atlantica: multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: has_torn_pages(state, player, 5) - multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_torn_pages(state, player, 3) + multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_torn_pages(state, player, 3) #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: has_torn_pages(state, player, 4) @@ -523,7 +523,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_x_worlds(state, player, 7) and has_reports(state, player, required_reports) - multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "Old Book") + multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") # Win condition. multiworld.completion_condition[player] = lambda state: state.has_all({"Victory"}, player) \ No newline at end of file From 1d4a7ed3ad93ef2ad60ca68f0dc720ccdabf808f Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 25 Mar 2024 16:40:29 -0500 Subject: [PATCH 094/284] Added Jungle Slider --- worlds/kh1/Locations.py | 5 +++++ worlds/kh1/Regions.py | 5 +++++ worlds/kh1/Rules.py | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 8e43d5f35e0c..6f97c10b9df3 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -397,6 +397,11 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Misc", 265_6367), "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Misc", 265_6368), "Olympus Coliseum Olympia Chest": KH1LocationData("Misc", 265_6369), + "Deep Jungle Jungle Slider 10 Fruits": KH1LocationData("Misc", 265_6370), + "Deep Jungle Jungle Slider 20 Fruits": KH1LocationData("Misc", 265_6371), + "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Misc", 265_6372), + "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Misc", 265_6373), + "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Misc", 265_6374), "Traverse Town Synth Log": KH1LocationData("Synth", 265_6401), "Traverse Town Synth Cloth": KH1LocationData("Synth", 265_6402), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 42aab0bbbdef..23f6c5375b4f 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -451,6 +451,11 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Deep Jungle"].locations.append("Deep Jungle Bamboo Thicket Save Gorillas") regions["Deep Jungle"].locations.append("Deep Jungle Climbing Trees Save Gorillas") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Olympia 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["Traverse Town"].locations.append("Traverse Town Synth Log") regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 5a417f537935..6c0e8ad326fb 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -500,6 +500,11 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Deep Jungle Jungle Slider 10 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") + multiworld.get_location("Deep Jungle Jungle Slider 20 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") + multiworld.get_location("Deep Jungle Jungle Slider 30 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") + multiworld.get_location("Deep Jungle Jungle Slider 40 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") + multiworld.get_location("Deep Jungle Jungle Slider 50 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") From 25780e4e234ea2b7883c558028033d31a14c212b Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 08:59:52 -0500 Subject: [PATCH 095/284] Add Cid Check --- worlds/kh1/Locations.py | 1 + worlds/kh1/Regions.py | 1 + worlds/kh1/Rules.py | 1 + 3 files changed, 3 insertions(+) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 6f97c10b9df3..2835440570b0 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -402,6 +402,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Misc", 265_6372), "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Misc", 265_6373), "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Misc", 265_6374), + "Traverse Town 1st District Speak with Cid Event": KH1LocationData("Misc", 265_6375), "Traverse Town Synth Log": KH1LocationData("Synth", 265_6401), "Traverse Town Synth Cloth": KH1LocationData("Synth", 265_6402), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 23f6c5375b4f..d9325bbec2c7 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -456,6 +456,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo 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["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") regions["Traverse Town"].locations.append("Traverse Town Synth Log") regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 6c0e8ad326fb..3943791bd23d 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -505,6 +505,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Deep Jungle Jungle Slider 30 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") multiworld.get_location("Deep Jungle Jungle Slider 40 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") multiworld.get_location("Deep Jungle Jungle Slider 50 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") + #multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") From 3cc8097fbd7f08a014d8f34e7da676e5c22026f2 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 09:06:46 -0500 Subject: [PATCH 096/284] Add Wonderland Book Check --- worlds/kh1/Locations.py | 1 + worlds/kh1/Regions.py | 1 + worlds/kh1/Rules.py | 1 + 3 files changed, 3 insertions(+) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 2835440570b0..3e67c64e55a4 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -403,6 +403,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Misc", 265_6373), "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Misc", 265_6374), "Traverse Town 1st District Speak with Cid Event": KH1LocationData("Misc", 265_6375), + "Wonderland Bizarre Room Read Book": KH1LocationData("Misc", 265_6376), "Traverse Town Synth Log": KH1LocationData("Synth", 265_6401), "Traverse Town Synth Cloth": KH1LocationData("Synth", 265_6402), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index d9325bbec2c7..5b74b00caa1c 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -457,6 +457,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 40 Fruits") regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 50 Fruits") regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") + regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") regions["Traverse Town"].locations.append("Traverse Town Synth Log") regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 3943791bd23d..165fffca0cbe 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -506,6 +506,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Deep Jungle Jungle Slider 40 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") multiworld.get_location("Deep Jungle Jungle Slider 50 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") #multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") From 6a7755e667d99af9062b8b592b46ef07fc34fbc3 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 09:09:33 -0500 Subject: [PATCH 097/284] Add OC Green Trinity --- worlds/kh1/Locations.py | 1 + worlds/kh1/Regions.py | 1 + worlds/kh1/Rules.py | 1 + 3 files changed, 3 insertions(+) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 3e67c64e55a4..92ebd043f991 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -404,6 +404,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Misc", 265_6374), "Traverse Town 1st District Speak with Cid Event": KH1LocationData("Misc", 265_6375), "Wonderland Bizarre Room Read Book": KH1LocationData("Misc", 265_6376), + "Olympus Coliseum Coliseum Gates Green Trinity": KH1LocationData("Misc", 265_6377), "Traverse Town Synth Log": KH1LocationData("Synth", 265_6401), "Traverse Town Synth Cloth": KH1LocationData("Synth", 265_6402), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 5b74b00caa1c..f08ee6d1c69f 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -458,6 +458,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 50 Fruits") regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Green Trinity") regions["Traverse Town"].locations.append("Traverse Town Synth Log") regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 165fffca0cbe..b4df7958031a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -507,6 +507,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Deep Jungle Jungle Slider 50 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") #multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: has_evidence(state, player) + multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") From ad8b8e15530805f3edc290edf8b286fe98e21200 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 09:13:11 -0500 Subject: [PATCH 098/284] Add Inferno Band Event --- worlds/kh1/Locations.py | 1 + worlds/kh1/Regions.py | 1 + worlds/kh1/Rules.py | 1 + 3 files changed, 3 insertions(+) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 92ebd043f991..f33d4b0bfcd5 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -268,6 +268,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Events", 265_6023), "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Events", 265_6024), "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Events", 265_6031), + "Olympus Coliseum Defeat Cerberus Inferno Band Event": KH1LocationData("Events", 265_6032), "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Events", 265_6041), "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Events", 265_6042), "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Events", 265_6051), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index f08ee6d1c69f..6d7529a5e30a 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -279,6 +279,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo 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["Olympus Coliseum"].locations.append("Olympus Coliseum Clear Phil's Training Thunder Event"), + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Cerberus Inferno Band Event"), regions["Olympus Coliseum"].locations.append("Olympus Coliseum Cloud Sonic Blade Event"), regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Blizzard Event"), regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Ifrit's Horn Event"), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index b4df7958031a..0f2ad3c129d4 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -332,6 +332,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Deep Jungle Seal Keyhole Jungle King Event" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Seal Keyhole Red Trinity Event" , player).access_rule = lambda state: has_slides(state, player) #multiworld.get_location("Olympus Coliseum Clear Phil's Training Thunder Event" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Olympus Coliseum Cloud Sonic Blade Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Defeat Trickmaster Blizzard Event" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event" , player).access_rule = lambda state: has_evidence(state, player) From 8fdfde389074d291fd56f6589f91d13383a848b2 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 09:29:47 -0500 Subject: [PATCH 099/284] Add Kurt Zisa Zantetsuken and Unknown EXP Necklace checks --- worlds/kh1/Locations.py | 2 ++ worlds/kh1/Regions.py | 2 ++ worlds/kh1/Rules.py | 4 +++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index f33d4b0bfcd5..ab98c79b455b 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -406,6 +406,8 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town 1st District Speak with Cid Event": KH1LocationData("Misc", 265_6375), "Wonderland Bizarre Room Read Book": KH1LocationData("Misc", 265_6376), "Olympus Coliseum Coliseum Gates Green Trinity": KH1LocationData("Misc", 265_6377), + "Agrabah Defeat Kurt Zisa Zantetsuken Event": KH1LocationData("Misc", 265_6378), + "Hollow Bastion Defeat Unknown EXP Necklace Event": KH1LocationData("Misc", 265_6379), "Traverse Town Synth Log": KH1LocationData("Synth", 265_6401), "Traverse Town Synth Cloth": KH1LocationData("Synth", 265_6402), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 6d7529a5e30a..f79beffe6f87 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -460,6 +460,8 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Green Trinity") + regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event") regions["Traverse Town"].locations.append("Traverse Town Synth Log") regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 0f2ad3c129d4..bf1acd9a18d0 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -18,7 +18,7 @@ def can_glide(state: CollectionState, player: int) -> bool: return state.has("Glide", player) or state.has("Superglide", player) def has_emblems(state: CollectionState, player: int) -> bool: - return state.has("Theon Vol. 6", player) and state.has("Red Trinity", player) and state.has("Progressive Fire", player) and (state.has("Progressive Thunder", player) or state.has("High Jump", player) or can_glide(state, player)) + return state.has("Theon Vol. 6", player) and state.has("Red Trinity", player) and state.has("Progressive Fire", player) and (state.has("Progressive Thunder", player) or state.has("High Jump", player) or can_glide(state, player)) and state.has("Hollow Bastion", player) def has_item(state: CollectionState, player: int, item) -> bool: return state.has(item, player) @@ -509,6 +509,8 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") From 525a5d9f3961802bec6906f98a835fce67d2ca10 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 09:32:44 -0500 Subject: [PATCH 100/284] Update Locations.py --- worlds/kh1/Locations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index ab98c79b455b..0604a3ac7db5 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -268,7 +268,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Events", 265_6023), "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Events", 265_6024), "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Events", 265_6031), - "Olympus Coliseum Defeat Cerberus Inferno Band Event": KH1LocationData("Events", 265_6032), + "Olympus Coliseum Defeat Cerberus Inferno Band Event": KH1LocationData("Events", 265_6033), "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Events", 265_6041), "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Events", 265_6042), "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Events", 265_6051), From 3d1e89675010dbf4184132e5db9dbe25aef2245e Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 09:34:40 -0500 Subject: [PATCH 101/284] Fix Final Ansem Goal --- worlds/kh1/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 44491f909790..029623bfb0bf 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -152,6 +152,8 @@ def pre_fill(self) -> None: for location_name in goal_dict[self.options.goal.current_key]: self.multiworld.get_location(location_name, self.player).place_locked_item(self.create_item("Ansem's Report " + str(report_no))) report_no = report_no + 1 + elif self.options.goal.current_key == "final_ansem": + self.multiworld.get_location("Final Ansem", self.player).place_locked_item(self.create_item("Victory")) else: self.multiworld.get_location(goal_dict[self.options.goal.current_key][0], self.player).place_locked_item(self.create_item("Victory")) From 5755de2fc82d2fba1cf68cfb1fd15fd885e54f87 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 09:36:02 -0500 Subject: [PATCH 102/284] Update __init__.py --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 029623bfb0bf..cf5ee69f6ba9 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -108,7 +108,7 @@ def create_items(self): reports_in_pool = max(int(self.options.required_reports), int(self.options.reports_in_pool)) if self.options.goal.current_key == "super_boss_hunt": i = 5 - elif self.options.require_final_ansem: + elif self.options.require_final_ansem and self.options.goal.current_key != "final_ansem": i = 1 else: i = 0 From cbffa8b9903cac2e31257f7004f9ccb83bfaff6f Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 09:36:33 -0500 Subject: [PATCH 103/284] Update __init__.py --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index cf5ee69f6ba9..7af5a65583a8 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -86,7 +86,7 @@ def create_items(self): total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - 1 if self.options.goal.current_key == "super_boss_hunt": total_locations = total_locations - 5 - elif self.options.goal.current_key != "Final Ansem" and self.options.require_final_ansem: + elif self.options.goal.current_key != "final_ansem" and self.options.require_final_ansem: total_locations = total_locations - 1 non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades", "Accessory", "Weapons"] if self.options.puppies == "full": From 87efbdb10dad5e06da91b858158d0ac2a0d8d6c8 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 12:05:47 -0500 Subject: [PATCH 104/284] Add options to exclude super bosses and 100 acre wood --- worlds/kh1/Items.py | 4 ++-- worlds/kh1/Options.py | 14 ++++++++++++++ worlds/kh1/Regions.py | 36 ++++++++++++++++++++---------------- worlds/kh1/Rules.py | 36 ++++++++++++++++++++---------------- worlds/kh1/__init__.py | 8 +++++--- 5 files changed, 61 insertions(+), 37 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index b2d2e003f12c..303120037c85 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -239,8 +239,8 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 3, weight = 10), #"Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 2": KH1ItemData("Key", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 3": KH1ItemData("Key", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 2": KH1ItemData("HAW", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 3": KH1ItemData("HAW", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 4": KH1ItemData("Key", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Slide 1": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 58e2092926c5..90a9ca067a40 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -64,6 +64,18 @@ class Atlantica(Toggle): """ display_name = "Atlantica" +class HundredAcreWood(Toggle): + """ + Toggle whether to include checks in the 100 Acre Wood + """ + display_name = "100 Acre Wood" + +class SuperBosses(Toggle): + """ + Toggle whether to include checks behind Super Bosses. This is ignored if Super Boss Hunt is your goal. + """ + display_name = "Super Bosses" + class Goal(Choice): """ Determines the goal of your playthrough. @@ -205,3 +217,5 @@ class KH1Options(PerGameCommonOptions): keyblade_min_mp: KeybladeMinMP puppies: Puppies require_final_ansem: RequireFinalAnsem + hundred_acre_wood: HundredAcreWood + super_bosses: SuperBosses diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index f79beffe6f87..ab4a2c6993bc 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,7 +9,7 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, levels: int, require_final_ansem: bool): +def create_regions(multiworld: MultiWorld, player: int, options, levels: int): regions: Dict[str, KH1RegionData] = { "Menu": KH1RegionData(None, ["Awakening", "Levels"]), "Awakening": KH1RegionData([], ["Destiny Islands"]), @@ -139,7 +139,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Monstro"].locations.append("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), regions["Monstro"].locations.append("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), regions["Monstro"].locations.append("Monstro Chamber 6 Low Chest"), - if atlantica: + if options.atlantica: regions["Atlantica"].locations.append("Atlantica Sunken Ship In Flipped Boat Chest"), regions["Atlantica"].locations.append("Atlantica Sunken Ship Seabed Chest"), regions["Atlantica"].locations.append("Atlantica Sunken Ship Inside Ship Chest"), @@ -291,7 +291,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Agrabah"].locations.append("Agrabah Seal Keyhole Green Trinity Event"), regions["Monstro"].locations.append("Monstro Defeat Parasite Cage I Goofy Cheer Event"), regions["Monstro"].locations.append("Monstro Defeat Parasite Cage II Stop Event"), - if atlantica: + if options.atlantica: regions["Atlantica"].locations.append("Atlantica Defeat Ursula I Mermaid Kick Event") regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Thunder Event") regions["Atlantica"].locations.append("Atlantica Seal Keyhole Crabclaw Event") @@ -303,7 +303,8 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Neverland"].locations.append("Neverland Seal Keyhole Fairy Harp Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") - regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") + if options.super_bosses and options.goal.current_key != "super_boss_hunt": + regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Arcanum Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Donald Cheer Event") @@ -326,7 +327,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Aero Event") - if atlantica: + if options.atlantica: regions["Atlantica"].locations.append("Atlantica Undersea Gorge Blizzard Clam") regions["Atlantica"].locations.append("Atlantica Undersea Gorge Ocean Floor Clam") regions["Atlantica"].locations.append("Atlantica Undersea Valley Higher Cave Clam") @@ -346,7 +347,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Ansem's Report 1") #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 2") - if atlantica: + if options.atlantica: regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Ansem's Report 3") #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 4") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Ansem's Report 5") @@ -355,9 +356,10 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") regions["Neverland"].locations.append("Neverland Defeat Hook Ansem's Report 9") #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") - regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") - regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") + if options.super_bosses and options.goal.current_key != "super_boss_hunt": + regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") for i in range(levels): regions["Levels"].locations.append("Level " + str(i+1).rjust(3,'0')) @@ -408,8 +410,9 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies") 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["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Ice Titan Diamond Dust Event") + if options.super_bosses and options.goal.current_key != "super_boss_hunt": + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") + 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") regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times") #regions["Neverland"].locations.append("Neverland Clock Tower 01:00 Door") @@ -430,13 +433,13 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 3") regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 4") regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 5") - if atlantica: + if options.atlantica: regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Owl Cheer") regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 1") regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 2") regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 3") regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 4") - if atlantica: + if options.atlantica: regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 5") regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Cabinet") @@ -460,8 +463,9 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Green Trinity") - regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event") + if options.super_bosses and options.goal.current_key != "super_boss_hunt": + regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event") regions["Traverse Town"].locations.append("Traverse Town Synth Log") regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") @@ -471,7 +475,7 @@ def create_regions(multiworld: MultiWorld, player: int, goal: str, atlantica: bo regions["Traverse Town"].locations.append("Traverse Town Synth Mushroom") - if goal == "final_ansem" or require_final_ansem: + if options.goal.current_key == "final_ansem" or options.require_final_ansem: regions["End of the World"].locations.append("Final Ansem") # Set up the regions correctly. diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index bf1acd9a18d0..ac1d3b82905c 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -84,7 +84,7 @@ def has_reports(state: CollectionState, player: int, required_reports: int) -> b reports_acquired = reports_acquired + 1 return reports_acquired >= required_reports -def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, required_reports: int): +def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #Location rules. #Keys #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -192,7 +192,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: has_item(state, player, "") - if atlantica: + if options.atlantica: #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -344,7 +344,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Agrabah Seal Keyhole Green Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Defeat Parasite Cage I Goofy Cheer Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Monstro Defeat Parasite Cage II Stop Event" , player).access_rule = lambda state: has_item(state, player, "High Jump") - if atlantica: + if options.atlantica: multiworld.get_location("Atlantica Defeat Ursula I Mermaid Kick Event" , player).access_rule = lambda state: has_offensive_magic(state, player) multiworld.get_location("Atlantica Defeat Ursula II Thunder Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) multiworld.get_location("Atlantica Seal Keyhole Crabclaw Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) @@ -356,7 +356,8 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Neverland Seal Keyhole Fairy Harp Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) + if options.super_bosses and options.goal.current_key != "super_boss_hunt": + multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: has_emblems(state, player) @@ -379,7 +380,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Traverse Town Defeat Opposite Armor Aero Event" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") - if atlantica: + if options.atlantica: multiworld.get_location("Atlantica Undersea Gorge Blizzard Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") #multiworld.get_location("Atlantica Undersea Gorge Ocean Floor Clam" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Undersea Valley Higher Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") @@ -399,7 +400,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Agrabah Defeat Jafar Genie Ansem's Report 1" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: has_emblems(state, player) - if atlantica: + if options.atlantica: multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5" , player).access_rule = lambda state: has_emblems(state, player) @@ -408,9 +409,10 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) - multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + if options.super_bosses and options.goal.current_key != "super_boss_hunt": + multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") @@ -457,8 +459,9 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("Traverse Town Piano Room Return 90 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 90) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 99) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 99) - multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Guard") + if options.super_bosses and options.goal.current_key != "super_boss_hunt": + multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Guard") multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) #multiworld.get_location("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") @@ -479,13 +482,13 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - if atlantica: + if options.atlantica: multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: has_torn_pages(state, player, 5) multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: has_torn_pages(state, player, 1) multiworld.get_location("100 Acre Wood Convert Torn Page 2" , player).access_rule = lambda state: has_torn_pages(state, player, 2) multiworld.get_location("100 Acre Wood Convert Torn Page 3" , player).access_rule = lambda state: has_torn_pages(state, player, 3) multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - if atlantica: + if options.atlantica: multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: has_torn_pages(state, player, 5) multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_torn_pages(state, player, 3) #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") @@ -509,8 +512,9 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r #multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) - multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + if options.super_bosses and options.goal.current_key != "super_boss_hunt": + multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") @@ -528,7 +532,7 @@ def set_rules(multiworld: MultiWorld, player: int, goal: str, atlantica: bool, r multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: has_item(state, player,"Deep Jungle") multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: has_item(state, player,"Agrabah") multiworld.get_entrance("Monstro" , player).access_rule = lambda state: has_item(state, player,"Monstro") - if atlantica: + if options.atlantica: multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 7af5a65583a8..2edacddb1276 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -97,6 +97,8 @@ def create_items(self): non_filler_item_categories.append("Puppies IND") if self.options.atlantica: non_filler_item_categories.append("Atlantica") + if self.options.hundred_acre_wood: + non_filler_item_categories.append("HAW") for name, data in item_table.items(): quantity = data.max_quantity @@ -198,9 +200,9 @@ def set_rules(self): reports_in_pool = max(self.options.reports_in_pool, 5) else: reports_in_pool = self.options.reports_in_pool - set_rules(self.multiworld, self.player, self.options.goal, self.options.atlantica, min(self.options.required_reports, reports_in_pool)) + set_rules(self.multiworld, self.player, self.options, min(self.options.required_reports, reports_in_pool)) def create_regions(self): - create_regions(self.multiworld, self.player, self.options.goal, self.options.atlantica \ + create_regions(self.multiworld, self.player, self.options \ , min((self.options.strength_increase + self.options.defense_increase + self.options.hp_increase + self.options.mp_increase \ - + self.options.ap_increase + self.options.accessory_slot_increase + self.options.item_slot_increase), 100), self.options.require_final_ansem) \ No newline at end of file + + self.options.ap_increase + self.options.accessory_slot_increase + self.options.item_slot_increase), 100)) \ No newline at end of file From 429abf1b348e7d14ffe1c22e30a923b4f93d9e36 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 15:46:20 -0500 Subject: [PATCH 105/284] Fix puppies trp, remove cid check --- worlds/kh1/Items.py | 2 +- worlds/kh1/Locations.py | 2 +- worlds/kh1/Regions.py | 2 +- worlds/kh1/Rules.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 303120037c85..92449092b655 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -394,7 +394,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Puppies 19-21": KH1ItemData("Puppies TRP", code = 264_2207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Puppies 22-24": KH1ItemData("Puppies TRP", code = 264_2208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Puppies 25-27": KH1ItemData("Puppies TRP", code = 264_2209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 27-30": KH1ItemData("Puppies TRP", code = 264_2210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 28-30": KH1ItemData("Puppies TRP", code = 264_2210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Puppies 31-33": KH1ItemData("Puppies TRP", code = 264_2211, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Puppies 34-36": KH1ItemData("Puppies TRP", code = 264_2212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Puppies 37-39": KH1ItemData("Puppies TRP", code = 264_2213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 0604a3ac7db5..a96c68dc9796 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -403,7 +403,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Misc", 265_6372), "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Misc", 265_6373), "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Misc", 265_6374), - "Traverse Town 1st District Speak with Cid Event": KH1LocationData("Misc", 265_6375), + #"Traverse Town 1st District Speak with Cid Event": KH1LocationData("Misc", 265_6375), "Wonderland Bizarre Room Read Book": KH1LocationData("Misc", 265_6376), "Olympus Coliseum Coliseum Gates Green Trinity": KH1LocationData("Misc", 265_6377), "Agrabah Defeat Kurt Zisa Zantetsuken Event": KH1LocationData("Misc", 265_6378), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index ab4a2c6993bc..812e9b8f79c2 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -460,7 +460,7 @@ def create_regions(multiworld: MultiWorld, player: int, options, levels: int): 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["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["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Green Trinity") if options.super_bosses and options.goal.current_key != "super_boss_hunt": diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index ac1d3b82905c..a982db84a297 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -43,7 +43,7 @@ def has_puppies(state: CollectionState, player: int, puppies_required: int) -> b if state.has("Puppy " + str(i).rjust(2,"0"), player): puppies_available = puppies_available + 1 for i in range(1,34): - if state.has("Puppies " + str(3*(i-1)).rjust(2, "0") + "-" + str(3*(i-1)+2).rjust(2, "0"), player): + if state.has("Puppies " + str(3*(i-1)+1).rjust(2, "0") + "-" + str(3*(i-1)+3).rjust(2, "0"), player): puppies_available = puppies_available + 3 if state.has("All Puppies", player): puppies_available = puppies_available + 99 From c2b02efe06de57db29478e228d04c020fbaf649b Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 26 Mar 2024 21:14:42 -0500 Subject: [PATCH 106/284] Fix 100 Acre Wood Option --- worlds/kh1/Options.py | 24 +++++++++++----------- worlds/kh1/Regions.py | 46 ++++++++++++++++++++++--------------------- worlds/kh1/Rules.py | 46 ++++++++++++++++++++++--------------------- 3 files changed, 60 insertions(+), 56 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 90a9ca067a40..0d207107d783 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -199,7 +199,19 @@ class KeybladeMaxMP(Range): @dataclass class KH1Options(PerGameCommonOptions): goal: Goal + require_final_ansem: RequireFinalAnsem + required_reports: RequiredReports + reports_in_pool: ReportsInPool + super_bosses: SuperBosses atlantica: Atlantica + hundred_acre_wood: HundredAcreWood + puppies: Puppies + exp_multiplier: EXPMultiplier + randomize_keyblade_stats: RandomizeKeybladeStats + keyblade_max_str: KeybladeMaxStrength + keyblade_min_str: KeybladeMinStrength + keyblade_max_mp: KeybladeMaxMP + keyblade_min_mp: KeybladeMinMP strength_increase: StrengthIncrease defense_increase: DefenseIncrease hp_increase: HPIncrease @@ -207,15 +219,3 @@ class KH1Options(PerGameCommonOptions): mp_increase: MPIncrease accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease - exp_multiplier: EXPMultiplier - required_reports: RequiredReports - reports_in_pool: ReportsInPool - randomize_keyblade_stats: RandomizeKeybladeStats - keyblade_max_str: KeybladeMaxStrength - keyblade_min_str: KeybladeMinStrength - keyblade_max_mp: KeybladeMaxMP - keyblade_min_mp: KeybladeMinMP - puppies: Puppies - require_final_ansem: RequireFinalAnsem - hundred_acre_wood: HundredAcreWood - super_bosses: SuperBosses diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 812e9b8f79c2..007a58efcbdf 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -94,10 +94,11 @@ def create_regions(multiworld: MultiWorld, player: int, options, levels: int): regions["Deep Jungle"].locations.append("Deep Jungle Cliff Right Cliff Left Chest"), regions["Deep Jungle"].locations.append("Deep Jungle Cliff Right Cliff Right Chest"), regions["Deep Jungle"].locations.append("Deep Jungle Tree House Suspended Boat Chest"), - 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"), - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), + 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"), + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), regions["Agrabah"].locations.append("Agrabah Plaza By Storage Chest"), regions["Agrabah"].locations.append("Agrabah Plaza Raised Terrace Chest"), regions["Agrabah"].locations.append("Agrabah Plaza Top Corner Chest"), @@ -428,24 +429,25 @@ def create_regions(multiworld: MultiWorld, player: int, options, levels: int): #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 Hold Aero Chest") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 1") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 2") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 3") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 4") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 5") - if options.atlantica: - regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Owl Cheer") - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 1") - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 2") - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 3") - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 4") - if options.atlantica: - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 5") - regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") - regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Cabinet") - regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Chimney") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Break Log") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh") + if options.hundred_acre_wood: + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 1") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 2") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 3") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 4") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 5") + if options.atlantica: + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Owl Cheer") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 1") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 2") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 3") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 4") + if options.atlantica: + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 5") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Cabinet") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Chimney") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Break Log") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh") regions["Deep Jungle"].locations.append("Deep Jungle Camp Hi-Potion Experiment") regions["Deep Jungle"].locations.append("Deep Jungle Camp Ether Experiment") regions["Deep Jungle"].locations.append("Deep Jungle Camp Replication Experiment") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index a982db84a297..33fac8e7654a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -147,10 +147,11 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #multiworld.get_location("Deep Jungle Cliff Right Cliff Left Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Deep Jungle Cliff Right Cliff Right Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Deep Jungle Tree House Suspended Boat Chest" , player).access_rule = lambda state: can_glide(state, player) - #multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + if options.hundred_acre_wood: + #multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) #multiworld.get_location("Agrabah Plaza By Storage Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Plaza Raised Terrace Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Plaza Top Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -477,24 +478,25 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #multiworld.get_location("Neverland Clock Tower 11:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Neverland Clock Tower 12:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Hold Aero Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - if options.atlantica: - multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: has_torn_pages(state, player, 5) - multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: has_torn_pages(state, player, 1) - multiworld.get_location("100 Acre Wood Convert Torn Page 2" , player).access_rule = lambda state: has_torn_pages(state, player, 2) - multiworld.get_location("100 Acre Wood Convert Torn Page 3" , player).access_rule = lambda state: has_torn_pages(state, player, 3) - multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - if options.atlantica: - multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: has_torn_pages(state, player, 5) - multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_torn_pages(state, player, 3) - #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + if options.hundred_acre_wood: + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + if options.atlantica: + multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: has_torn_pages(state, player, 5) + multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: has_torn_pages(state, player, 1) + multiworld.get_location("100 Acre Wood Convert Torn Page 2" , player).access_rule = lambda state: has_torn_pages(state, player, 2) + multiworld.get_location("100 Acre Wood Convert Torn Page 3" , player).access_rule = lambda state: has_torn_pages(state, player, 3) + multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + if options.atlantica: + multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: has_torn_pages(state, player, 5) + multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_torn_pages(state, player, 3) + #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) multiworld.get_location("Deep Jungle Camp Hi-Potion Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") multiworld.get_location("Deep Jungle Camp Ether Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") multiworld.get_location("Deep Jungle Camp Replication Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") From e82422460715c09dc861440d1a70903a322b681d Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 27 Mar 2024 07:56:35 -0500 Subject: [PATCH 107/284] Material to Empty Bottle --- worlds/kh1/Rules.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 33fac8e7654a..c4f138be0536 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -518,12 +518,12 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) - multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Synth Rope" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Synth Seagull Egg" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: has_at_least(state, player, "Material", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Rope" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Seagull Egg" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") #multiworld.get_location("Final Ansem" , player).access_rule = lambda state: has_item(state, player, "") From 3023f0db4d051febde53cf35875a14867b257c2d Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 27 Mar 2024 08:13:21 -0500 Subject: [PATCH 108/284] Fixed rules, location names, etc --- worlds/kh1/Locations.py | 4 ++-- worlds/kh1/Regions.py | 4 ++-- worlds/kh1/Rules.py | 18 +++++++++--------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index a96c68dc9796..83de1a223241 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -203,7 +203,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Hollow Bastion Great Crest After Battle Platform Chest": KH1LocationData("Chests", 265_4172), "Hollow Bastion High Tower 2nd Gravity Chest": KH1LocationData("Chests", 265_4173), "Hollow Bastion High Tower 1st Gravity Chest": KH1LocationData("Chests", 265_4174), - "Hollow Bastion High Tower Above Sliding Gates Chest": KH1LocationData("Chests", 265_4211), + "Hollow Bastion High Tower Above Sliding Blocks Chest": KH1LocationData("Chests", 265_4211), "Hollow Bastion Library Top of Bookshelf Chest": KH1LocationData("Chests", 265_4213), "Hollow Bastion Library 1st Floor Turn the Carousel Chest": KH1LocationData("Chests", 265_4214), "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest": KH1LocationData("Chests", 265_4251), @@ -340,7 +340,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town Geppetto's House Geppetto Reward 4": KH1LocationData("Misc", 265_6307), "Traverse Town Geppetto's House Geppetto Reward 5": KH1LocationData("Misc", 265_6308), "Traverse Town Geppetto's House Geppetto All Summons Reward": KH1LocationData("Misc", 265_6309), - "Traverse Town Geppetto's House Enter 30 Times": KH1LocationData("Misc", 265_6310), + "Traverse Town Geppetto's House Talk to Pinocchio": KH1LocationData("Misc", 265_6310), "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Misc", 265_6311), "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Misc", 265_6312), "Traverse Town Magician's Study Obtained All LV3 Magic": KH1LocationData("Misc", 265_6313), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 007a58efcbdf..d20842c47c89 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -215,7 +215,7 @@ def create_regions(multiworld: MultiWorld, player: int, options, levels: int): regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest After Battle Platform Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 2nd Gravity Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 1st Gravity Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower Above Sliding Gates Chest"), + regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower Above Sliding Blocks Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion Library 1st Floor Turn the Carousel Chest"), regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest"), @@ -396,7 +396,7 @@ def create_regions(multiworld: MultiWorld, player: int, options, levels: int): regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 4") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 5") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto All Summons Reward") - regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Enter 30 Times") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Talk to Pinocchio") 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") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index c4f138be0536..9354988efb76 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -268,7 +268,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) - multiworld.get_location("Hollow Bastion High Tower Above Sliding Gates Chest" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: can_glide(state, player) or has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Library 1st Floor Turn the Carousel Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest" , player).access_rule = lambda state: can_glide(state, player) or has_item(state, player, "Green Trinity") @@ -312,7 +312,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #multiworld.get_location("End of the World World Terminus Wonderland Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Olympus Coliseum Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Deep Jungle Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("End of the World World Terminus Agrabah Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("End of the World World Terminus Agrabah Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") #multiworld.get_location("End of the World World Terminus Atlantica Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Halloween Town Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Neverland Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -439,13 +439,13 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #multiworld.get_location("Traverse Town Magician's Study Turn in Watergleam" , player).access_rule = lambda state: has_item(state, player, "Watergleam") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Magician's Study Turn in Fireglow" , player).access_rule = lambda state: has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Magician's Study Turn in all Summon Gems" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Watergleam") and has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 1" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 2" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 3" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 4" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 5" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) and has_all_summons(state, player) - multiworld.get_location("Traverse Town Geppetto's House Enter 30 Times" , player).access_rule = lambda state: has_item(state, player, "Monstro") and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 1" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 2" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 3" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 4" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 5" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") + multiworld.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") and has_all_summons(state, player) + multiworld.get_location("Traverse Town Geppetto's House Talk to Pinocchio" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_all_arts(state, player) multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 1) multiworld.get_location("Traverse Town Magician's Study Obtained All LV3 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 3) From 1d9e14a2e106f893088bbdd535fddf0c9a447093 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 27 Mar 2024 09:17:14 -0500 Subject: [PATCH 109/284] Fix super bosses --- worlds/kh1/Regions.py | 8 ++++---- worlds/kh1/Rules.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index d20842c47c89..691d5080ffc4 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -304,7 +304,7 @@ def create_regions(multiworld: MultiWorld, player: int, options, levels: int): regions["Neverland"].locations.append("Neverland Seal Keyhole Fairy Harp Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") - if options.super_bosses and options.goal.current_key != "super_boss_hunt": + if options.super_bosses or options.goal.current_key == "super_boss_hunt": regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Arcanum Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") @@ -357,7 +357,7 @@ def create_regions(multiworld: MultiWorld, player: int, options, levels: int): regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") regions["Neverland"].locations.append("Neverland Defeat Hook Ansem's Report 9") #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") - if options.super_bosses and options.goal.current_key != "super_boss_hunt": + if options.super_bosses or options.goal.current_key == "super_boss_hunt": regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") @@ -411,7 +411,7 @@ def create_regions(multiworld: MultiWorld, player: int, options, levels: int): regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies") 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") - if options.super_bosses and options.goal.current_key != "super_boss_hunt": + if options.super_bosses or options.goal.current_key == "super_boss_hunt": regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") 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") @@ -465,7 +465,7 @@ def create_regions(multiworld: MultiWorld, player: int, options, levels: int): #regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Green Trinity") - if options.super_bosses and options.goal.current_key != "super_boss_hunt": + if options.super_bosses or options.goal.current_key == "super_boss_hunt": regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 9354988efb76..ac1a16504712 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -357,7 +357,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Neverland Seal Keyhole Fairy Harp Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - if options.super_bosses and options.goal.current_key != "super_boss_hunt": + if options.super_bosses or options.goal.current_key == "super_boss_hunt": multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") @@ -410,7 +410,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) - if options.super_bosses and options.goal.current_key != "super_boss_hunt": + if options.super_bosses or options.goal.current_key == "super_boss_hunt": multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) @@ -460,7 +460,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Traverse Town Piano Room Return 90 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 90) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 99) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 99) - if options.super_bosses and options.goal.current_key != "super_boss_hunt": + if options.super_bosses or options.goal.current_key == "super_boss_hunt": multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Guard") multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) @@ -514,7 +514,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - if options.super_bosses and options.goal.current_key != "super_boss_hunt": + if options.super_bosses or options.goal.current_key == "super_boss_hunt": multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) From 6b064e4084c27ebc33f9c4c3a7ad49b0b6159104 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 30 Mar 2024 18:38:01 -0500 Subject: [PATCH 110/284] Add item + location groups, level sanity --- worlds/kh1/Items.py | 10 +++++++++- worlds/kh1/Locations.py | 16 +++++++++++++--- worlds/kh1/Options.py | 27 +++++++++++++++++++++++++++ worlds/kh1/Regions.py | 4 ++-- worlds/kh1/Rules.py | 3 +++ worlds/kh1/__init__.py | 13 +++++++------ 6 files changed, 61 insertions(+), 12 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 92449092b655..92cd3d38e263 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -1,4 +1,4 @@ -from typing import Dict, NamedTuple, Optional +from typing import Dict, NamedTuple, Optional, Set from BaseClasses import Item, ItemClassification @@ -524,3 +524,11 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat event_item_table: Dict[str, KH1ItemData] = { } + +#Make item categories +item_name_groups: Dict[str, Set[str]] = {} +for item in item_table.keys(): + category = item_table[item].category + if category not in item_name_groups.keys(): + item_name_groups[category] = set([]) + item_name_groups[category].add(item) \ No newline at end of file diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 83de1a223241..9b08223ab552 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -1,4 +1,4 @@ -from typing import Dict, NamedTuple, Optional +from typing import Dict, NamedTuple, Optional, Set import typing @@ -203,7 +203,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Hollow Bastion Great Crest After Battle Platform Chest": KH1LocationData("Chests", 265_4172), "Hollow Bastion High Tower 2nd Gravity Chest": KH1LocationData("Chests", 265_4173), "Hollow Bastion High Tower 1st Gravity Chest": KH1LocationData("Chests", 265_4174), - "Hollow Bastion High Tower Above Sliding Blocks Chest": KH1LocationData("Chests", 265_4211), + "Hollow Bastion High Tower Above Sliding Blocks Chest": KH1LocationData("Chests", 265_4211), "Hollow Bastion Library Top of Bookshelf Chest": KH1LocationData("Chests", 265_4213), "Hollow Bastion Library 1st Floor Turn the Carousel Chest": KH1LocationData("Chests", 265_4214), "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest": KH1LocationData("Chests", 265_4251), @@ -554,4 +554,14 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: event_location_table: Dict[str, KH1LocationData] = { } -lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in location_table.items() if data.code} \ No newline at end of file +lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in location_table.items() if data.code} + +location_name_groups: Dict[str, Set[str]] + +#Make location categories +location_name_groups: Dict[str, Set[str]] = {} +for location in location_table.keys(): + category = location_table[location].category + if category not in location_name_groups.keys(): + location_name_groups[category] = set([]) + location_name_groups[category].add(location) \ No newline at end of file diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 0d207107d783..791d0c8fda56 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -196,6 +196,30 @@ class KeybladeMaxMP(Range): range_start = 1 range_end = 5 +class LevelChecks(Range): + """ + Determines the maximum level for which checks can be obtained. + """ + display_name = "Level Checks" + default = 100 + range_start = 0 + range_end = 100 + +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 only want to find AP items from levels 1-50, set this value to 51. + """ + display_name = "Force Stats on Level Starting From" + default = 1 + range_start = 1 + range_end = 101 + special_range_names = { + "none": 101, + "ap-checks-to-level-50": 51, + "all": 1 + } + @dataclass class KH1Options(PerGameCommonOptions): goal: Goal @@ -212,6 +236,8 @@ class KH1Options(PerGameCommonOptions): keyblade_min_str: KeybladeMinStrength keyblade_max_mp: KeybladeMaxMP keyblade_min_mp: KeybladeMinMP + level_checks: LevelChecks + force_stats_on_levels: ForceStatsOnLevels strength_increase: StrengthIncrease defense_increase: DefenseIncrease hp_increase: HPIncrease @@ -219,3 +245,4 @@ class KH1Options(PerGameCommonOptions): mp_increase: MPIncrease accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease + diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 691d5080ffc4..5a0ff7efa3bc 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,7 +9,7 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, options, levels: int): +def create_regions(multiworld: MultiWorld, player: int, options): regions: Dict[str, KH1RegionData] = { "Menu": KH1RegionData(None, ["Awakening", "Levels"]), "Awakening": KH1RegionData([], ["Destiny Islands"]), @@ -362,7 +362,7 @@ def create_regions(multiworld: MultiWorld, player: int, options, levels: int): regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") - for i in range(levels): + for i in range(options.level_checks): regions["Levels"].locations.append("Level " + str(i+1).rjust(3,'0')) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index ac1a16504712..bc5b0224881d 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -527,6 +527,9 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #multiworld.get_location("Final Ansem" , player).access_rule = lambda state: has_item(state, player, "") + + for i in range(options.level_checks): + multiworld.get_location("Level " + str(i+1).rjust(3,'0') , player).access_rule = lambda state, level_num=i: has_x_worlds(state, player, min((level_num//10), 8)) # Region rules. multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 2edacddb1276..129d9d231ced 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -79,9 +79,9 @@ def create_items(self): level_up_locations = list(get_locations_by_category("Levels").keys()) random.shuffle(level_up_item_pool) - i = 0 - while i < len(level_up_item_pool): - self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool[i])) + i = self.options.force_stats_on_levels - 1 + while len(level_up_item_pool) > 0 and i < self.options.level_checks: + self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) i = i + 1 total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - 1 if self.options.goal.current_key == "super_boss_hunt": @@ -118,6 +118,9 @@ def create_items(self): item_pool += [self.create_item("Ansem's Report " + str(i+1))] i = i + 1 + while len(item_pool) < total_locations and len(level_up_item_pool) > 0: + item_pool += [self.create_item(level_up_item_pool.pop())] + # Fill any empty locations with filler items. item_names = [] attempts = 0 # If we ever try to add items 200 times, and all the items are used up, lets clear the item_names array, we probably don't have enough items @@ -203,6 +206,4 @@ def set_rules(self): set_rules(self.multiworld, self.player, self.options, min(self.options.required_reports, reports_in_pool)) def create_regions(self): - create_regions(self.multiworld, self.player, self.options \ - , min((self.options.strength_increase + self.options.defense_increase + self.options.hp_increase + self.options.mp_increase \ - + self.options.ap_increase + self.options.accessory_slot_increase + self.options.item_slot_increase), 100)) \ No newline at end of file + create_regions(self.multiworld, self.player, self.options) \ No newline at end of file From 4e0453f75b3739d7cc41ce9f0658bde8a9aa24c7 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 30 Mar 2024 18:52:24 -0500 Subject: [PATCH 111/284] Fix location and item group names --- worlds/kh1/Locations.py | 6 +++--- worlds/kh1/Regions.py | 2 +- worlds/kh1/__init__.py | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 9b08223ab552..524f6f281e7e 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -250,7 +250,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "End of the World World Terminus Agrabah Chest": KH1LocationData("Chests", 265_4694), "End of the World World Terminus Atlantica Chest": KH1LocationData("Chests", 265_4731), "End of the World World Terminus Halloween Town Chest": KH1LocationData("Chests", 265_4732), - #"End of the World World Terminus Neverland Chest": KH1LocationData("Chests", 265_4733), + "End of the World World Terminus Neverland Chest": KH1LocationData("Chests", 265_4733), "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("Chests", 265_4734), "End of the World World Terminus Hollow Bastion Chest": KH1LocationData("Chests", 265_4771), "End of the World Final Rest Chest": KH1LocationData("Chests", 265_4772), @@ -357,8 +357,8 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town Piano Room Return 99 Puppies Reward 2": KH1LocationData("Misc", 265_6327), "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Misc", 265_6032), #Had to change the way we send this check, not changing location_id "Olympus Coliseum Defeat Sephiroth One-Winged Angel Event": KH1LocationData("Misc", 265_6328), - "Olympus Coliseum Defeat Ice Titan Diamond Dust Event": KH1LocationData("Misc", 265_6329), - "Olympus Coliseum Gates Purple Jar After Defeating Hades": KH1LocationData("Misc", 265_6330), + "Olympus Coliseum Defeat Ice Titan Diamond Dust Event": KH1LocationData("Cups", 265_6329), + "Olympus Coliseum Gates Purple Jar After Defeating Hades": KH1LocationData("Cups", 265_6330), "Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times": KH1LocationData("Misc", 265_6331), #"Neverland Clock Tower 01:00 Door": KH1LocationData("Misc", 265_6332), #"Neverland Clock Tower 02:00 Door": KH1LocationData("Misc", 265_6333), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 5a0ff7efa3bc..b14ba1887170 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -262,7 +262,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["End of the World"].locations.append("End of the World World Terminus Agrabah Chest"), 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 Halloween Town 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 Neverland Chest"), regions["End of the World"].locations.append("End of the World World Terminus 100 Acre Wood 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 Final Rest Chest"), diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 129d9d231ced..638adac1476b 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -2,8 +2,8 @@ from BaseClasses import Tutorial from worlds.AutoWorld import WebWorld, World -from .Items import KH1Item, KH1ItemData, event_item_table, get_items_by_category, item_table -from .Locations import KH1Location, location_table, get_locations_by_category +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 .Options import KH1Options from .Regions import create_regions from .Rules import set_rules @@ -46,6 +46,8 @@ class KH1World(World): item_name_to_id = {name: data.code for name, data in item_table.items()} location_name_to_id = {name: data.code for name, data in location_table.items()} + item_name_groups = item_name_groups + location_name_groups = location_name_groups def create_items(self): if self.options.reports_in_pool < self.options.required_reports: From 4094e34aa1ecf5e7416a135334b98e82c92e0cc8 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 30 Mar 2024 19:08:38 -0500 Subject: [PATCH 112/284] Add Bad Starting Weapons Option --- worlds/kh1/Options.py | 7 +++++++ worlds/kh1/__init__.py | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 791d0c8fda56..bf22bc21d185 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -220,6 +220,12 @@ class ForceStatsOnLevels(NamedRange): "all": 1 } +class BadStartingWeapons(Toggle): + """ + Forces Kingdom Key, Dream Sword, Dream Shield, and Dream Staff to have bad stats + """ + display_name = "Bad Starting Weapons" + @dataclass class KH1Options(PerGameCommonOptions): goal: Goal @@ -232,6 +238,7 @@ class KH1Options(PerGameCommonOptions): puppies: Puppies exp_multiplier: EXPMultiplier randomize_keyblade_stats: RandomizeKeybladeStats + bad_starting_weapons: BadStartingWeapons keyblade_max_str: KeybladeMaxStrength keyblade_min_str: KeybladeMinStrength keyblade_max_mp: KeybladeMaxMP diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 638adac1476b..dc50f6b3e5c5 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -188,7 +188,10 @@ def fill_slot_data(self) -> dict: max_mp_bonus = max(self.options.keyblade_min_mp, self.options.keyblade_max_mp) slot_data["Keyblade Stats"] = "" for i in range(22): - slot_data["Keyblade Stats"] = slot_data["Keyblade Stats"] + str(int(self.random.randrange(min_str_bonus,max_str_bonus))) + "," + str(int(self.random.randrange(min_mp_bonus,max_mp_bonus))) + "," + if i < 4 and self.options.bad_starting_weapons: + slot_data["Keyblade Stats"] = slot_data["Keyblade Stats"] + "1,0," + else: + slot_data["Keyblade Stats"] = slot_data["Keyblade Stats"] + str(int(self.random.randrange(min_str_bonus,max_str_bonus))) + "," + str(int(self.random.randrange(min_mp_bonus,max_mp_bonus))) + "," slot_data["Keyblade Stats"] = slot_data["Keyblade Stats"][:-1] return slot_data From 5b3b4212fb825f5aafa780b9014de6b40a161de0 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 30 Mar 2024 19:29:18 -0500 Subject: [PATCH 113/284] Logic Error for 100 Acre Wood --- worlds/kh1/Rules.py | 2 +- worlds/kh1/__init__.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index bc5b0224881d..3be02db2109f 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -57,8 +57,8 @@ def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> pages_available = pages_available + 1 if has_puppies(state, player, 51): pages_available = pages_available + 1 - pages_available = pages_available + state.count("Torn Page 1", player) pages_available = pages_available + state.count("Torn Page 2", player) + pages_available = pages_available + state.count("Torn Page 3", player) return pages_available >= pages_required def has_all_arts(state: CollectionState, player: int) -> bool: diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index dc50f6b3e5c5..951f321ca565 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -120,6 +120,10 @@ def create_items(self): item_pool += [self.create_item("Ansem's Report " + str(i+1))] i = i + 1 + print("KH1: Item Pool = " + str(len(item_pool))) + print("KH1: Locations = " + str(total_locations)) + print("KH1: Level Up Item Pool = " + str(len(level_up_item_pool))) + print("KH1: Adding " + str(min(len(level_up_item_pool), total_locations - len(item_pool))) + " Stat Increases to the Item Pool") while len(item_pool) < total_locations and len(level_up_item_pool) > 0: item_pool += [self.create_item(level_up_item_pool.pop())] From e5a9add84d36a466b663785a80dba6c7167e3844 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 10 Apr 2024 13:47:19 -0500 Subject: [PATCH 114/284] Update Rules.py --- worlds/kh1/Rules.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 3be02db2109f..a4fdc9d97728 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -200,7 +200,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #multiworld.get_location("Atlantica Ariel's Grotto High Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Ariel's Grotto Middle Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Ariel's Grotto Low Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_item(state, player, "Mermaid Kick") + multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") @@ -529,7 +529,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #multiworld.get_location("Final Ansem" , player).access_rule = lambda state: has_item(state, player, "") for i in range(options.level_checks): - multiworld.get_location("Level " + str(i+1).rjust(3,'0') , player).access_rule = lambda state, level_num=i: has_x_worlds(state, player, min((level_num//10), 8)) + multiworld.get_location("Level " + str(i+1).rjust(3,'0') , player).access_rule = lambda state, level_num=i: has_x_worlds(state, player, min(((level_num//10)*2), 8)) # Region rules. multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") From 1704333254c636298c10ea94d4c1f79a0b377356 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 12 Apr 2024 15:44:27 -0500 Subject: [PATCH 115/284] Update __init__.py --- worlds/kh1/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 951f321ca565..569e800c09d5 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -182,9 +182,9 @@ def fill_slot_data(self) -> dict: reports_in_pool = max(self.options.reports_in_pool, 5) else: reports_in_pool = self.options.reports_in_pool - required_reports = min(int(self.options.required_reports), reports_in_pool) + required_reports = min(int(self.options.required_reports.value), reports_in_pool) slot_data = {"EXP Multiplier": int(self.options.exp_multiplier)/16 - ,"Required Reports": required_reports} + ,"Required Reports": int(required_reports)} if self.options.randomize_keyblade_stats: min_str_bonus = min(self.options.keyblade_min_str, self.options.keyblade_max_str) max_str_bonus = max(self.options.keyblade_min_str, self.options.keyblade_max_str) From 3bb69ca73d24aa63832a5524aad2ab7b34cb210d Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 16 Apr 2024 09:44:02 -0500 Subject: [PATCH 116/284] Fixes related to randomized keyblade stats and super bosses --- worlds/kh1/Regions.py | 8 ++++++-- worlds/kh1/Rules.py | 6 +++++- worlds/kh1/__init__.py | 10 +++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index b14ba1887170..05ea92c0762e 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -359,7 +359,9 @@ def create_regions(multiworld: MultiWorld, player: int, options): #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") if options.super_bosses or options.goal.current_key == "super_boss_hunt": regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") + if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "sephiroth": regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") + if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "unknown": regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") for i in range(options.level_checks): @@ -411,8 +413,9 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies") 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") - if options.super_bosses or options.goal.current_key == "super_boss_hunt": + if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "sephiroth": regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") + if options.super_bosses or options.goal.current_key == "super_boss_hunt": 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") regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times") @@ -467,6 +470,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Green Trinity") if options.super_bosses or options.goal.current_key == "super_boss_hunt": regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event") + if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "unknown": regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event") regions["Traverse Town"].locations.append("Traverse Town Synth Log") @@ -477,7 +481,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Synth Mushroom") - if options.goal.current_key == "final_ansem" or options.require_final_ansem: + if options.goal.current_key == "final_ansem" or options.require_final_ansem or options.goal.current_key == "super_boss_hunt": regions["End of the World"].locations.append("Final Ansem") # Set up the regions correctly. diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index a4fdc9d97728..ef9ebcb28753 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -412,7 +412,9 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) if options.super_bosses or options.goal.current_key == "super_boss_hunt": multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "sephiroth": multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "unknown": multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") @@ -460,8 +462,9 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Traverse Town Piano Room Return 90 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 90) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 99) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 99) - if options.super_bosses or options.goal.current_key == "super_boss_hunt": + if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "sephiroth": multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + if options.super_bosses or options.goal.current_key == "super_boss_hunt": multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Guard") multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) #multiworld.get_location("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times" , player).access_rule = lambda state: has_item(state, player, "") @@ -516,6 +519,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") if options.super_bosses or options.goal.current_key == "super_boss_hunt": multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "unknown": multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 569e800c09d5..0890006ff47d 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -195,7 +195,15 @@ def fill_slot_data(self) -> dict: if i < 4 and self.options.bad_starting_weapons: slot_data["Keyblade Stats"] = slot_data["Keyblade Stats"] + "1,0," else: - slot_data["Keyblade Stats"] = slot_data["Keyblade Stats"] + str(int(self.random.randrange(min_str_bonus,max_str_bonus))) + "," + str(int(self.random.randrange(min_mp_bonus,max_mp_bonus))) + "," + if min_str_bonus != max_str_bonus: + str_bonus = int(self.random.randrange(min_str_bonus,max_str_bonus)) + else: + str_bonus = int(min_str_bonus) + if min_mp_bonus != max_mp_bonus: + mp_bonus = int(self.random.randrange(min_mp_bonus,max_mp_bonus)) + else: + mp_bonus = int(min_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] return slot_data From 6c4a071dcf86fbe353eede9e8018e8b4f5c1688e Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 22 Apr 2024 13:34:23 -0500 Subject: [PATCH 117/284] Credits and Fixes --- worlds/kh1/Options.py | 28 ++++++ .../en_Kingdom Hearts RE Chain of Memories.md | 40 --------- worlds/kh1/docs/en_Kingdom Hearts.md | 86 +++++++++++++++++++ worlds/kh1/docs/{khrecom_en.md => kh1_en.md} | 16 ++-- 4 files changed, 123 insertions(+), 47 deletions(-) delete mode 100644 worlds/kh1/docs/en_Kingdom Hearts RE Chain of Memories.md create mode 100644 worlds/kh1/docs/en_Kingdom Hearts.md rename worlds/kh1/docs/{khrecom_en.md => kh1_en.md} (68%) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index bf22bc21d185..771c27b01e7d 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -5,7 +5,11 @@ class StrengthIncrease(Range): """ Number of Strength Increases to Add to the Level Up Rewards + + The randomizer will add all stat up 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) at chosen at random. """ + display_name = "STR Increases" range_start = 0 range_end = 100 default = 24 @@ -13,7 +17,11 @@ class StrengthIncrease(Range): class DefenseIncrease(Range): """ Number of Defense Increases to Add to the Level Up Rewards + + The randomizer will add all stat up 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) at chosen at random. """ + display_name = "DEF Increases" range_start = 0 range_end = 100 default = 24 @@ -21,7 +29,11 @@ class DefenseIncrease(Range): class HPIncrease(Range): """ Number of HP Increases to Add to the Level Up Rewards + + The randomizer will add all stat up 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) at chosen at random. """ + display_name = "HP Increases" range_start = 0 range_end = 100 default = 23 @@ -29,7 +41,11 @@ class HPIncrease(Range): class APIncrease(Range): """ Number of AP Increases to Add to the Level Up Rewards + + The randomizer will add all stat up 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) at chosen at random. """ + display_name = "AP Increases" range_start = 0 range_end = 100 default = 18 @@ -37,7 +53,11 @@ class APIncrease(Range): class MPIncrease(Range): """ Number of MP Increases to Add to the Level Up Rewards + + The randomizer will add all stat up 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) at chosen at random. """ + display_name = "MP Increases" range_start = 0 range_end = 20 default = 7 @@ -45,7 +65,11 @@ class MPIncrease(Range): class AccessorySlotIncrease(Range): """ Number of Accessory Slot Increases to Add to the Level Up Rewards + + The randomizer will add all stat up 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) at chosen at random. """ + display_name = "Accessory Slot Increases" range_start = 0 range_end = 6 default = 1 @@ -53,7 +77,11 @@ class AccessorySlotIncrease(Range): class ItemSlotIncrease(Range): """ Number of Item Slot Increases to Add to the Level Up Rewards + + The randomizer will add all stat up 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) at chosen at random. """ + display_name = "Item Slot Increases" range_start = 0 range_end = 5 default = 3 diff --git a/worlds/kh1/docs/en_Kingdom Hearts RE Chain of Memories.md b/worlds/kh1/docs/en_Kingdom Hearts RE Chain of Memories.md deleted file mode 100644 index 95dd620283ce..000000000000 --- a/worlds/kh1/docs/en_Kingdom Hearts RE Chain of Memories.md +++ /dev/null @@ -1,40 +0,0 @@ -# Kingdom Hearts RE Chain of Memories (PC) - -## Where is the settings page? - -The [player settings page for this game](../player-settings) contains most of the options you need to -configure and export a config file. - -## What does randomization do to this game? - -The Kingdom Hearts RE Chain of Memories Randomizer will remove cards you pick up in the overworld, moogle shops, and as rewards from boss battles from your inventory. - -The entire castle is open from the start after completing Traverse Town. Floors you haven't unlocked are assigned Traverse Town, otherwise they will be assigned normally. - -Your goal is find all 7 friend cards (Aladdin, Ariel, Beast, Donald, Goofy, Jack, Peter Pan). These are tracked in your journal. - -## What items and locations get shuffled? - -###Items - -World Unlocks, Key of Rewards for each floor, Enemy Cards, and card sets are shuffled into the item pool. - -Card sets are comprised of a card type and a value range. For example, you might receive Blizzard 4-6, which means you receive Blizzard 4, Blizzard 5, and Blizzard 6. - -###Locations - -Journal entries for Attack, Magic, Summon, and Item Cards are locations, as well as the Enemy Card journal entries for boss enemy cards. - -Opening each floor's Room of Beginnings, Room of Guidance, and Room of Truth for the first time are also locations. - -## 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. - -## What do I do if I encounter a bug with the game? - -Please reach out to Gicu#7034 on Discord. \ No newline at end of file diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md new file mode 100644 index 000000000000..203310ce3fce --- /dev/null +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -0,0 +1,86 @@ +# Kingdom Hearts (PC) + +##Credits +This is a collaborative effort from several individuals in the Kingdom Hearts community, but most of all, denhonator. + +Denho's original KH rando laid the foundation for the work here and makes everything here possible, so thank you Denho for such a blast of a randomizer. + +Other credits include: + +Sonicshadowsilver2 for their work finding many memory addresses and working to idenitify and resolve bugs. + +Shananas and the rest of the OpenKH team for providing such an amazing tool for us to utilize on this project. + +Krujo and the team from the KH1 Critical Mix Riku mod for their work on the `Show Prompt` method. + +JaredWeakStrike for helping clean up my mess of code. + +## Where is the settings page? + +The [player settings page for this game](../player-settings) contains most of the options you need to +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. + +Worlds can only be accessed by finding the corresponding item. For example, you need to find the "Monstro" item to enter Monstro. + +The default goal is to enter End of the World and defeat Final Ansem. You can enter the world by obtaining a number of Ansem's Reports defined in your YAML. + +## What items and locations get shuffled? + +###Items + +Any weapon, accessory, spell, trinity, summon, world, key item, stat up, consumable, or ability can be found in any location. + +###Locations + +Locations the player can find items include chests, event rewards, Atlantica clams, level up rewards, 101 Dalmation rewards, and postcard rewards. + +## 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. + +## What do I do if I encounter a bug with the game? + +Please reach out to Gicu#7034 on Discord. + +## How do I progress 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. + +Phil Cup, Pegasus Cup, and Hercules Cup are all multiworld items. Finding all 3 grant you access to Hades Cup and the Platinum Match. Clearing all cups lets you challenge Ice Titan. + +###The slides aren't spawning in Deep Jungle. + +Find `Slide 1` in the multiworld. + +###I can't progress Halloween Town. + +Find `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? + +Find the required number of Ansem's Reports defined in your settings in the multiworld. + +##I am stuck in Hollow Bastion, how do I leave? + +You can open the full menu and warp out using `L1` + `L2` + `R2` + `Select` + +##I am still receiving vanilla rewards in several locations. +There are locations that still grant vanilla rewards, as it is currently not known how to remove them. Such locations include Atlantica Clams, Spinners in the Hollow Bastion Library, Puppy Rewards, and several Postcard Locations. + +Where these items are progression, they remain vanilla. Where they are filler items, they grant a check in addition to the vanilla reward. \ No newline at end of file diff --git a/worlds/kh1/docs/khrecom_en.md b/worlds/kh1/docs/kh1_en.md similarity index 68% rename from worlds/kh1/docs/khrecom_en.md rename to worlds/kh1/docs/kh1_en.md index edf8547045a4..9053fd1b4345 100644 --- a/worlds/kh1/docs/khrecom_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -1,4 +1,4 @@ -# Kingdom Hearts RECOM Randomizer Setup Guide +# Kingdom Hearts Randomizer Setup Guide ##Setting up the required mods 1. Install OpenKH and the LUA Backend. @@ -13,21 +13,21 @@ When prompted, install Panacea, then click "Next" - When prompted, check ReCoM plus any other AP game you play (KH2) and click "Install and configure LUA backend", then click "Next". + When prompted, check KH1 plus any other AP game you play and click "Install and configure LUA backend", then click "Next". Ensure that "Launch via Epic Games" is checked and click "Next" - Extract game data for ReCoM and any other AP game you play (KH2), then click "Next". + Extracting game data for KH1 is not required, you may skip it in the next step. Click "Finish" 2. Open "OpenKh.Tools.ModsManager.exe" -3. Click the drop down menu at the top-right and choose "Re:Chain of Memories" +3. Click the drop down menu at the top-right and choose "Kingdom Hearts 1" 4. Click `Mods>Install a New Mod` -5. In "Add a new mod from GitHub" paste `gaithern/KH-RECOM-AP-LUA` +5. In "Add a new mod from GitHub" paste `gaithern/KH-1FM-AP-LUA` 6. Click Install @@ -44,8 +44,10 @@ an experience customized for their taste, and different players in the same mult ### Where do I get a YAML file? -you can customize your settings by visiting the [Kingdom Hearts RE Chain of Memories Settings Page](/games/Kingdom%20Hearts%20RE%20Chain%20of%20Memories/player-settings). +you can customize your settings by visiting the [Kingdom Hearts Settings Page](/games/Kingdom%20Hearts/player-settings). ## Connect to the MultiServer -On the title screen, open your KHRECOM Client and connect to your MultiServer. +For first-time players, it is recommended to open your KH1 Client first before opening the game. + +On the title screen, open your KH1 Client and connect to your MultiServer. From 5b5b3a9f959deafb421412f2b1d94ef790b322f0 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 23 Apr 2024 10:19:37 -0500 Subject: [PATCH 118/284] Logic fixes, location name group changes --- worlds/kh1/Locations.py | 4 ++-- worlds/kh1/Rules.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 524f6f281e7e..fa0b2c6901cc 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -397,7 +397,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Deep Jungle Camp Save Gorillas": KH1LocationData("Misc", 265_6366), "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Misc", 265_6367), "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Misc", 265_6368), - "Olympus Coliseum Olympia Chest": KH1LocationData("Misc", 265_6369), + "Olympus Coliseum Olympia Chest": KH1LocationData("Cups", 265_6369), "Deep Jungle Jungle Slider 10 Fruits": KH1LocationData("Misc", 265_6370), "Deep Jungle Jungle Slider 20 Fruits": KH1LocationData("Misc", 265_6371), "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Misc", 265_6372), @@ -423,7 +423,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Hollow Bastion Defeat Maleficent Ansem's Report 5": KH1LocationData("Reports", 265_7014), #"Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Reports", 265_7013), "Halloween Town Defeat Oogie Boogie Ansem's Report 7": KH1LocationData("Reports", 265_7012), - "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Reports", 265_7011), + "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Cups", 265_7011), "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Reports", 265_7028), #"Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Reports", 265_7027), "Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Reports", 265_7026), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index ef9ebcb28753..a96de8c5fc1a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -171,7 +171,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -448,7 +448,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 5" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") multiworld.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") and has_all_summons(state, player) multiworld.get_location("Traverse Town Geppetto's House Talk to Pinocchio" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") - multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") and has_all_arts(state, player) + multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 1) and has_all_arts(state, player) and has_x_worlds(state, player, 7) multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 1) multiworld.get_location("Traverse Town Magician's Study Obtained All LV3 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 3) multiworld.get_location("Traverse Town Piano Room Return 10 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 10) From f21bf66aabc28be0abb3158bb4fbd9e5c6d5d47b Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 23 Apr 2024 10:53:48 -0500 Subject: [PATCH 119/284] Update Options.py --- worlds/kh1/Options.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 771c27b01e7d..fc512fe7563f 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -168,7 +168,7 @@ class RequiredReports(Range): """ Determines the number of Ansem's Reports needed to open End of the World """ - diplay_name = "Reports to Open End of the World" + display_name = "Reports to Open End of the World" default = 4 range_start = 1 range_end = 13 @@ -177,7 +177,7 @@ class ReportsInPool(Range): """ Determines the number of Ansem's Reports in the item pool. """ - diplay_name = "Reports in Pool" + display_name = "Reports in Pool" default = 4 range_start = 1 range_end = 13 From 5ff82afc82402e93dfc67f522235fad349235337 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Tue, 23 Apr 2024 12:12:27 -0500 Subject: [PATCH 120/284] Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 0890006ff47d..72dd32289c43 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -175,7 +175,7 @@ def get_filler_item_name(self) -> str: fillers.update(get_items_by_category("Camping", disclude)) fillers.update(get_items_by_category("Stat Ups", disclude)) weights = [data.weight for data in fillers.values()] - return self.multiworld.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] + return self.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] def fill_slot_data(self) -> dict: if self.options.goal.current_key == "super_boss_hunt": From 25bd9bd9a8a9b34d93778d80d59d56120e6abb6d Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Tue, 23 Apr 2024 12:12:39 -0500 Subject: [PATCH 121/284] Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright --- worlds/kh1/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 72dd32289c43..644ccf6f70d1 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -77,10 +77,10 @@ def create_items(self): # Fill remaining pool with items from other pool while len(level_up_item_pool) < 100 and len(possible_level_up_item_pool) > 0: - level_up_item_pool.append(possible_level_up_item_pool.pop(random.randrange(len(possible_level_up_item_pool)))) + level_up_item_pool.append(possible_level_up_item_pool.pop(self.random.randrange(len(possible_level_up_item_pool)))) level_up_locations = list(get_locations_by_category("Levels").keys()) - random.shuffle(level_up_item_pool) + self.random.shuffle(level_up_item_pool) i = self.options.force_stats_on_levels - 1 while len(level_up_item_pool) > 0 and i < self.options.level_checks: self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) From 22b720cece32700531d5b2ae84928450521545e3 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Tue, 23 Apr 2024 12:12:46 -0500 Subject: [PATCH 122/284] Update worlds/kh1/docs/kh1_en.md Co-authored-by: Scipio Wright --- worlds/kh1/docs/kh1_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index 9053fd1b4345..ff73cc77bace 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -44,7 +44,7 @@ an experience customized for their taste, and different players in the same mult ### Where do I get a YAML file? -you can customize your settings by visiting the [Kingdom Hearts Settings Page](/games/Kingdom%20Hearts/player-settings). +you can customize your settings by visiting the [Kingdom Hearts Options Page](/games/Kingdom%20Hearts/player-options). ## Connect to the MultiServer From c192b9cfbee7591e1cc1c419e44ca8b447c56c57 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Tue, 23 Apr 2024 12:12:52 -0500 Subject: [PATCH 123/284] Update worlds/kh1/docs/en_Kingdom Hearts.md Co-authored-by: Scipio Wright --- worlds/kh1/docs/en_Kingdom Hearts.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 203310ce3fce..8b3469aa5afc 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -15,9 +15,9 @@ Krujo and the team from the KH1 Critical Mix Riku mod for their work on the `Sho JaredWeakStrike for helping clean up my mess of code. -## Where is the settings page? +## Where is the options page? -The [player settings page for this game](../player-settings) contains most of the options you need to +The [player options page for this game](../player-options) contains most of the options you need to configure and export a config file. ## What does randomization do to this game? From 8cf67bc65d52236cccf58b8e370c1985ee55d134 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 23 Apr 2024 12:15:21 -0500 Subject: [PATCH 124/284] Update .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index abeef96895fe..022abe38fe40 100644 --- a/.gitignore +++ b/.gitignore @@ -198,4 +198,3 @@ minecraft_versions.json .LSOverride Thumbs.db [Dd]esktop.ini -worlds/tracker.apworld From 9ab363c141146f0f78bf56aa23890de23f181f5b Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 23 Apr 2024 12:16:03 -0500 Subject: [PATCH 125/284] Update CODEOWNERS --- docs/CODEOWNERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index ffe63874553a..61ccbde14702 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -76,6 +76,9 @@ # Kirby's Dream Land 3 /worlds/kdl3/ @Silvris +# Kingdom Hearts +/worlds/kh1/ @GICU + # Kingdom Hearts 2 /worlds/kh2/ @JaredWeakStrike From 9f1a45b46671fb0811ca8e32552508da5712164a Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Tue, 23 Apr 2024 12:37:07 -0500 Subject: [PATCH 126/284] Update docs/CODEOWNERS Co-authored-by: Scipio Wright --- docs/CODEOWNERS | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 61ccbde14702..55161eb36e98 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -77,8 +77,7 @@ /worlds/kdl3/ @Silvris # Kingdom Hearts -/worlds/kh1/ @GICU - +/worlds/kh1/ @gaithern # Kingdom Hearts 2 /worlds/kh2/ @JaredWeakStrike From 56c0489676317dfbbc57514dfd38656edd9403a9 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 23 Apr 2024 13:51:15 -0500 Subject: [PATCH 127/284] Fixed Atlantica item group name --- worlds/kh1/Items.py | 4 ++-- worlds/kh1/__init__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 92cd3d38e263..88ec1391ef2d 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -283,7 +283,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Mythril": KH1ItemData("Synthesis", code = 264_1254, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Mermaid Kick": KH1ItemData("Atlantica" , code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Mermaid Kick": KH1ItemData("AL" , code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Puppy 01": KH1ItemData("Puppies IND", code = 264_2101, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -506,7 +506,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Deep Jungle": KH1ItemData("Worlds", code = 264_7004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Agrabah": KH1ItemData("Worlds", code = 264_7005, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Halloween Town": KH1ItemData("Worlds", code = 264_7006, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Atlantica": KH1ItemData("Atlantica", code = 264_7007, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Atlantica": KH1ItemData("AL", code = 264_7007, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 644ccf6f70d1..950b7a06edd7 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -98,7 +98,7 @@ def create_items(self): if self.options.puppies == "individual": non_filler_item_categories.append("Puppies IND") if self.options.atlantica: - non_filler_item_categories.append("Atlantica") + non_filler_item_categories.append("AL") if self.options.hundred_acre_wood: non_filler_item_categories.append("HAW") for name, data in item_table.items(): From e908fd4a0f046df9da501a08fd378a6ff0bff2b6 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 23 Apr 2024 14:37:29 -0500 Subject: [PATCH 128/284] Update CODEOWNERS --- docs/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 55161eb36e98..d85eb49513b1 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -78,6 +78,7 @@ # Kingdom Hearts /worlds/kh1/ @gaithern + # Kingdom Hearts 2 /worlds/kh2/ @JaredWeakStrike From 0577ff981767acdea43462a496c99f131fc2f151 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 24 Apr 2024 08:18:15 -0500 Subject: [PATCH 129/284] Update Client.py --- worlds/kh1/Client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index c84dd087cbe0..e333ae6829d3 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -175,7 +175,7 @@ def on_package(self, cmd: str, args: dict): + str(locationID)) f.close() - def on_deathlink(self, data: typing.Dict[str, typing.Any]): + def on_deathlink(self, data: dict[str, object]): self.last_death_link = max(data["time"], self.last_death_link) text = data.get("cause", "") if text: From 9e76e0116e3d2aeb27026759f5d878e450d1b38e Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 24 Apr 2024 08:29:39 -0500 Subject: [PATCH 130/284] Update Items.py --- worlds/kh1/Items.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 88ec1391ef2d..28c99ea4c4a3 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -26,7 +26,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat item_table: Dict[str, KH1ItemData] = { - "Victory": KH1ItemData("Victory", code = 264_0000, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Victory": KH1ItemData("VIC", code = 264_0000, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, weight = 10), "Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, weight = 10), "Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, weight = 10), @@ -478,7 +478,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "EXP Zero": KH1ItemData("EXP Zero", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "EXP Zero": KH1ItemData("XPZ", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Max MP Increase": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15, weight = 10), From 885c399b5ae5b01a0c29171049fa802fa9cf7f3a Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:13:39 -0500 Subject: [PATCH 131/284] Update __init__.py Co-authored-by: Scipio Wright --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 950b7a06edd7..8e31f3b28b3c 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -96,7 +96,7 @@ def create_items(self): if self.options.puppies == "triplets": non_filler_item_categories.append("Puppies TRP") if self.options.puppies == "individual": - non_filler_item_categories.append("Puppies IND") + non_filler_item_categories.append("Puppies IND") if self.options.atlantica: non_filler_item_categories.append("AL") if self.options.hundred_acre_wood: From 17d513592e78e25b2fb13d2e36ddd57d1c7b5fea Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:15:33 -0500 Subject: [PATCH 132/284] Update Rules.py Co-authored-by: Scipio Wright --- worlds/kh1/Rules.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index a96de8c5fc1a..bb1c9177131c 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -38,16 +38,13 @@ def has_postcards(state: CollectionState, player: int, postcards_required: int) return postcards_available >= postcards_required def has_puppies(state: CollectionState, player: int, puppies_required: int) -> bool: - puppies_available = 0 - for i in range(1,100): - if state.has("Puppy " + str(i).rjust(2,"0"), player): - puppies_available = puppies_available + 1 - for i in range(1,34): - if state.has("Puppies " + str(3*(i-1)+1).rjust(2, "0") + "-" + str(3*(i-1)+3).rjust(2, "0"), player): - puppies_available = puppies_available + 3 if state.has("All Puppies", player): - puppies_available = puppies_available + 99 - return puppies_available >= puppies_required + return True + if state.has_group("Puppies TRP", player, -(puppies_required//-3)): + return True + if state.has_group("Puppies IND", player, puppies_required): + return True + return False def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> bool: pages_available = 0 From e1f44a09208c92f2040bf1de0ab583f41e9cf2e6 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:15:53 -0500 Subject: [PATCH 133/284] Update Rules.py Co-authored-by: Scipio Wright --- worlds/kh1/Rules.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index bb1c9177131c..77d3183f9f24 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -59,8 +59,7 @@ def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> return pages_available >= pages_required def has_all_arts(state: CollectionState, player: int) -> bool: - return state.has("Fire Arts", player) and state.has("Blizzard Arts", player) and state.has("Thunder Arts", player) \ - and state.has("Cure Arts", player) and state.has("Gravity Arts", player) and state.has("Stop Arts", player) and state.has("Aero Arts", player) + return state.has_all({"Fire Arts", "Blizzard Arts", "Thunder Arts", "Cure Arts", "Gravity Arts", "Stop Arts", "Aero Arts"}, player) def has_all_summons(state: CollectionState, player: int) -> bool: return state.has("Simba", player) and state.has("Bambi", player) and state.has("Genie", player) \ From 13ffb184b705d19866dbb307fc54bef86a8802ff Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:18:12 -0500 Subject: [PATCH 134/284] Update Rules.py Co-authored-by: Scipio Wright --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 77d3183f9f24..0cc5a6558ba4 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -71,7 +71,7 @@ def has_all_magic_lvx(state: CollectionState, player: int, level) -> bool: and state.count("Progressive Stop", player) >= level def has_offensive_magic(state: CollectionState, player: int) -> bool: - return state.has("Progressive Fire", player) or state.has("Progressive Blizzard", player) or state.has("Progressive Thunder", player) or state.has("Progressive Gravity", player) or state.has("Progressive Stop", player) + return state.has_any({"Progressive Fire", "Progressive Blizzard", "Progressive Thunder", "Progressive Gravity", "Progressive Stop"}, player) def has_reports(state: CollectionState, player: int, required_reports: int) -> bool: reports_acquired = 0 From 574715d01dd365f34b3afdb91f4bad718a8cedad Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:35:50 -0500 Subject: [PATCH 135/284] Update worlds/kh1/Rules.py Co-authored-by: Scipio Wright --- worlds/kh1/Rules.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 0cc5a6558ba4..d91689b519ef 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,5 +1,4 @@ -from BaseClasses import CollectionState, MultiWorld, LocationProgressType -from .Locations import get_locations_by_category +from BaseClasses import CollectionState, MultiWorld def has_x_worlds(state: CollectionState, player: int, num_of_worlds) -> bool: From 815c34ac74475332d9559d466f7d91295a5f167d Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Wed, 24 Apr 2024 20:21:05 -0500 Subject: [PATCH 136/284] Update worlds/kh1/Rules.py Co-authored-by: Scipio Wright --- worlds/kh1/Rules.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index d91689b519ef..f6b40d2f97eb 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -19,10 +19,10 @@ def can_glide(state: CollectionState, player: int) -> bool: def has_emblems(state: CollectionState, player: int) -> bool: return state.has("Theon Vol. 6", player) and state.has("Red Trinity", player) and state.has("Progressive Fire", player) and (state.has("Progressive Thunder", player) or state.has("High Jump", player) or can_glide(state, player)) and state.has("Hollow Bastion", player) -def has_item(state: CollectionState, player: int, item) -> bool: +def has_item(state: CollectionState, player: int, item: str) -> bool: return state.has(item, player) -def has_at_least(state: CollectionState, player: int, item, x) -> bool: +def has_at_least(state: CollectionState, player: int, item: str, x: int) -> bool: return state.count(item, player) >= x def has_postcards(state: CollectionState, player: int, postcards_required: int) -> bool: From 10be74b67966e75e42caf8252749e9ed381f8a0c Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Wed, 24 Apr 2024 20:21:50 -0500 Subject: [PATCH 137/284] Update worlds/kh1/Rules.py Co-authored-by: Scipio Wright --- worlds/kh1/Rules.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index f6b40d2f97eb..5bce9e76ba43 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -73,11 +73,7 @@ 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, required_reports: int) -> bool: - reports_acquired = 0 - for x in range(13): - if has_item(state, player, "Ansem's Report " + str(x+1)): - reports_acquired = reports_acquired + 1 - return reports_acquired >= required_reports + return state.has_group("Unlock", player, required_reports) def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #Location rules. From 407b7812a52e3cf60107784789c183db355722f1 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 24 Apr 2024 20:23:03 -0500 Subject: [PATCH 138/284] Fixed report group name --- worlds/kh1/Items.py | 296 ++++++++++++++++++++++---------------------- worlds/kh1/Rules.py | 2 +- 2 files changed, 149 insertions(+), 149 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 28c99ea4c4a3..638b38ff1516 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -175,9 +175,9 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, weight = 10), #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, weight = 10), #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, weight = 10), - "Ansem's Report 11": KH1ItemData("Unlock", code = 264_1149, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 12": KH1ItemData("Unlock", code = 264_1150, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 13": KH1ItemData("Unlock", code = 264_1151, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 11": KH1ItemData("Reports", code = 264_1149, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 12": KH1ItemData("Reports", code = 264_1150, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 13": KH1ItemData("Reports", code = 264_1151, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, weight = 10), "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, weight = 10), "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, weight = 10), @@ -194,16 +194,16 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Shiitank Rank": KH1ItemData("Synthesis", code = 264_1165, classification = ItemClassification.filler, weight = 10), #"Matsutake Rank": KH1ItemData("Synthesis", code = 264_1166, classification = ItemClassification.filler, weight = 10), #"Mystery Mold": KH1ItemData("Synthesis", code = 264_1167, classification = ItemClassification.filler, weight = 10), - "Ansem's Report 1": KH1ItemData("Unlock", code = 264_1168, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 2": KH1ItemData("Unlock", code = 264_1169, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 3": KH1ItemData("Unlock", code = 264_1170, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 4": KH1ItemData("Unlock", code = 264_1171, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 5": KH1ItemData("Unlock", code = 264_1172, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 6": KH1ItemData("Unlock", code = 264_1173, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 7": KH1ItemData("Unlock", code = 264_1174, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 8": KH1ItemData("Unlock", code = 264_1175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 9": KH1ItemData("Unlock", code = 264_1176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 10": KH1ItemData("Unlock", code = 264_1177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 1": KH1ItemData("Reports", code = 264_1168, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 2": KH1ItemData("Reports", code = 264_1169, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 3": KH1ItemData("Reports", code = 264_1170, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 4": KH1ItemData("Reports", code = 264_1171, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 5": KH1ItemData("Reports", code = 264_1172, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 6": KH1ItemData("Reports", code = 264_1173, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 7": KH1ItemData("Reports", code = 264_1174, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 8": KH1ItemData("Reports", code = 264_1175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 9": KH1ItemData("Reports", code = 264_1176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Ansem's Report 10": KH1ItemData("Reports", code = 264_1177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Khama Vol. 8": KH1ItemData("Key", code = 264_1178, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Salegg Vol. 6": KH1ItemData("Key", code = 264_1179, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Azal Vol. 3": KH1ItemData("Key", code = 264_1180, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -283,142 +283,142 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Mythril": KH1ItemData("Synthesis", code = 264_1254, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Mermaid Kick": KH1ItemData("AL" , code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 01": KH1ItemData("Puppies IND", code = 264_2101, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 02": KH1ItemData("Puppies IND", code = 264_2102, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 03": KH1ItemData("Puppies IND", code = 264_2103, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 04": KH1ItemData("Puppies IND", code = 264_2104, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 05": KH1ItemData("Puppies IND", code = 264_2105, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 06": KH1ItemData("Puppies IND", code = 264_2106, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 07": KH1ItemData("Puppies IND", code = 264_2107, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 08": KH1ItemData("Puppies IND", code = 264_2108, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 09": KH1ItemData("Puppies IND", code = 264_2109, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 10": KH1ItemData("Puppies IND", code = 264_2110, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 11": KH1ItemData("Puppies IND", code = 264_2111, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 12": KH1ItemData("Puppies IND", code = 264_2112, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 13": KH1ItemData("Puppies IND", code = 264_2113, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 14": KH1ItemData("Puppies IND", code = 264_2114, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 15": KH1ItemData("Puppies IND", code = 264_2115, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 16": KH1ItemData("Puppies IND", code = 264_2116, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 17": KH1ItemData("Puppies IND", code = 264_2117, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 18": KH1ItemData("Puppies IND", code = 264_2118, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 19": KH1ItemData("Puppies IND", code = 264_2119, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 20": KH1ItemData("Puppies IND", code = 264_2120, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 21": KH1ItemData("Puppies IND", code = 264_2121, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 22": KH1ItemData("Puppies IND", code = 264_2122, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 23": KH1ItemData("Puppies IND", code = 264_2123, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 24": KH1ItemData("Puppies IND", code = 264_2124, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 25": KH1ItemData("Puppies IND", code = 264_2125, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 26": KH1ItemData("Puppies IND", code = 264_2126, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 27": KH1ItemData("Puppies IND", code = 264_2127, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 28": KH1ItemData("Puppies IND", code = 264_2128, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 29": KH1ItemData("Puppies IND", code = 264_2129, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 30": KH1ItemData("Puppies IND", code = 264_2130, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 31": KH1ItemData("Puppies IND", code = 264_2131, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 32": KH1ItemData("Puppies IND", code = 264_2132, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 33": KH1ItemData("Puppies IND", code = 264_2133, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 34": KH1ItemData("Puppies IND", code = 264_2134, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 35": KH1ItemData("Puppies IND", code = 264_2135, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 36": KH1ItemData("Puppies IND", code = 264_2136, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 37": KH1ItemData("Puppies IND", code = 264_2137, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 38": KH1ItemData("Puppies IND", code = 264_2138, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 39": KH1ItemData("Puppies IND", code = 264_2139, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 40": KH1ItemData("Puppies IND", code = 264_2140, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 41": KH1ItemData("Puppies IND", code = 264_2141, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 42": KH1ItemData("Puppies IND", code = 264_2142, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 43": KH1ItemData("Puppies IND", code = 264_2143, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 44": KH1ItemData("Puppies IND", code = 264_2144, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 45": KH1ItemData("Puppies IND", code = 264_2145, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 46": KH1ItemData("Puppies IND", code = 264_2146, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 47": KH1ItemData("Puppies IND", code = 264_2147, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 48": KH1ItemData("Puppies IND", code = 264_2148, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 49": KH1ItemData("Puppies IND", code = 264_2149, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 50": KH1ItemData("Puppies IND", code = 264_2150, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 51": KH1ItemData("Puppies IND", code = 264_2151, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 52": KH1ItemData("Puppies IND", code = 264_2152, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 53": KH1ItemData("Puppies IND", code = 264_2153, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 54": KH1ItemData("Puppies IND", code = 264_2154, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 55": KH1ItemData("Puppies IND", code = 264_2155, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 56": KH1ItemData("Puppies IND", code = 264_2156, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 57": KH1ItemData("Puppies IND", code = 264_2157, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 58": KH1ItemData("Puppies IND", code = 264_2158, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 59": KH1ItemData("Puppies IND", code = 264_2159, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 60": KH1ItemData("Puppies IND", code = 264_2160, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 61": KH1ItemData("Puppies IND", code = 264_2161, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 62": KH1ItemData("Puppies IND", code = 264_2162, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 63": KH1ItemData("Puppies IND", code = 264_2163, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 64": KH1ItemData("Puppies IND", code = 264_2164, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 65": KH1ItemData("Puppies IND", code = 264_2165, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 66": KH1ItemData("Puppies IND", code = 264_2166, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 67": KH1ItemData("Puppies IND", code = 264_2167, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 68": KH1ItemData("Puppies IND", code = 264_2168, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 69": KH1ItemData("Puppies IND", code = 264_2169, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 70": KH1ItemData("Puppies IND", code = 264_2170, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 71": KH1ItemData("Puppies IND", code = 264_2171, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 72": KH1ItemData("Puppies IND", code = 264_2172, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 73": KH1ItemData("Puppies IND", code = 264_2173, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 74": KH1ItemData("Puppies IND", code = 264_2174, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 75": KH1ItemData("Puppies IND", code = 264_2175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 76": KH1ItemData("Puppies IND", code = 264_2176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 77": KH1ItemData("Puppies IND", code = 264_2177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 78": KH1ItemData("Puppies IND", code = 264_2178, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 79": KH1ItemData("Puppies IND", code = 264_2179, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 80": KH1ItemData("Puppies IND", code = 264_2180, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 81": KH1ItemData("Puppies IND", code = 264_2181, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 82": KH1ItemData("Puppies IND", code = 264_2182, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 83": KH1ItemData("Puppies IND", code = 264_2183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 84": KH1ItemData("Puppies IND", code = 264_2184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 85": KH1ItemData("Puppies IND", code = 264_2185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 86": KH1ItemData("Puppies IND", code = 264_2186, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 87": KH1ItemData("Puppies IND", code = 264_2187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 88": KH1ItemData("Puppies IND", code = 264_2188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 89": KH1ItemData("Puppies IND", code = 264_2189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 90": KH1ItemData("Puppies IND", code = 264_2190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 91": KH1ItemData("Puppies IND", code = 264_2191, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 92": KH1ItemData("Puppies IND", code = 264_2192, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 93": KH1ItemData("Puppies IND", code = 264_2193, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 94": KH1ItemData("Puppies IND", code = 264_2194, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 95": KH1ItemData("Puppies IND", code = 264_2195, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 96": KH1ItemData("Puppies IND", code = 264_2196, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 97": KH1ItemData("Puppies IND", code = 264_2197, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 98": KH1ItemData("Puppies IND", code = 264_2198, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 99": KH1ItemData("Puppies IND", code = 264_2199, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 01-03": KH1ItemData("Puppies TRP", code = 264_2201, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 04-06": KH1ItemData("Puppies TRP", code = 264_2202, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 07-09": KH1ItemData("Puppies TRP", code = 264_2203, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 10-12": KH1ItemData("Puppies TRP", code = 264_2204, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 13-15": KH1ItemData("Puppies TRP", code = 264_2205, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 16-18": KH1ItemData("Puppies TRP", code = 264_2206, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 19-21": KH1ItemData("Puppies TRP", code = 264_2207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 22-24": KH1ItemData("Puppies TRP", code = 264_2208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 25-27": KH1ItemData("Puppies TRP", code = 264_2209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 28-30": KH1ItemData("Puppies TRP", code = 264_2210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 31-33": KH1ItemData("Puppies TRP", code = 264_2211, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 34-36": KH1ItemData("Puppies TRP", code = 264_2212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 37-39": KH1ItemData("Puppies TRP", code = 264_2213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 40-42": KH1ItemData("Puppies TRP", code = 264_2214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 43-45": KH1ItemData("Puppies TRP", code = 264_2215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 46-48": KH1ItemData("Puppies TRP", code = 264_2216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 49-51": KH1ItemData("Puppies TRP", code = 264_2217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 52-54": KH1ItemData("Puppies TRP", code = 264_2218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 55-57": KH1ItemData("Puppies TRP", code = 264_2219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 58-60": KH1ItemData("Puppies TRP", code = 264_2220, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 61-63": KH1ItemData("Puppies TRP", code = 264_2221, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 64-66": KH1ItemData("Puppies TRP", code = 264_2222, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 67-69": KH1ItemData("Puppies TRP", code = 264_2223, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 70-72": KH1ItemData("Puppies TRP", code = 264_2224, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 73-75": KH1ItemData("Puppies TRP", code = 264_2225, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 76-78": KH1ItemData("Puppies TRP", code = 264_2226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 79-81": KH1ItemData("Puppies TRP", code = 264_2227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 82-84": KH1ItemData("Puppies TRP", code = 264_2228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 85-87": KH1ItemData("Puppies TRP", code = 264_2229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 88-90": KH1ItemData("Puppies TRP", code = 264_2230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 91-93": KH1ItemData("Puppies TRP", code = 264_2231, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 94-96": KH1ItemData("Puppies TRP", code = 264_2232, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 97-99": KH1ItemData("Puppies TRP", code = 264_2233, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "All Puppies": KH1ItemData("Puppies ALL", code = 264_2240, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 01": KH1ItemData("Puppies", code = 264_2101, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 02": KH1ItemData("Puppies", code = 264_2102, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 03": KH1ItemData("Puppies", code = 264_2103, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 04": KH1ItemData("Puppies", code = 264_2104, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 05": KH1ItemData("Puppies", code = 264_2105, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 06": KH1ItemData("Puppies", code = 264_2106, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 07": KH1ItemData("Puppies", code = 264_2107, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 08": KH1ItemData("Puppies", code = 264_2108, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 09": KH1ItemData("Puppies", code = 264_2109, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 10": KH1ItemData("Puppies", code = 264_2110, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 11": KH1ItemData("Puppies", code = 264_2111, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 12": KH1ItemData("Puppies", code = 264_2112, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 13": KH1ItemData("Puppies", code = 264_2113, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 14": KH1ItemData("Puppies", code = 264_2114, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 15": KH1ItemData("Puppies", code = 264_2115, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 16": KH1ItemData("Puppies", code = 264_2116, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 17": KH1ItemData("Puppies", code = 264_2117, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 18": KH1ItemData("Puppies", code = 264_2118, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 19": KH1ItemData("Puppies", code = 264_2119, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 20": KH1ItemData("Puppies", code = 264_2120, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 21": KH1ItemData("Puppies", code = 264_2121, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 22": KH1ItemData("Puppies", code = 264_2122, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 23": KH1ItemData("Puppies", code = 264_2123, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 24": KH1ItemData("Puppies", code = 264_2124, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 25": KH1ItemData("Puppies", code = 264_2125, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 26": KH1ItemData("Puppies", code = 264_2126, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 27": KH1ItemData("Puppies", code = 264_2127, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 28": KH1ItemData("Puppies", code = 264_2128, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 29": KH1ItemData("Puppies", code = 264_2129, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 30": KH1ItemData("Puppies", code = 264_2130, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 31": KH1ItemData("Puppies", code = 264_2131, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 32": KH1ItemData("Puppies", code = 264_2132, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 33": KH1ItemData("Puppies", code = 264_2133, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 34": KH1ItemData("Puppies", code = 264_2134, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 35": KH1ItemData("Puppies", code = 264_2135, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 36": KH1ItemData("Puppies", code = 264_2136, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 37": KH1ItemData("Puppies", code = 264_2137, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 38": KH1ItemData("Puppies", code = 264_2138, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 39": KH1ItemData("Puppies", code = 264_2139, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 40": KH1ItemData("Puppies", code = 264_2140, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 41": KH1ItemData("Puppies", code = 264_2141, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 42": KH1ItemData("Puppies", code = 264_2142, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 43": KH1ItemData("Puppies", code = 264_2143, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 44": KH1ItemData("Puppies", code = 264_2144, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 45": KH1ItemData("Puppies", code = 264_2145, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 46": KH1ItemData("Puppies", code = 264_2146, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 47": KH1ItemData("Puppies", code = 264_2147, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 48": KH1ItemData("Puppies", code = 264_2148, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 49": KH1ItemData("Puppies", code = 264_2149, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 50": KH1ItemData("Puppies", code = 264_2150, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 51": KH1ItemData("Puppies", code = 264_2151, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 52": KH1ItemData("Puppies", code = 264_2152, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 53": KH1ItemData("Puppies", code = 264_2153, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 54": KH1ItemData("Puppies", code = 264_2154, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 55": KH1ItemData("Puppies", code = 264_2155, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 56": KH1ItemData("Puppies", code = 264_2156, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 57": KH1ItemData("Puppies", code = 264_2157, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 58": KH1ItemData("Puppies", code = 264_2158, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 59": KH1ItemData("Puppies", code = 264_2159, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 60": KH1ItemData("Puppies", code = 264_2160, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 61": KH1ItemData("Puppies", code = 264_2161, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 62": KH1ItemData("Puppies", code = 264_2162, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 63": KH1ItemData("Puppies", code = 264_2163, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 64": KH1ItemData("Puppies", code = 264_2164, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 65": KH1ItemData("Puppies", code = 264_2165, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 66": KH1ItemData("Puppies", code = 264_2166, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 67": KH1ItemData("Puppies", code = 264_2167, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 68": KH1ItemData("Puppies", code = 264_2168, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 69": KH1ItemData("Puppies", code = 264_2169, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 70": KH1ItemData("Puppies", code = 264_2170, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 71": KH1ItemData("Puppies", code = 264_2171, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 72": KH1ItemData("Puppies", code = 264_2172, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 73": KH1ItemData("Puppies", code = 264_2173, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 74": KH1ItemData("Puppies", code = 264_2174, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 75": KH1ItemData("Puppies", code = 264_2175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 76": KH1ItemData("Puppies", code = 264_2176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 77": KH1ItemData("Puppies", code = 264_2177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 78": KH1ItemData("Puppies", code = 264_2178, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 79": KH1ItemData("Puppies", code = 264_2179, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 80": KH1ItemData("Puppies", code = 264_2180, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 81": KH1ItemData("Puppies", code = 264_2181, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 82": KH1ItemData("Puppies", code = 264_2182, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 83": KH1ItemData("Puppies", code = 264_2183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 84": KH1ItemData("Puppies", code = 264_2184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 85": KH1ItemData("Puppies", code = 264_2185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 86": KH1ItemData("Puppies", code = 264_2186, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 87": KH1ItemData("Puppies", code = 264_2187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 88": KH1ItemData("Puppies", code = 264_2188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 89": KH1ItemData("Puppies", code = 264_2189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 90": KH1ItemData("Puppies", code = 264_2190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 91": KH1ItemData("Puppies", code = 264_2191, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 92": KH1ItemData("Puppies", code = 264_2192, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 93": KH1ItemData("Puppies", code = 264_2193, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 94": KH1ItemData("Puppies", code = 264_2194, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 95": KH1ItemData("Puppies", code = 264_2195, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 96": KH1ItemData("Puppies", code = 264_2196, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 97": KH1ItemData("Puppies", code = 264_2197, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 98": KH1ItemData("Puppies", code = 264_2198, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppy 99": KH1ItemData("Puppies", code = 264_2199, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 01-03": KH1ItemData("Puppies", code = 264_2201, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 04-06": KH1ItemData("Puppies", code = 264_2202, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 07-09": KH1ItemData("Puppies", code = 264_2203, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 10-12": KH1ItemData("Puppies", code = 264_2204, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 13-15": KH1ItemData("Puppies", code = 264_2205, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 16-18": KH1ItemData("Puppies", code = 264_2206, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 19-21": KH1ItemData("Puppies", code = 264_2207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 22-24": KH1ItemData("Puppies", code = 264_2208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 25-27": KH1ItemData("Puppies", code = 264_2209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 28-30": KH1ItemData("Puppies", code = 264_2210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 31-33": KH1ItemData("Puppies", code = 264_2211, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 34-36": KH1ItemData("Puppies", code = 264_2212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 37-39": KH1ItemData("Puppies", code = 264_2213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 40-42": KH1ItemData("Puppies", code = 264_2214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 43-45": KH1ItemData("Puppies", code = 264_2215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 46-48": KH1ItemData("Puppies", code = 264_2216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 49-51": KH1ItemData("Puppies", code = 264_2217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 52-54": KH1ItemData("Puppies", code = 264_2218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 55-57": KH1ItemData("Puppies", code = 264_2219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 58-60": KH1ItemData("Puppies", code = 264_2220, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 61-63": KH1ItemData("Puppies", code = 264_2221, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 64-66": KH1ItemData("Puppies", code = 264_2222, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 67-69": KH1ItemData("Puppies", code = 264_2223, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 70-72": KH1ItemData("Puppies", code = 264_2224, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 73-75": KH1ItemData("Puppies", code = 264_2225, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 76-78": KH1ItemData("Puppies", code = 264_2226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 79-81": KH1ItemData("Puppies", code = 264_2227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 82-84": KH1ItemData("Puppies", code = 264_2228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 85-87": KH1ItemData("Puppies", code = 264_2229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 88-90": KH1ItemData("Puppies", code = 264_2230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 91-93": KH1ItemData("Puppies", code = 264_2231, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 94-96": KH1ItemData("Puppies", code = 264_2232, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Puppies 97-99": KH1ItemData("Puppies", code = 264_2233, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "All Puppies": KH1ItemData("Puppies", code = 264_2240, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2, weight = 10), "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 4, weight = 10), "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 2, weight = 10), @@ -506,7 +506,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Deep Jungle": KH1ItemData("Worlds", code = 264_7004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Agrabah": KH1ItemData("Worlds", code = 264_7005, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Halloween Town": KH1ItemData("Worlds", code = 264_7006, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Atlantica": KH1ItemData("AL", code = 264_7007, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Atlantica": KH1ItemData("Worlds", code = 264_7007, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 5bce9e76ba43..439a5947ebe1 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -73,7 +73,7 @@ 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, required_reports: int) -> bool: - return state.has_group("Unlock", player, required_reports) + return state.has_group("Reports", player, required_reports) def set_rules(multiworld: MultiWorld, player: int, options, required_reports): #Location rules. From 04b48129161c8284fc55123cc1516782f92afbcd Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 24 Apr 2024 21:14:17 -0500 Subject: [PATCH 139/284] Fixes for PR --- worlds/kh1/Items.py | 4 ++-- worlds/kh1/Rules.py | 15 +++++++++------ worlds/kh1/__init__.py | 25 ++++++++++++++----------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 638b38ff1516..fa93045c9960 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -239,8 +239,8 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 3, weight = 10), #"Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 2": KH1ItemData("HAW", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 3": KH1ItemData("HAW", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 4": KH1ItemData("Key", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Slide 1": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 439a5947ebe1..b346bdd013d8 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -37,13 +37,16 @@ def has_postcards(state: CollectionState, player: int, postcards_required: int) return postcards_available >= postcards_required def has_puppies(state: CollectionState, player: int, puppies_required: int) -> bool: + puppies_available = 0 + for i in range(1,100): + if state.has("Puppy " + str(i).rjust(2,"0"), player): + puppies_available = puppies_available + 1 + for i in range(1,34): + if state.has("Puppies " + str(3*(i-1)+1).rjust(2, "0") + "-" + str(3*(i-1)+3).rjust(2, "0"), player): + puppies_available = puppies_available + 3 if state.has("All Puppies", player): - return True - if state.has_group("Puppies TRP", player, -(puppies_required//-3)): - return True - if state.has_group("Puppies IND", player, puppies_required): - return True - return False + puppies_available = puppies_available + 99 + return puppies_available >= puppies_required def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> bool: pages_available = 0 diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 8e31f3b28b3c..0079396ffeb0 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -90,24 +90,27 @@ def create_items(self): total_locations = total_locations - 5 elif self.options.goal.current_key != "final_ansem" and self.options.require_final_ansem: total_locations = total_locations - 1 - non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades", "Accessory", "Weapons"] - if self.options.puppies == "full": - non_filler_item_categories.append("Puppies ALL") - if self.options.puppies == "triplets": - non_filler_item_categories.append("Puppies TRP") - if self.options.puppies == "individual": - non_filler_item_categories.append("Puppies IND") - if self.options.atlantica: - non_filler_item_categories.append("AL") + non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades", "Accessory", "Weapons", "Puppies"] if self.options.hundred_acre_wood: - non_filler_item_categories.append("HAW") + non_filler_item_categories.append("Torn Pages") for name, data in item_table.items(): quantity = data.max_quantity # Ignore filler, it will be added in a later stage. if data.category not in non_filler_item_categories: continue - item_pool += [self.create_item(name) for _ in range(0, quantity)] + if data.category == "Puppies": + if self.options.puppies == "triplets" and "-" in name: + item_pool += [self.create_item(name) for _ in range(0, 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)] + elif name == "Atlantica" or name == "Mermaid Kick": + if self.options.atlantica: + item_pool += [self.create_item(name) for _ in range(0, quantity)] + else: + item_pool += [self.create_item(name) for _ in range(0, quantity)] reports_in_pool = max(int(self.options.required_reports), int(self.options.reports_in_pool)) if self.options.goal.current_key == "super_boss_hunt": From 6c5e8fccf34983f76dfac0865b61f1f3ca93af55 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 26 Apr 2024 12:31:27 -0500 Subject: [PATCH 140/284] Update Options.py --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index fc512fe7563f..629d7b2fda2a 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -217,7 +217,7 @@ class KeybladeMinMP(Range): class KeybladeMaxMP(Range): """ - Determines the minimum MP bonus a keyblade can have + Determines the maximum MP bonus a keyblade can have """ display_name = "Keyblade Maximum MP Bonus" default = 3 From b7aaaffee44fd9b963d0601de3b940910af75d26 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 3 May 2024 13:45:50 -0500 Subject: [PATCH 141/284] Push changes for making the Final Rest Door appear, few option fixes --- worlds/kh1/Client.py | 48 ++++++++++------ worlds/kh1/Items.py | 2 +- worlds/kh1/Options.py | 64 +++++++++++++++------ worlds/kh1/Regions.py | 67 +++++++++++----------- worlds/kh1/Rules.py | 84 +++++++++++++++------------ worlds/kh1/__init__.py | 107 ++++++++++++++++++++--------------- worlds/kh1/test/test_goal.py | 5 -- 7 files changed, 222 insertions(+), 155 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index e333ae6829d3..8417f0c7046e 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -99,26 +99,40 @@ def on_package(self, cmd: str, args: dict): f.close() #Handle Slot Data - if "EXP Multiplier" in list(args['slot_data'].keys()): - xp_mult = args['slot_data']["EXP Multiplier"] - else: - xp_mult = 1.0 - with open(os.path.join(self.game_communication_path, "xpmult.cfg"), 'w') as f: - f.write(str(xp_mult)) - f.close() - if "Required Reports" in list(args['slot_data'].keys()): + ####if "EXP Multiplier" in list(args['slot_data'].keys()): + #### xp_mult = args['slot_data']["EXP Multiplier"] + ####else: + #### xp_mult = 1.0 + ####with open(os.path.join(self.game_communication_path, "xpmult.cfg"), 'w') as f: + #### f.write(str(xp_mult)) + #### f.close() + #### + ####if "Required Reports" in list(args['slot_data'].keys()): + #### reports_required = args['slot_data']["Required Reports"] + ####else: + #### reports_required = 4 + ####with open(os.path.join(self.game_communication_path, "required_reports.cfg"), 'w') as f: + #### f.write(str(reports_required)) + #### f.close() + ####if "Keyblade Stats" in list(args['slot_data'].keys()): + #### keyblade_stats = args['slot_data']["Keyblade Stats"] + #### with open(os.path.join(self.game_communication_path, "keyblade_stats.cfg"), 'w') as f: + #### f.write(str(keyblade_stats)) + #### f.close() + 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"] - else: - reports_required = 4 - with open(os.path.join(self.game_communication_path, "required_reports.cfg"), 'w') as f: - f.write(str(reports_required)) - f.close() - if "Keyblade Stats" in list(args['slot_data'].keys()): - keyblade_stats = args['slot_data']["Keyblade Stats"] - with open(os.path.join(self.game_communication_path, "keyblade_stats.cfg"), 'w') as f: - f.write(str(keyblade_stats)) + 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 cmd in {"ReceivedItems"}: diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index fa93045c9960..eca62ed53006 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -509,7 +509,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Atlantica": KH1ItemData("Worlds", code = 264_7007, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Monstro": KH1ItemData("Worlds", code = 264_7011, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Blue Trinity": KH1ItemData("Trinities", code = 264_8001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Red Trinity": KH1ItemData("Trinities", code = 264_8002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 629d7b2fda2a..4f069c5daa00 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -100,22 +100,25 @@ class HundredAcreWood(Toggle): class SuperBosses(Toggle): """ - Toggle whether to include checks behind Super Bosses. This is ignored if Super Boss Hunt is your goal. + Toggle whether to include checks behind Super Bosses. """ display_name = "Super Bosses" +class Cups(Toggle): + """ + Toggle whether to include checks behind completing Phil, Pegasus, Hercules, or Hades cups. Please note that the items will still appear in the multiworld, as they are required to challenge Sephiroth. + """ + display_name = "Cups" + class Goal(Choice): """ - Determines the goal of your playthrough. - Depending on your setting for Require Final Ansem, this will either yield Victory or required Ansem Reports to enter End of the World. - Note: If requiring Final Ansem, with more than 1 Ansem Report in the pool (or more than 5 if you are using the Super Boss Hunt goal), the goal(s) will not be required, but will remain a way to get a report. + Determines when victory is achieved in your playthrough. Sephiroth: Defeat Sephiroth. Unknown: Defeat Unknown. Postcards: Turn in all 10 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. - Super Boss Hunt: Ansem Reports are set to appear as rewards for defeating Phantom, Kurt Zisa, Sephiroth, Ice Titan, and Unknown. Forces require Final Ansem on. """ display_name = "Goal" option_sephiroth = 0 @@ -123,14 +126,28 @@ class Goal(Choice): option_postcards = 2 option_final_ansem = 3 option_puppies = 4 - option_super_boss_hunt = 5 default = 3 -class RequireFinalAnsem(Toggle): - """ - Determines whether the Victory item is behind your goal or if your goal will provide an Ansem's Report to enter End of the World and defeat Ansem. - """ - display_name = "Require Final Ansem" +class EndoftheWorldUnlock(Choice): + """Determines how End of the World is Unlocked""" + display_name = "End of the World Unlock" + option_item = 0 + option_reports = 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 + + Reports: A certain number of Ansem's Reports are required. That number is defined in another setting. + 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. + """ + display_name = "Final Rest Door" + option_reports = 0 + option_puppies = 1 + option_postcards = 2 + option_superbosses = 3 class Puppies(Choice): """ @@ -143,7 +160,7 @@ class Puppies(Choice): option_full = 0 option_triplets = 1 option_individual = 2 - default = 0 + default = 1 class EXPMultiplier(NamedRange): """ @@ -152,7 +169,7 @@ class EXPMultiplier(NamedRange): display_name = "EXP Multiplier" default = 16 range_start = default / 4 - range_end = 160 + range_end = 128 special_range_names = { "0.25x": default / 4, "0.5x": default / 2, @@ -161,17 +178,25 @@ class EXPMultiplier(NamedRange): "3x": default * 3, "4x": default * 4, "8x": default * 8, - "10x": default * 10, } -class RequiredReports(Range): +class RequiredReportsEotW(Range): """ - Determines the number of Ansem's Reports needed to open End of the World + If End of the World Unlock is set to "Reports", determines the number of Ansem's Reports required to open End of the World. """ display_name = "Reports to Open End of the World" default = 4 range_start = 1 range_end = 13 + +class RequiredReportsDoor(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. + """ + display_name = "Reports to Open Final Rest Door" + default = 4 + range_start = 1 + range_end = 13 class ReportsInPool(Range): """ @@ -257,12 +282,15 @@ class BadStartingWeapons(Toggle): @dataclass class KH1Options(PerGameCommonOptions): goal: Goal - require_final_ansem: RequireFinalAnsem - required_reports: RequiredReports + end_of_the_world_unlock: EndoftheWorldUnlock + final_rest_door: FinalRestDoor + required_reports_eotw: RequiredReportsEotW + required_reports_door: RequiredReportsDoor reports_in_pool: ReportsInPool super_bosses: SuperBosses atlantica: Atlantica hundred_acre_wood: HundredAcreWood + cups: Cups puppies: Puppies exp_multiplier: EXPMultiplier randomize_keyblade_stats: RandomizeKeybladeStats diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 05ea92c0762e..6e01cde647d3 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -304,7 +304,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Neverland"].locations.append("Neverland Seal Keyhole Fairy Harp Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") - if options.super_bosses or options.goal.current_key == "super_boss_hunt": + if options.super_bosses: regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Arcanum Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") @@ -354,39 +354,40 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Ansem's Report 5") #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 6") regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie Boogie Ansem's Report 7") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") + if options.cups: + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") regions["Neverland"].locations.append("Neverland Defeat Hook Ansem's Report 9") #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") - if options.super_bosses or options.goal.current_key == "super_boss_hunt": + if options.super_bosses: regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") - if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "sephiroth": + if options.super_bosses or options.goal.current_key == "sephiroth": regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") - if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "unknown": + if options.super_bosses or options.goal.current_key == "unknown": regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") for i in range(options.level_checks): regions["Levels"].locations.append("Level " + str(i+1).rjust(3,'0')) - - 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") - regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup") - regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup Solo") - regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup Time Trial") - 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") + if options.cups: + 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") + regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup") + regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup Solo") + regions["Olympus Coliseum"].locations.append("Complete Pegasus Cup Time Trial") + 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["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Naturespark") #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Watergleam") @@ -413,11 +414,12 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies") 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") - if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "sephiroth": + if options.super_bosses or options.goal.current_key == "sephiroth": regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") - if options.super_bosses or options.goal.current_key == "super_boss_hunt": + if options.cups: 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: + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Gates Purple Jar After Defeating Hades") regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times") #regions["Neverland"].locations.append("Neverland Clock Tower 01:00 Door") #regions["Neverland"].locations.append("Neverland Clock Tower 02:00 Door") @@ -459,7 +461,8 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Deep Jungle"].locations.append("Deep Jungle Camp Save Gorillas") regions["Deep Jungle"].locations.append("Deep Jungle Bamboo Thicket Save Gorillas") regions["Deep Jungle"].locations.append("Deep Jungle Climbing Trees Save Gorillas") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Olympia Chest") + if options.cups: + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Olympia 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") @@ -468,9 +471,9 @@ def create_regions(multiworld: MultiWorld, player: int, options): #regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Green Trinity") - if options.super_bosses or options.goal.current_key == "super_boss_hunt": + if options.super_bosses: regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event") - if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "unknown": + if options.super_bosses or options.goal.current_key == "unknown": regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event") regions["Traverse Town"].locations.append("Traverse Town Synth Log") @@ -481,7 +484,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Synth Mushroom") - if options.goal.current_key == "final_ansem" or options.require_final_ansem or options.goal.current_key == "super_boss_hunt": + if options.goal.current_key == "final_ansem": regions["End of the World"].locations.append("Final Ansem") # Set up the regions correctly. diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index b346bdd013d8..aa87ed86f777 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -75,10 +75,20 @@ def has_all_magic_lvx(state: CollectionState, player: int, level) -> bool: 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, required_reports: int) -> bool: - return state.has_group("Reports", player, required_reports) +def has_reports(state: CollectionState, player: int, eotw_required_reports: int) -> bool: + return state.has_group("Reports", player, eotw_required_reports) -def set_rules(multiworld: MultiWorld, player: int, options, required_reports): +def has_final_rest_door(state: CollectionState, player:int, final_rest_door_requirement: str, final_rest_door_required_reports: int): + if final_rest_door_requirement == "reports": + return state.has_group("Reports", player, final_rest_door_required_reports) + if final_rest_door_requirement == "puppies": + return has_puppies(state, player, 99) + if final_rest_door_requirement == "postcards": + return has_postcards(state, 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"}, player) and has_emblems(state, player) + +def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_reports: int, final_rest_door_required_reports: int, final_rest_door_requirement: str): #Location rules. #Keys #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -351,7 +361,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Neverland Seal Keyhole Fairy Harp Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - if options.super_bosses or options.goal.current_key == "super_boss_hunt": + if options.super_bosses: multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") @@ -401,36 +411,38 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5" , player).access_rule = lambda state: has_emblems(state, player) #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + if options.cups: + multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) - if options.super_bosses or options.goal.current_key == "super_boss_hunt": + if options.super_bosses: multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) - if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "sephiroth": + if options.super_bosses or options.goal.current_key == "sephiroth": multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "unknown": + if options.super_bosses or options.goal.current_key == "unknown": multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) - multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") - multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") - multiworld.get_location("Complete Phil Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") - multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") - multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") - multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") - multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") - multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") - multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") - multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") - multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") - + if options.cups: + multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") + multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") + multiworld.get_location("Complete Phil Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") + multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") + multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") + multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") + multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + #multiworld.get_location("Traverse Town Magician's Study Turn in Naturespark" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Magician's Study Turn in Watergleam" , player).access_rule = lambda state: has_item(state, player, "Watergleam") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Magician's Study Turn in Fireglow" , player).access_rule = lambda state: has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") @@ -456,11 +468,11 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Traverse Town Piano Room Return 90 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 90) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 99) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 99) - if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "sephiroth": + if options.super_bosses or options.goal.current_key == "sephiroth": multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - if options.super_bosses or options.goal.current_key == "super_boss_hunt": + if options.cups: multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Guard") - multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) #multiworld.get_location("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Neverland Clock Tower 02:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") @@ -502,7 +514,8 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Deep Jungle Camp Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + if options.cups: + multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Deep Jungle Jungle Slider 10 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") multiworld.get_location("Deep Jungle Jungle Slider 20 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") multiworld.get_location("Deep Jungle Jungle Slider 30 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") @@ -523,9 +536,8 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") - - #multiworld.get_location("Final Ansem" , player).access_rule = lambda state: has_item(state, player, "") - + if options.goal.current_key == "final_ansem": + multiworld.get_location("Final Ansem" , player).access_rule = lambda state: has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports) for i in range(options.level_checks): multiworld.get_location("Level " + str(i+1).rjust(3,'0') , player).access_rule = lambda state, level_num=i: has_x_worlds(state, player, min(((level_num//10)*2), 8)) @@ -540,7 +552,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, required_reports): multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) - multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_x_worlds(state, player, 7) and has_reports(state, player, required_reports) + multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_x_worlds(state, player, 7) and (has_reports(state, player, eotw_required_reports) or has_item(state, player,"End of the World")) multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") # Win condition. diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 0079396ffeb0..3f7c035b8255 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -50,8 +50,10 @@ class KH1World(World): location_name_groups = location_name_groups def create_items(self): - if self.options.reports_in_pool < self.options.required_reports: - print("LESS REPORTS IN POOL THAN REQUIRED REPORTS, SWAPPING") + + print("Reports in Pool: " + str(self.determine_reports_in_pool())) + print("Reports to Open Final Rest Door: " + str(self.determine_reports_required_to_open_final_rest_door())) + print("Reports to Open End of the World: " + str(self.determine_reports_required_to_open_end_of_the_world())) item_pool: List[KH1Item] = [] possible_level_up_item_pool = [] @@ -86,10 +88,6 @@ def create_items(self): self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) i = i + 1 total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - 1 - if self.options.goal.current_key == "super_boss_hunt": - total_locations = total_locations - 5 - elif self.options.goal.current_key != "final_ansem" and self.options.require_final_ansem: - total_locations = total_locations - 1 non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades", "Accessory", "Weapons", "Puppies"] if self.options.hundred_acre_wood: non_filler_item_categories.append("Torn Pages") @@ -109,16 +107,14 @@ def create_items(self): elif name == "Atlantica" or name == "Mermaid Kick": if self.options.atlantica: item_pool += [self.create_item(name) for _ in range(0, quantity)] + elif name == "End of the World": + if self.options.end_of_the_world_unlock.current_key == "item": + item_pool += [self.create_item(name) for _ in range(0, quantity)] else: item_pool += [self.create_item(name) for _ in range(0, quantity)] - reports_in_pool = max(int(self.options.required_reports), int(self.options.reports_in_pool)) - if self.options.goal.current_key == "super_boss_hunt": - i = 5 - elif self.options.require_final_ansem and self.options.goal.current_key != "final_ansem": - i = 1 - else: - i = 0 + i = 0 + reports_in_pool = self.determine_reports_in_pool() while i < reports_in_pool: item_pool += [self.create_item("Ansem's Report " + str(i+1))] i = i + 1 @@ -149,27 +145,13 @@ def create_items(self): def pre_fill(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"], - "super_boss_hunt": ["Olympus Coliseum Defeat Sephiroth Ansem's Report 12" - , "Hollow Bastion Defeat Unknown Ansem's Report 13" - , "Agrabah Defeat Kurt Zisa Ansem's Report 11" - , "Neverland Defeat Phantom Stop Event" - , "Olympus Coliseum Defeat Ice Titan Diamond Dust Event"], + "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" } - if (self.options.require_final_ansem or self.options.goal.current_key == "super_boss_hunt") and self.options.goal.current_key != "final_ansem": - self.multiworld.get_location("Final Ansem", self.player).place_locked_item(self.create_item("Victory")) - report_no = 1 - for location_name in goal_dict[self.options.goal.current_key]: - self.multiworld.get_location(location_name, self.player).place_locked_item(self.create_item("Ansem's Report " + str(report_no))) - report_no = report_no + 1 - elif self.options.goal.current_key == "final_ansem": - self.multiworld.get_location("Final Ansem", self.player).place_locked_item(self.create_item("Victory")) - else: - self.multiworld.get_location(goal_dict[self.options.goal.current_key][0], self.player).place_locked_item(self.create_item("Victory")) + self.multiworld.get_location(goal_dict[self.options.goal.current_key], self.player).place_locked_item(self.create_item("Victory")) def get_filler_item_name(self) -> str: fillers = {} @@ -181,22 +163,21 @@ def get_filler_item_name(self) -> str: return self.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] def fill_slot_data(self) -> dict: - if self.options.goal.current_key == "super_boss_hunt": - reports_in_pool = max(self.options.reports_in_pool, 5) - else: - reports_in_pool = self.options.reports_in_pool - required_reports = min(int(self.options.required_reports.value), reports_in_pool) - slot_data = {"EXP Multiplier": int(self.options.exp_multiplier)/16 - ,"Required Reports": int(required_reports)} + 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() + slot_data = {"xpmult": int(self.options.exp_multiplier)/16 + ,"required_reports_eotw": int(required_reports_eotw) + ,"required_reports_door": int(required_reports_door) + ,"door": self.options.final_rest_door.current_key} if self.options.randomize_keyblade_stats: min_str_bonus = min(self.options.keyblade_min_str, self.options.keyblade_max_str) max_str_bonus = max(self.options.keyblade_min_str, self.options.keyblade_max_str) min_mp_bonus = min(self.options.keyblade_min_mp, self.options.keyblade_max_mp) max_mp_bonus = max(self.options.keyblade_min_mp, self.options.keyblade_max_mp) - slot_data["Keyblade Stats"] = "" + 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," + slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + "1,0," else: if min_str_bonus != max_str_bonus: str_bonus = int(self.random.randrange(min_str_bonus,max_str_bonus)) @@ -206,8 +187,8 @@ def fill_slot_data(self) -> dict: mp_bonus = int(self.random.randrange(min_mp_bonus,max_mp_bonus)) else: mp_bonus = int(min_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] + slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + str(str_bonus) + "," + str(mp_bonus) + "," + slot_data["keyblade_stats"] = slot_data["keyblade_stats"][:-1] return slot_data def create_item(self, name: str) -> KH1Item: @@ -223,7 +204,41 @@ def set_rules(self): reports_in_pool = max(self.options.reports_in_pool, 5) else: reports_in_pool = self.options.reports_in_pool - set_rules(self.multiworld, self.player, self.options, min(self.options.required_reports, reports_in_pool)) + set_rules(self.multiworld, self.player, self.options, self.determine_reports_required_to_open_end_of_the_world(), self.determine_reports_required_to_open_final_rest_door(), self.options.final_rest_door.current_key) def create_regions(self): - create_regions(self.multiworld, self.player, self.options) \ No newline at end of file + create_regions(self.multiworld, self.player, self.options) + + def get_numbers_of_reports_to_consider(self): + numbers_to_consider = [] + if self.options.end_of_the_world_unlock.current_key == "reports": + numbers_to_consider.append(self.options.required_reports_eotw) + if self.options.final_rest_door.current_key == "reports": + numbers_to_consider.append(self.options.required_reports_door) + if self.options.final_rest_door.current_key == "reports" or self.options.end_of_the_world_unlock.current_key == "reports": + numbers_to_consider.append(self.options.reports_in_pool) + numbers_to_consider.sort() + return numbers_to_consider + + def determine_reports_in_pool(self): + numbers_to_consider = self.get_numbers_of_reports_to_consider() + if len(numbers_to_consider) > 0: + return max(numbers_to_consider) + else: + return 0 + + def determine_reports_required_to_open_end_of_the_world(self): + if self.options.end_of_the_world_unlock.current_key == "reports": + numbers_to_consider = self.get_numbers_of_reports_to_consider() + if len(numbers_to_consider) > 0: + return numbers_to_consider[0] + return 14 + + def determine_reports_required_to_open_final_rest_door(self): + if self.options.final_rest_door.current_key == "reports": + numbers_to_consider = self.get_numbers_of_reports_to_consider() + if len(numbers_to_consider) == 3: + return numbers_to_consider[1] + elif len(numbers_to_consider) == 2: + return numbers_to_consider[0] + return 14 \ No newline at end of file diff --git a/worlds/kh1/test/test_goal.py b/worlds/kh1/test/test_goal.py index 8c1b65e76c73..ce2aaf7fa7a4 100644 --- a/worlds/kh1/test/test_goal.py +++ b/worlds/kh1/test/test_goal.py @@ -26,9 +26,4 @@ class TestFinalAnsem(KH1TestBase): class TestPuppies(KH1TestBase): options = { "Goal": 4, - } - -class TestSuperBossHunt(KH1TestBase): - options = { - "Goal": 5, } \ No newline at end of file From 61c451d376750dbf3ee01caa2530ec5bb1cc80a1 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 3 May 2024 14:12:07 -0500 Subject: [PATCH 142/284] Update Rules.py --- worlds/kh1/Rules.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index aa87ed86f777..17da85d221a8 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -86,7 +86,7 @@ def has_final_rest_door(state: CollectionState, player:int, final_rest_door_requ if final_rest_door_requirement == "postcards": return has_postcards(state, 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"}, player) and has_emblems(state, player) + return state.has_all({"Olympus Coliseum", "Neverland", "Agrabah", "Hollow Bastion", "Green Trinity", "Phil Cup", "Pegasus Cup", "Hercules Cup"}, player) and has_emblems(state, player) and has_all_magic_lvx(state, player, 2) def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_reports: int, final_rest_door_required_reports: int, final_rest_door_requirement: str): #Location rules. @@ -255,7 +255,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report #multiworld.get_location("Neverland Galley Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Neverland Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Hold Flight 1st Chest " , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Clock Tower Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Clock Tower Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) multiworld.get_location("Neverland Hold Flight 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Hold Yellow Trinity Green Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") multiworld.get_location("Neverland Captain's Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") From b6ad5f64b9d88e28c8aa5ed8fff2890d8c230cbf Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 6 May 2024 08:17:14 -0500 Subject: [PATCH 143/284] Website formatting, 0 min for reports, option description typo --- worlds/kh1/Options.py | 22 +++++++++++----------- worlds/kh1/docs/kh1_en.md | 24 ++++++++++++------------ 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 4f069c5daa00..d2a5d6774e0b 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -7,7 +7,7 @@ class StrengthIncrease(Range): Number of Strength Increases to Add to the Level Up Rewards The randomizer will add all stat up 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) at chosen at random. + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. """ display_name = "STR Increases" range_start = 0 @@ -19,7 +19,7 @@ class DefenseIncrease(Range): Number of Defense Increases to Add to the Level Up Rewards The randomizer will add all stat up 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) at chosen at random. + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. """ display_name = "DEF Increases" range_start = 0 @@ -31,7 +31,7 @@ class HPIncrease(Range): Number of HP Increases to Add to the Level Up Rewards The randomizer will add all stat up 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) at chosen at random. + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. """ display_name = "HP Increases" range_start = 0 @@ -43,7 +43,7 @@ class APIncrease(Range): Number of AP Increases to Add to the Level Up Rewards The randomizer will add all stat up 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) at chosen at random. + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. """ display_name = "AP Increases" range_start = 0 @@ -55,7 +55,7 @@ class MPIncrease(Range): Number of MP Increases to Add to the Level Up Rewards The randomizer will add all stat up 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) at chosen at random. + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. """ display_name = "MP Increases" range_start = 0 @@ -67,7 +67,7 @@ class AccessorySlotIncrease(Range): Number of Accessory Slot Increases to Add to the Level Up Rewards The randomizer will add all stat up 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) at chosen at random. + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. """ display_name = "Accessory Slot Increases" range_start = 0 @@ -79,7 +79,7 @@ class ItemSlotIncrease(Range): Number of Item Slot Increases to Add to the Level Up Rewards The randomizer will add all stat up 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) at chosen at random. + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. """ display_name = "Item Slot Increases" range_start = 0 @@ -186,7 +186,7 @@ class RequiredReportsEotW(Range): """ display_name = "Reports to Open End of the World" default = 4 - range_start = 1 + range_start = 0 range_end = 13 class RequiredReportsDoor(Range): @@ -195,7 +195,7 @@ class RequiredReportsDoor(Range): """ display_name = "Reports to Open Final Rest Door" default = 4 - range_start = 1 + range_start = 0 range_end = 13 class ReportsInPool(Range): @@ -204,7 +204,7 @@ class ReportsInPool(Range): """ display_name = "Reports in Pool" default = 4 - range_start = 1 + range_start = 0 range_end = 13 class RandomizeKeybladeStats(DefaultOnToggle): @@ -219,7 +219,7 @@ class KeybladeMinStrength(Range): """ display_name = "Keyblade Minimum STR Bonus" default = 3 - range_start = 1 + range_start = 0 range_end = 19 class KeybladeMaxStrength(Range): diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index ff73cc77bace..b92037ab385a 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -3,35 +3,35 @@ ##Setting up the required mods 1. Install OpenKH and the LUA Backend. - Download the latest release of OpenKH here: https://github.com/OpenKH/OpenKh/releases/tag/latest + Download the latest release of OpenKH [here](https://github.com/OpenKH/OpenKh/releases/tag/latest) Extract the files to a directory of your choosing. - Open OpenKh.Tools.ModsManager.exe and run first time set up. + Open `OpenKh.Tools.ModsManager.exe` and run first time set up. - When prompted for game edition, choose PC Release via Epic Games Store and navigate to your KH_1.5_2.5 in the path box and click "Next" + When prompted for game edition, choose `PC Release via Epic Games Store` and navigate to your `KH_1.5_2.5` folder in the path box and click `Next` - When prompted, install Panacea, then click "Next" + When prompted, install Panacea, then click `Next` - When prompted, check KH1 plus any other AP game you play and click "Install and configure LUA backend", then click "Next". + When prompted, check KH1 plus any other AP game you play and click `Install and configure LUA backend`, then click `Next`. - Ensure that "Launch via Epic Games" is checked and click "Next" + Ensure that `Launch via Epic Games` is checked and click `Next` Extracting game data for KH1 is not required, you may skip it in the next step. - Click "Finish" + Click `Finish` -2. Open "OpenKh.Tools.ModsManager.exe" +2. Open `OpenKh.Tools.ModsManager.exe` -3. Click the drop down menu at the top-right and choose "Kingdom Hearts 1" +3. Click the drop down menu at the top-right and choose `Kingdom Hearts 1` 4. Click `Mods>Install a New Mod` -5. In "Add a new mod from GitHub" paste `gaithern/KH-1FM-AP-LUA` +5. In `Add a new mod from GitHub` paste `gaithern/KH-1FM-AP-LUA` -6. Click Install +6. Click `Install` -7. Navigate to Mod Loader and click "Build Only" +7. Navigate to Mod Loader and click `Build and Run` ## Configuring your YAML file From 7509e2a0cf6a4001f907e61099fb3e9b325f74c8 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 6 May 2024 08:30:37 -0500 Subject: [PATCH 144/284] Create KH1Client.py --- KH1Client.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 KH1Client.py diff --git a/KH1Client.py b/KH1Client.py new file mode 100644 index 000000000000..ff00c6b77ba4 --- /dev/null +++ b/KH1Client.py @@ -0,0 +1,8 @@ +import ModuleUpdate +import Utils +from worlds.kh1.Client import launch +ModuleUpdate.update() + +if __name__ == '__main__': + Utils.init_logging("KH1Client", exception_logger="Client") + launch() From f679f68e2cd141d6bce6bd4e475acaf7065ff428 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 6 May 2024 09:17:26 -0500 Subject: [PATCH 145/284] Update worlds/kh1/docs/kh1_en.md Co-authored-by: Scipio Wright --- worlds/kh1/docs/kh1_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index b92037ab385a..17a6840db40a 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -3,7 +3,7 @@ ##Setting up the required mods 1. Install OpenKH and the LUA Backend. - Download the latest release of OpenKH [here](https://github.com/OpenKH/OpenKh/releases/tag/latest) + Download the [latest release of OpenKH](https://github.com/OpenKH/OpenKh/releases/tag/latest) Extract the files to a directory of your choosing. From 449e2cfceb3ee4baab93a94d83aeebc63c9eeaba Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 6 May 2024 13:11:41 -0500 Subject: [PATCH 146/284] Update Options.py --- worlds/kh1/Options.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index d2a5d6774e0b..c54e03c39699 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -220,7 +220,7 @@ class KeybladeMinStrength(Range): display_name = "Keyblade Minimum STR Bonus" default = 3 range_start = 0 - range_end = 19 + range_end = 20 class KeybladeMaxStrength(Range): """ @@ -228,7 +228,7 @@ class KeybladeMaxStrength(Range): """ display_name = "Keyblade Maximum STR Bonus" default = 14 - range_start = 2 + range_start = 0 range_end = 20 class KeybladeMinMP(Range): @@ -236,9 +236,9 @@ class KeybladeMinMP(Range): Determines the minimum MP bonus a keyblade can have """ display_name = "Keyblade Maximum MP Bonus" - default = 0 - range_start = 0 - range_end = 4 + default = -2 + range_start = -2 + range_end = 5 class KeybladeMaxMP(Range): """ @@ -246,7 +246,7 @@ class KeybladeMaxMP(Range): """ display_name = "Keyblade Maximum MP Bonus" default = 3 - range_start = 1 + range_start = -2 range_end = 5 class LevelChecks(Range): From b0a29cc12e10ac865b7c9215fac0ff3a4ab50f32 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 6 May 2024 13:25:30 -0500 Subject: [PATCH 147/284] Update Options.py --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index c54e03c39699..a77fa694f1de 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -235,7 +235,7 @@ class KeybladeMinMP(Range): """ Determines the minimum MP bonus a keyblade can have """ - display_name = "Keyblade Maximum MP Bonus" + display_name = "Keyblade Minimum MP Bonus" default = -2 range_start = -2 range_end = 5 From 51a8e13df19a35e694831c7ab33029dafaf01762 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 6 May 2024 13:47:26 -0500 Subject: [PATCH 148/284] Update Rules.py --- worlds/kh1/Rules.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 17da85d221a8..5fab45625725 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -108,7 +108,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") + multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") and can_glide(state, player) multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: can_glide(state, player) and has_item(state, player, "Progressive Fire") multiworld.get_location("Traverse Town Alleyway Behind Crates Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") @@ -264,7 +264,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) or has_item(state, player, "Progressive Blizzard") multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) or has_item(state, player, "Progressive Blizzard") - multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) or (has_item(state, player, "Progressive Blizzard") and has_emblems(state, player)) + multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: can_glide(state, player) or (has_item(state, player, "Progressive Blizzard") and has_emblems(state, player)) multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: has_emblems(state, player) @@ -515,7 +515,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) if options.cups: - multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") multiworld.get_location("Deep Jungle Jungle Slider 10 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") multiworld.get_location("Deep Jungle Jungle Slider 20 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") multiworld.get_location("Deep Jungle Jungle Slider 30 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") From af44e70a39764d29e8d04695cceaa94b3bab8d07 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 6 May 2024 13:50:46 -0500 Subject: [PATCH 149/284] Update Rules.py --- worlds/kh1/Rules.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 5fab45625725..1a46e15f23e5 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -429,9 +429,9 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") - multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") - multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") - multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) + multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) + multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) @@ -440,8 +440,8 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") - multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") + multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) + multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) #multiworld.get_location("Traverse Town Magician's Study Turn in Naturespark" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Magician's Study Turn in Watergleam" , player).access_rule = lambda state: has_item(state, player, "Watergleam") and has_item(state, player, "Progressive Fire") @@ -515,7 +515,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) if options.cups: - multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") + multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) multiworld.get_location("Deep Jungle Jungle Slider 10 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") multiworld.get_location("Deep Jungle Jungle Slider 20 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") multiworld.get_location("Deep Jungle Jungle Slider 30 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") From fa9e7a2b1eac71d194abe2e442f16f5fc52c7d3c Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 6 May 2024 13:56:35 -0500 Subject: [PATCH 150/284] Update Rules.py --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 1a46e15f23e5..6bccf059acce 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -26,7 +26,7 @@ def has_at_least(state: CollectionState, player: int, item: str, x: int) -> bool return state.count(item, player) >= x def has_postcards(state: CollectionState, player: int, postcards_required: int) -> bool: - postcards_available = 3 #You can get three postcards without no items + postcards_available = 3 #You can get three postcards without any items if has_item(state, player, "Progressive Thunder"): postcards_available = postcards_available + 2 #Gizmo Shop Postcards if has_item(state, player, "Green Trinity"): From 07c6898015cc84f8babd1ffa9a4e471c1d7f4571 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 7 May 2024 16:03:58 -0500 Subject: [PATCH 151/284] Add Donald and Goofy Death Link --- worlds/kh1/Options.py | 14 ++++++++++++++ worlds/kh1/__init__.py | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index a77fa694f1de..f2060a54b78a 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -279,6 +279,18 @@ class BadStartingWeapons(Toggle): """ display_name = "Bad Starting Weapons" +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. + """ + display_name = "Donald Death Link" + +class GoofyDeathLink(Toggle): + """ + If Goofy is KO'ed, so is Sora. If Death Link is toggled on in your client, this will send a death to everyone. + """ + display_name = "Goofy Death Link" + @dataclass class KH1Options(PerGameCommonOptions): goal: Goal @@ -308,4 +320,6 @@ class KH1Options(PerGameCommonOptions): mp_increase: MPIncrease accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease + donald_death_link: DonaldDeathLink + goofy_death_link: GoofyDeathLink diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 3f7c035b8255..fde8f635cd5f 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -189,6 +189,10 @@ def fill_slot_data(self) -> dict: mp_bonus = int(min_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"] = "" return slot_data def create_item(self, name: str) -> KH1Item: From 137d79fe4e5face844eeb4de2baad7fc5c104e0c Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 7 May 2024 22:45:10 -0500 Subject: [PATCH 152/284] Add fight logic for optional bosses --- worlds/kh1/Items.py | 8 +++---- worlds/kh1/Rules.py | 57 ++++++++++++++++++++++++--------------------- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index eca62ed53006..34b21530f0ac 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -436,10 +436,10 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.useful, max_quantity = 2, weight = 10), - "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.progression, max_quantity = 2, weight = 10), + "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, max_quantity = 1, weight = 10), @@ -476,7 +476,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, max_quantity = 4, weight = 10), "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "EXP Zero": KH1ItemData("XPZ", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.useful, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 6bccf059acce..2825632ef4a2 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -86,7 +86,10 @@ def has_final_rest_door(state: CollectionState, player:int, final_rest_door_requ if final_rest_door_requirement == "postcards": return has_postcards(state, 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"}, player) and has_emblems(state, player) and has_all_magic_lvx(state, player, 2) + return state.has_all({"Olympus Coliseum", "Neverland", "Agrabah", "Hollow Bastion", "Green Trinity", "Phil Cup", "Pegasus Cup", "Hercules Cup"}, player) and has_emblems(state, player) and has_all_magic_lvx(state, player, 2) and has_defensive_tools(state, player) + +def has_defensive_tools(state: CollectionState, player: int) -> bool: + return (state.count("Progressive Cure", player) >= 2 and state.has("Leaf Bracer", player) and state.has("Dodge Roll", player)) and (state.has("Second Chance", player) or state.has("MP Rage", player) or state.count("Progressive Aero", player) >= 2) def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_reports: int, final_rest_door_required_reports: int, final_rest_door_requirement: str): #Location rules. @@ -116,7 +119,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 1 Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 2 Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest" , player).access_rule = lambda state: has_x_worlds(state, player, 5) multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") or can_glide(state, player) multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") or can_glide(state, player) @@ -307,11 +310,11 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report #multiworld.get_location("End of the World Final Dimension 9th Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Giant Crevasse 5th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - #multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) + #multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("End of the World Giant Crevasse 5th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) + #multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Traverse Town Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Wonderland Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("End of the World World Terminus Olympus Coliseum Chest" , player).access_rule = lambda state: has_item(state, player, "") @@ -362,7 +365,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") if options.super_bosses: - multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) + multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) and has_defensive_tools(state, player) and has_emblems(state, player) multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: has_emblems(state, player) @@ -412,15 +415,15 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6" , player).access_rule = lambda state: has_emblems(state, player) multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") if options.cups: - multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) if options.super_bosses: - multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) if options.super_bosses or options.goal.current_key == "sephiroth": - multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) if options.super_bosses or options.goal.current_key == "unknown": - multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) if options.cups: multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") @@ -432,14 +435,14 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) - multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) - multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) @@ -469,10 +472,10 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 99) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 99) if options.super_bosses or options.goal.current_key == "sephiroth": - multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) if options.cups: - multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Guard") - multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) + multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Guard") and has_defensive_tools(state, player) + multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) #multiworld.get_location("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") #multiworld.get_location("Neverland Clock Tower 02:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") @@ -524,10 +527,10 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report #multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: has_evidence(state, player) multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - if options.super_bosses or options.goal.current_key == "super_boss_hunt": - multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) - if options.super_bosses or options.goal.current_key == "super_boss_hunt" or options.goal.current_key == "unknown": - multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) + if options.super_bosses: + multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + if options.super_bosses or options.goal.current_key == "unknown": + multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") From b99226a3c2ce67596d48e8a4f335f0f16e0cfed5 Mon Sep 17 00:00:00 2001 From: gaithern Date: Thu, 9 May 2024 18:22:43 -0500 Subject: [PATCH 153/284] Update __init__.py --- worlds/kh1/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index fde8f635cd5f..03755fdc370c 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -168,7 +168,8 @@ def fill_slot_data(self) -> dict: slot_data = {"xpmult": int(self.options.exp_multiplier)/16 ,"required_reports_eotw": int(required_reports_eotw) ,"required_reports_door": int(required_reports_door) - ,"door": self.options.final_rest_door.current_key} + ,"door": self.options.final_rest_door.current_key + ,"seed": self.multiworld.seed_name} if self.options.randomize_keyblade_stats: min_str_bonus = min(self.options.keyblade_min_str, self.options.keyblade_max_str) max_str_bonus = max(self.options.keyblade_min_str, self.options.keyblade_max_str) From 6ed215421789b4c7fd9e732ac9127640d6674be3 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 13 May 2024 00:23:33 -0500 Subject: [PATCH 154/284] Update Options.py --- worlds/kh1/Options.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index f2060a54b78a..a3c8b38a1ade 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -261,7 +261,7 @@ class LevelChecks(Range): 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 only want to find AP items from levels 1-50, set this value to 51. + For example, if you want to be able to find any multiworld item from levels 1-50, then just stat ups from level 51 on, set this value to 51. """ display_name = "Force Stats on Level Starting From" default = 1 @@ -269,7 +269,7 @@ class ForceStatsOnLevels(NamedRange): range_end = 101 special_range_names = { "none": 101, - "ap-checks-to-level-50": 51, + "multiworld-to-level-50": 51, "all": 1 } From 8c9c3ee2e8fbbc6cb303e3cca99484b558bfcde7 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 13 May 2024 09:20:09 -0500 Subject: [PATCH 155/284] Update worlds/kh1/Options.py Co-authored-by: Scipio Wright --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index a3c8b38a1ade..fdefea79780c 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -261,7 +261,7 @@ class LevelChecks(Range): 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 from level 51 on, set this value to 51. + 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. """ display_name = "Force Stats on Level Starting From" default = 1 From 76645a4cf4a1ea1d4fdc10d41e5f9f38ccb59c44 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 17 May 2024 12:16:05 -0500 Subject: [PATCH 156/284] Update Client.py --- worlds/kh1/Client.py | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 8417f0c7046e..c7f48028e1e6 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -14,6 +14,7 @@ import Utils death_link = False +item_num = 1 logger = logging.getLogger("Client") @@ -138,29 +139,18 @@ def on_package(self, cmd: str, args: dict): if cmd in {"ReceivedItems"}: start_index = args["index"] if start_index != len(self.items_received): + global item_num for item in args['items']: - check_num = 0 - for filename in os.listdir(self.game_communication_path): - if filename.startswith("AP"): - if int(filename.split("_")[-1].split(".")[0]) > check_num: - check_num = int(filename.split("_")[-1].split(".")[0]) - item_id = "" - location_id = "" - player = "" found = False + item_filename = f"AP_{str(item_num)}.item" for filename in os.listdir(self.game_communication_path): - if filename.startswith(f"AP"): - with open(os.path.join(self.game_communication_path, filename), 'r') as f: - item_id = str(f.readline()).replace("\n", "") - location_id = str(f.readline()).replace("\n", "") - player = str(f.readline()).replace("\n", "") - if str(item_id) == str(NetworkItem(*item).item) and str(location_id) == str(NetworkItem(*item).location) and str(player) == str(NetworkItem(*item).player) and int(location_id) > 0: - found = True + if filename == item_filename: + found = True if not found: - filename = f"AP_{str(check_num+1)}.item" - with open(os.path.join(self.game_communication_path, filename), 'w') as f: + 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 cmd in {"RoomUpdate"}: if "checked_locations" in args: From 8fd9f1504fd9318cf03a7e759c83208ac9368b74 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 17 May 2024 17:30:23 -0500 Subject: [PATCH 157/284] Update kh1_en.md --- worlds/kh1/docs/kh1_en.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index 17a6840db40a..efe9442da518 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -1,6 +1,9 @@ # Kingdom Hearts Randomizer Setup Guide ##Setting up the required mods + +BEFORE MODDING, PLEASE INSTALL AND RUN KH1 AT LEAST ONCE. + 1. Install OpenKH and the LUA Backend. Download the [latest release of OpenKH](https://github.com/OpenKH/OpenKh/releases/tag/latest) From 8975a0c0b48f2a421b3b099eec52f796f2fe6718 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 18 May 2024 15:54:31 -0500 Subject: [PATCH 158/284] Update __init__.py --- worlds/kh1/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 03755fdc370c..5ea98fadcd1a 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -119,6 +119,9 @@ def create_items(self): item_pool += [self.create_item("Ansem's Report " + str(i+1))] i = i + 1 + while len(item_pool) > total_locations: + item_pool.pop(0) + print("KH1: Item Pool = " + str(len(item_pool))) print("KH1: Locations = " + str(total_locations)) print("KH1: Level Up Item Pool = " + str(len(level_up_item_pool))) From 45bc42ff801ea9a8934c645257af70082e9e459f Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 19 May 2024 09:10:56 -0500 Subject: [PATCH 159/284] Cleaning up for PR --- worlds/kh1/Regions.py | 2 +- worlds/kh1/__init__.py | 21 ++------------------- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 6e01cde647d3..0d710da68eb1 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -1,7 +1,7 @@ from typing import Dict, List, NamedTuple, Optional from BaseClasses import MultiWorld, Region, Entrance -from .Locations import KH1Location, location_table, get_locations_by_category +from .Locations import KH1Location, location_table class KH1RegionData(NamedTuple): diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 5ea98fadcd1a..f6f81df9ee0f 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -8,7 +8,6 @@ from .Regions import create_regions from .Rules import set_rules from worlds.LauncherComponents import Component, components, Type, launch_subprocess -import random def launch_client(): @@ -50,11 +49,6 @@ class KH1World(World): location_name_groups = location_name_groups def create_items(self): - - print("Reports in Pool: " + str(self.determine_reports_in_pool())) - print("Reports to Open Final Rest Door: " + str(self.determine_reports_required_to_open_final_rest_door())) - print("Reports to Open End of the World: " + str(self.determine_reports_required_to_open_end_of_the_world())) - item_pool: List[KH1Item] = [] possible_level_up_item_pool = [] level_up_item_pool = [] @@ -113,19 +107,12 @@ def create_items(self): else: item_pool += [self.create_item(name) for _ in range(0, quantity)] - i = 0 - reports_in_pool = self.determine_reports_in_pool() - while i < reports_in_pool: + for i in range(self.determine_reports_in_pool()): item_pool += [self.create_item("Ansem's Report " + str(i+1))] - i = i + 1 while len(item_pool) > total_locations: item_pool.pop(0) - print("KH1: Item Pool = " + str(len(item_pool))) - print("KH1: Locations = " + str(total_locations)) - print("KH1: Level Up Item Pool = " + str(len(level_up_item_pool))) - print("KH1: Adding " + str(min(len(level_up_item_pool), total_locations - len(item_pool))) + " Stat Increases to the Item Pool") while len(item_pool) < total_locations and len(level_up_item_pool) > 0: item_pool += [self.create_item(level_up_item_pool.pop())] @@ -208,16 +195,12 @@ def create_event(self, name: str) -> KH1Item: return KH1Item(name, data.classification, data.code, self.player) def set_rules(self): - if self.options.goal.current_key == "super_boss_hunt": - reports_in_pool = max(self.options.reports_in_pool, 5) - else: - reports_in_pool = self.options.reports_in_pool set_rules(self.multiworld, self.player, self.options, self.determine_reports_required_to_open_end_of_the_world(), self.determine_reports_required_to_open_final_rest_door(), self.options.final_rest_door.current_key) def create_regions(self): create_regions(self.multiworld, self.player, self.options) - def get_numbers_of_reports_to_consider(self): + def get_numbers_of_reports_to_consider(self) -> int: numbers_to_consider = [] if self.options.end_of_the_world_unlock.current_key == "reports": numbers_to_consider.append(self.options.required_reports_eotw) From 66d134345326409968b2a07a37690af4e75e64c0 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 22 May 2024 22:00:57 -0500 Subject: [PATCH 160/284] Update Client.py --- worlds/kh1/Client.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index c7f48028e1e6..9497cd35a0b4 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -75,6 +75,8 @@ async def connection_closed(self): for file in files: if file.find("obtain") <= -1: os.remove(root + "/" + file) + global item_num + item_num = 1 @property def endpoints(self): @@ -89,6 +91,8 @@ async def shutdown(self): for file in files: if file.find("obtain") <= -1: os.remove(root+"/"+file) + global item_num + item_num = 1 def on_package(self, cmd: str, args: dict): if cmd in {"Connected"}: From 3d5fefebe798a09088c4a13af2c6c1bb27d0987f Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 25 May 2024 10:43:40 -0500 Subject: [PATCH 161/284] Added event locations for vanilla items --- worlds/kh1/Items.py | 6 ++++-- worlds/kh1/Locations.py | 10 ++++++++++ worlds/kh1/Regions.py | 14 ++++++++++++++ worlds/kh1/Rules.py | 33 ++++++++++++++++++--------------- worlds/kh1/__init__.py | 14 ++++++++++++++ 5 files changed, 60 insertions(+), 17 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 34b21530f0ac..e9ddbff5d4c8 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -239,8 +239,8 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 3, weight = 10), #"Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 1": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 2": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 4": KH1ItemData("Key", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Slide 1": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -523,6 +523,8 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat } event_item_table: Dict[str, KH1ItemData] = { + "Vanilla Postcard": KH1ItemData("Event", classification = ItemClassification.progression), + "Vanilla Torn Page": KH1ItemData("Event", classification = ItemClassification.progression), } #Make item categories diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index fa0b2c6901cc..40bea8bcc179 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -552,6 +552,16 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: } event_location_table: Dict[str, KH1LocationData] = { + "Traverse Town Item Shop Postcard": KH1LocationData("Event"), + "Traverse Town 1st District Safe Postcard": KH1LocationData("Event"), + "Traverse Town Gizmo Shop Postcard 1": KH1LocationData("Event"), + "Traverse Town Gizmo Shop Postcard 2": KH1LocationData("Event"), + "Traverse Town Item Workshop Postcard": KH1LocationData("Event"), + "Traverse Town 3rd District Balcony Postcard": KH1LocationData("Event"), + "Traverse Town Geppetto's House Postcard": KH1LocationData("Event"), + "Traverse Town Piano Room Return 50 Puppies Torn Page": KH1LocationData("Event"), + "Halloween Town Lab Torn Page": KH1LocationData("Event"), + "Atlantica Ariel's Grotto Torn Page": KH1LocationData("Event") } 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/Regions.py b/worlds/kh1/Regions.py index 0d710da68eb1..eb4eb42f2664 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -486,6 +486,20 @@ def create_regions(multiworld: MultiWorld, player: int, options): if options.goal.current_key == "final_ansem": regions["End of the World"].locations.append("Final Ansem") + + + #Set up event locations: + regions["Traverse Town"].locations.append("Traverse Town Item Shop Postcard") + regions["Traverse Town"].locations.append("Traverse Town 1st District Safe Postcard") + regions["Traverse Town"].locations.append("Traverse Town Gizmo Shop Postcard 1") + regions["Traverse Town"].locations.append("Traverse Town Gizmo Shop Postcard 2") + regions["Traverse Town"].locations.append("Traverse Town Item Workshop Postcard") + regions["Traverse Town"].locations.append("Traverse Town 3rd District Balcony Postcard") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Postcard") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 50 Puppies Torn Page") + regions["Halloween Town"].locations.append("Halloween Town Lab Torn Page") + if options.atlantica: + regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Torn Page") # Set up the regions correctly. for name, data in regions.items(): diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 2825632ef4a2..c1870e5a60b0 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -26,14 +26,9 @@ def has_at_least(state: CollectionState, player: int, item: str, x: int) -> bool return state.count(item, player) >= x def has_postcards(state: CollectionState, player: int, postcards_required: int) -> bool: - postcards_available = 3 #You can get three postcards without any items - if has_item(state, player, "Progressive Thunder"): - postcards_available = postcards_available + 2 #Gizmo Shop Postcards - if has_item(state, player, "Green Trinity"): - postcards_available = postcards_available + 1 #After locking Traverse Town, examine the Synthesis Shop poster. - if has_item(state, player, "Monstro") and has_item(state, player, "High Jump"): - postcards_available = postcards_available + 1 #Gepetto's House Pot on Shelf - postcards_available = postcards_available + state.count("Postcard", player) #3 can be found in chests/events + postcards_available = 0 + postcards_available = postcards_available + state.count("Vanilla Postcard", player) + postcards_available = postcards_available + state.count("Postcard", player) return postcards_available >= postcards_required def has_puppies(state: CollectionState, player: int, puppies_required: int) -> bool: @@ -50,14 +45,9 @@ def has_puppies(state: CollectionState, player: int, puppies_required: int) -> b def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> bool: pages_available = 0 - if state.has("Atlantica", player): - pages_available = pages_available + 1 - if state.has("Halloween Town", player): - pages_available = pages_available + 1 - if has_puppies(state, player, 51): - pages_available = pages_available + 1 + pages_available = pages_available + state.count("Vanilla Torn Page", player) + pages_available = pages_available + state.count("Torn Page 1", player) pages_available = pages_available + state.count("Torn Page 2", player) - pages_available = pages_available + state.count("Torn Page 3", player) return pages_available >= pages_required def has_all_arts(state: CollectionState, player: int) -> bool: @@ -543,6 +533,19 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Final Ansem" , player).access_rule = lambda state: has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports) for i in range(options.level_checks): multiworld.get_location("Level " + str(i+1).rjust(3,'0') , player).access_rule = lambda state, level_num=i: has_x_worlds(state, player, min(((level_num//10)*2), 8)) + + #Set up event location rules + #multiworld.get_location("Traverse Town Item Shop Postcard" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Traverse Town 1st District Safe Postcard" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Traverse Town Gizmo Shop Postcard 1" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") + multiworld.get_location("Traverse Town Gizmo Shop Postcard 2" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") + multiworld.get_location("Traverse Town Item Workshop Postcard" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + #multiworld.get_location("Traverse Town 3rd District Balcony Postcard" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Traverse Town Geppetto's House Postcard" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") + multiworld.get_location("Traverse Town Piano Room Return 50 Puppies Torn Page" , player).access_rule = lambda state: has_puppies(state, player, 50) + #multiworld.get_location("Halloween Town Lab Torn Page" , player).access_rule = lambda state: has_item(state, player, "") + #if options.atlantica: + # multiworld.get_location("Atlantica Ariel's Grotto Torn Page" , player).access_rule = lambda state: has_item(state, player, "") # Region rules. multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index f6f81df9ee0f..326cca284429 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -199,6 +199,20 @@ def set_rules(self): def create_regions(self): create_regions(self.multiworld, self.player, self.options) + self._place_events() + + def _place_events(self): + self.multiworld.get_location("Traverse Town Item Shop Postcard" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) + self.multiworld.get_location("Traverse Town 1st District Safe Postcard" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) + self.multiworld.get_location("Traverse Town Gizmo Shop Postcard 1" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) + self.multiworld.get_location("Traverse Town Gizmo Shop Postcard 2" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) + self.multiworld.get_location("Traverse Town Item Workshop Postcard" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) + self.multiworld.get_location("Traverse Town 3rd District Balcony Postcard" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) + self.multiworld.get_location("Traverse Town Geppetto's House Postcard" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) + self.multiworld.get_location("Traverse Town Piano Room Return 50 Puppies Torn Page", self.player).place_locked_item(self.create_event("Vanilla Torn Page")) + self.multiworld.get_location("Halloween Town Lab Torn Page" , self.player).place_locked_item(self.create_event("Vanilla Torn Page")) + if self.options.atlantica: + self.multiworld.get_location("Atlantica Ariel's Grotto Torn Page" , self.player).place_locked_item(self.create_event("Vanilla Torn Page")) def get_numbers_of_reports_to_consider(self) -> int: numbers_to_consider = [] From be4bc6f51b2693812ee123633c12f21a5273bf4d Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 29 May 2024 22:45:18 -0500 Subject: [PATCH 162/284] Add proper location groups and auto hint synth shop items when entering --- worlds/kh1/Client.py | 27 +- worlds/kh1/Locations.py | 1056 +++++++++++++++++++-------------------- 2 files changed, 534 insertions(+), 549 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 9497cd35a0b4..d22503f53624 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -104,27 +104,6 @@ def on_package(self, cmd: str, args: dict): f.close() #Handle Slot Data - - ####if "EXP Multiplier" in list(args['slot_data'].keys()): - #### xp_mult = args['slot_data']["EXP Multiplier"] - ####else: - #### xp_mult = 1.0 - ####with open(os.path.join(self.game_communication_path, "xpmult.cfg"), 'w') as f: - #### f.write(str(xp_mult)) - #### f.close() - #### - ####if "Required Reports" in list(args['slot_data'].keys()): - #### reports_required = args['slot_data']["Required Reports"] - ####else: - #### reports_required = 4 - ####with open(os.path.join(self.game_communication_path, "required_reports.cfg"), 'w') as f: - #### f.write(str(reports_required)) - #### f.close() - ####if "Keyblade Stats" in list(args['slot_data'].keys()): - #### keyblade_stats = args['slot_data']["Keyblade Stats"] - #### with open(os.path.join(self.game_communication_path, "keyblade_stats.cfg"), 'w') as f: - #### f.write(str(keyblade_stats)) - #### f.close() 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])) @@ -237,6 +216,12 @@ 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: + await ctx.send_msgs([{ + "cmd": "LocationScouts", + "locations": [2656401,2656402,2656403,2656404,2656405,2656406], + "create_as_hint": 2 + }]) ctx.locations_checked = sending message = [{"cmd": 'LocationChecks', "locations": sending}] await ctx.send_msgs(message) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 40bea8bcc179..9af75693c82f 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -24,544 +24,544 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: location_table: Dict[str, KH1LocationData] = { - #"Destiny Islands Chest": KH1LocationData("Chests", 265_0011), missable - "Traverse Town 1st District Candle Puzzle Chest": KH1LocationData("Chests", 265_0211), - "Traverse Town 1st District Accessory Shop Roof Chest": KH1LocationData("Chests", 265_0212), - "Traverse Town 2nd District Boots and Shoes Awning Chest": KH1LocationData("Chests", 265_0213), - "Traverse Town 2nd District Rooftop Chest": KH1LocationData("Chests", 265_0214), - "Traverse Town 2nd District Gizmo Shop Facade Chest": KH1LocationData("Chests", 265_0251), - "Traverse Town Alleyway Balcony Chest": KH1LocationData("Chests", 265_0252), - "Traverse Town Alleyway Blue Room Awning Chest": KH1LocationData("Chests", 265_0253), - "Traverse Town Alleyway Corner Chest": KH1LocationData("Chests", 265_0254), - "Traverse Town Green Room Clock Puzzle Chest": KH1LocationData("Chests", 265_0292), - "Traverse Town Green Room Table Chest": KH1LocationData("Chests", 265_0293), - "Traverse Town Red Room Chest": KH1LocationData("Chests", 265_0294), - "Traverse Town Mystical House Yellow Trinity Chest": KH1LocationData("Chests", 265_0331), - "Traverse Town Accessory Shop Chest": KH1LocationData("Chests", 265_0332), - "Traverse Town Secret Waterway White Trinity Chest": KH1LocationData("Chests", 265_0333), - "Traverse Town Geppetto's House Chest": KH1LocationData("Chests", 265_0334), - "Traverse Town Item Workshop Right Chest": KH1LocationData("Chests", 265_0371), - "Traverse Town 1st District Blue Trinity Balcony Chest": KH1LocationData("Chests", 265_0411), - "Traverse Town Mystical House Glide Chest": KH1LocationData("Chests", 265_0891), - "Traverse Town Alleyway Behind Crates Chest": KH1LocationData("Chests", 265_0892), - "Traverse Town Item Workshop Left Chest": KH1LocationData("Chests", 265_0893), - "Traverse Town Secret Waterway Near Stairs Chest": KH1LocationData("Chests", 265_0894), - "Wonderland Rabbit Hole Green Trinity Chest": KH1LocationData("Chests", 265_0931), - "Wonderland Rabbit Hole Defeat Heartless 1 Chest": KH1LocationData("Chests", 265_0932), - "Wonderland Rabbit Hole Defeat Heartless 2 Chest": KH1LocationData("Chests", 265_0933), - "Wonderland Rabbit Hole Defeat Heartless 3 Chest": KH1LocationData("Chests", 265_0934), - "Wonderland Bizarre Room Green Trinity Chest": KH1LocationData("Chests", 265_0971), - "Wonderland Queen's Castle Hedge Left Red Chest": KH1LocationData("Chests", 265_1011), - "Wonderland Queen's Castle Hedge Right Blue Chest": KH1LocationData("Chests", 265_1012), - "Wonderland Queen's Castle Hedge Right Red Chest": KH1LocationData("Chests", 265_1013), - "Wonderland Lotus Forest Thunder Plant Chest": KH1LocationData("Chests", 265_1014), - "Wonderland Lotus Forest Through the Painting Thunder Plant Chest": KH1LocationData("Chests", 265_1051), - "Wonderland Lotus Forest Glide Chest": KH1LocationData("Chests", 265_1052), - "Wonderland Lotus Forest Nut Chest": KH1LocationData("Chests", 265_1053), - "Wonderland Lotus Forest Corner Chest": KH1LocationData("Chests", 265_1054), - "Wonderland Bizarre Room Lamp Chest": KH1LocationData("Chests", 265_1091), - "Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest": KH1LocationData("Chests", 265_1093), - "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest": KH1LocationData("Chests", 265_1094), - "Wonderland Tea Party Garden Bear and Clock Puzzle Chest": KH1LocationData("Chests", 265_1131), - "Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest": KH1LocationData("Chests", 265_1132), - "Wonderland Lotus Forest Through the Painting White Trinity Chest": KH1LocationData("Chests", 265_1133), - "Deep Jungle Tree House Beneath Tree House Chest": KH1LocationData("Chests", 265_1213), - "Deep Jungle Tree House Rooftop Chest": KH1LocationData("Chests", 265_1214), - "Deep Jungle Hippo's Lagoon Center Chest": KH1LocationData("Chests", 265_1251), - "Deep Jungle Hippo's Lagoon Left Chest": KH1LocationData("Chests", 265_1252), - "Deep Jungle Hippo's Lagoon Right Chest": KH1LocationData("Chests", 265_1253), - "Deep Jungle Vines Chest": KH1LocationData("Chests", 265_1291), - "Deep Jungle Vines 2 Chest": KH1LocationData("Chests", 265_1292), - "Deep Jungle Climbing Trees Blue Trinity Chest": KH1LocationData("Chests", 265_1293), - "Deep Jungle Tunnel Chest": KH1LocationData("Chests", 265_1331), - "Deep Jungle Cavern of Hearts White Trinity Chest": KH1LocationData("Chests", 265_1332), - "Deep Jungle Camp Blue Trinity Chest": KH1LocationData("Chests", 265_1333), - "Deep Jungle Tent Chest": KH1LocationData("Chests", 265_1334), - "Deep Jungle Waterfall Cavern Low Chest": KH1LocationData("Chests", 265_1371), - "Deep Jungle Waterfall Cavern Middle Chest": KH1LocationData("Chests", 265_1372), - "Deep Jungle Waterfall Cavern High Wall Chest": KH1LocationData("Chests", 265_1373), - "Deep Jungle Waterfall Cavern High Middle Chest": KH1LocationData("Chests", 265_1374), - "Deep Jungle Cliff Right Cliff Left Chest": KH1LocationData("Chests", 265_1411), - "Deep Jungle Cliff Right Cliff Right Chest": KH1LocationData("Chests", 265_1412), - "Deep Jungle Tree House Suspended Boat Chest": KH1LocationData("Chests", 265_1413), - "100 Acre Wood Meadow Inside Log Chest": KH1LocationData("Chests", 265_1654), - "100 Acre Wood Bouncing Spot Left Cliff Chest": KH1LocationData("Chests", 265_1691), - "100 Acre Wood Bouncing Spot Right Tree Alcove Chest": KH1LocationData("Chests", 265_1692), - "100 Acre Wood Bouncing Spot Under Giant Pot Chest": KH1LocationData("Chests", 265_1693), - "Agrabah Plaza By Storage Chest": KH1LocationData("Chests", 265_1972), - "Agrabah Plaza Raised Terrace Chest": KH1LocationData("Chests", 265_1973), - "Agrabah Plaza Top Corner Chest": KH1LocationData("Chests", 265_1974), - "Agrabah Alley Chest": KH1LocationData("Chests", 265_2011), - "Agrabah Bazaar Across Windows Chest": KH1LocationData("Chests", 265_2012), - "Agrabah Bazaar High Corner Chest": KH1LocationData("Chests", 265_2013), - "Agrabah Main Street Right Palace Entrance Chest": KH1LocationData("Chests", 265_2014), - "Agrabah Main Street High Above Alley Entrance Chest": KH1LocationData("Chests", 265_2051), - "Agrabah Main Street High Above Palace Gates Entrance Chest": KH1LocationData("Chests", 265_2052), - "Agrabah Palace Gates Low Chest": KH1LocationData("Chests", 265_2053), - "Agrabah Palace Gates High Opposite Palace Chest": KH1LocationData("Chests", 265_2054), - "Agrabah Palace Gates High Close to Palace Chest": KH1LocationData("Chests", 265_2091), - "Agrabah Storage Green Trinity Chest": KH1LocationData("Chests", 265_2092), - "Agrabah Storage Behind Barrel Chest": KH1LocationData("Chests", 265_2093), - "Agrabah Cave of Wonders Entrance Left Chest": KH1LocationData("Chests", 265_2094), - "Agrabah Cave of Wonders Entrance Tall Tower Chest": KH1LocationData("Chests", 265_2131), - "Agrabah Cave of Wonders Hall High Left Chest": KH1LocationData("Chests", 265_2132), - "Agrabah Cave of Wonders Hall Near Bottomless Hall Chest": KH1LocationData("Chests", 265_2133), - "Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest": KH1LocationData("Chests", 265_2134), - "Agrabah Cave of Wonders Bottomless Hall Pillar Chest": KH1LocationData("Chests", 265_2171), - "Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest": KH1LocationData("Chests", 265_2172), - "Agrabah Cave of Wonders Treasure Room Across Platforms Chest": KH1LocationData("Chests", 265_2173), - "Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest": KH1LocationData("Chests", 265_2174), - "Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest": KH1LocationData("Chests", 265_2211), - "Agrabah Cave of Wonders Treasure Room Above Fire Chest": KH1LocationData("Chests", 265_2212), - "Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest": KH1LocationData("Chests", 265_2213), - "Agrabah Cave of Wonders Relic Chamber Stairs Chest": KH1LocationData("Chests", 265_2214), - "Agrabah Cave of Wonders Dark Chamber Abu Gem Chest": KH1LocationData("Chests", 265_2251), - "Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest": KH1LocationData("Chests", 265_2252), - "Agrabah Cave of Wonders Dark Chamber Bridge Chest": KH1LocationData("Chests", 265_2253), - "Agrabah Cave of Wonders Dark Chamber Near Save Chest": KH1LocationData("Chests", 265_2254), - "Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest": KH1LocationData("Chests", 265_2291), - "Agrabah Cave of Wonders Hidden Room Right Chest": KH1LocationData("Chests", 265_2292), - "Agrabah Cave of Wonders Hidden Room Left Chest": KH1LocationData("Chests", 265_2293), - "Agrabah Aladdin's House Main Street Entrance Chest": KH1LocationData("Chests", 265_2294), - "Agrabah Aladdin's House Plaza Entrance Chest": KH1LocationData("Chests", 265_2331), - "Agrabah Cave of Wonders Entrance White Trinity Chest": KH1LocationData("Chests", 265_2332), - "Monstro Chamber 6 Other Platform Chest": KH1LocationData("Chests", 265_2413), - "Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest": KH1LocationData("Chests", 265_2414), - "Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest": KH1LocationData("Chests", 265_2451), - "Monstro Chamber 6 Low Chest": KH1LocationData("Chests", 265_2452), - "Atlantica Sunken Ship In Flipped Boat Chest": KH1LocationData("Chests", 265_2531), - "Atlantica Sunken Ship Seabed Chest": KH1LocationData("Chests", 265_2532), - "Atlantica Sunken Ship Inside Ship Chest": KH1LocationData("Chests", 265_2533), - "Atlantica Ariel's Grotto High Chest": KH1LocationData("Chests", 265_2534), - "Atlantica Ariel's Grotto Middle Chest": KH1LocationData("Chests", 265_2571), - "Atlantica Ariel's Grotto Low Chest": KH1LocationData("Chests", 265_2572), - "Atlantica Ursula's Lair Use Fire on Urchin Chest": KH1LocationData("Chests", 265_2573), - "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest": KH1LocationData("Chests", 265_2574), - "Atlantica Triton's Palace White Trinity Chest": KH1LocationData("Chests", 265_2611), - "Halloween Town Moonlight Hill White Trinity Chest": KH1LocationData("Chests", 265_3014), - "Halloween Town Bridge Under Bridge": KH1LocationData("Chests", 265_3051), - "Halloween Town Boneyard Tombstone Puzzle Chest": KH1LocationData("Chests", 265_3052), - "Halloween Town Bridge Right of Gate Chest": KH1LocationData("Chests", 265_3053), - "Halloween Town Cemetary Behind Grave Chest": KH1LocationData("Chests", 265_3054), - "Halloween Town Cemetary By Cat Shape Chest": KH1LocationData("Chests", 265_3091), - "Halloween Town Cemetary Between Graves Chest": KH1LocationData("Chests", 265_3092), - "Halloween Town Oogie's Manor Lower Iron Cage Chest": KH1LocationData("Chests", 265_3093), - "Halloween Town Oogie's Manor Upper Iron Cage Chest": KH1LocationData("Chests", 265_3094), - "Halloween Town Oogie's Manor Hollow Chest": KH1LocationData("Chests", 265_3131), - "Halloween Town Oogie's Manor Grounds Red Trinity Chest": KH1LocationData("Chests", 265_3132), - "Halloween Town Guillotine Square High Tower Chest": KH1LocationData("Chests", 265_3133), - "Halloween Town Guillotine Square Pumpkin Structure Left Chest": KH1LocationData("Chests", 265_3134), - "Halloween Town Oogie's Manor Entrance Steps Chest": KH1LocationData("Chests", 265_3171), - "Halloween Town Oogie's Manor Inside Entrance Chest": KH1LocationData("Chests", 265_3172), - "Halloween Town Bridge Left of Gate Chest": KH1LocationData("Chests", 265_3291), - "Halloween Town Cemetary By Striped Grave Chest": KH1LocationData("Chests", 265_3292), - "Halloween Town Guillotine Square Under Jack's House Stairs Chest": KH1LocationData("Chests", 265_3293), - "Halloween Town Guillotine Square Pumpkin Structure Right Chest": KH1LocationData("Chests", 265_3294), - "Olympus Coliseum Coliseum Gates Left Behind Columns Chest": KH1LocationData("Chests", 265_3332), - "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest": KH1LocationData("Chests", 265_3333), - "Olympus Coliseum Coliseum Gates Left Blue Trinity Chest": KH1LocationData("Chests", 265_3334), - "Olympus Coliseum Coliseum Gates White Trinity Chest": KH1LocationData("Chests", 265_3371), - "Olympus Coliseum Coliseum Gates Blizzara Chest": KH1LocationData("Chests", 265_3372), - "Olympus Coliseum Coliseum Gates Blizzaga Chest": KH1LocationData("Chests", 265_3373), - "Monstro Mouth Boat Deck Chest": KH1LocationData("Chests", 265_3454), - "Monstro Mouth High Platform Boat Side Chest": KH1LocationData("Chests", 265_3491), - "Monstro Mouth High Platform Across from Boat Chest": KH1LocationData("Chests", 265_3492), - "Monstro Mouth Near Ship Chest": KH1LocationData("Chests", 265_3493), - "Monstro Mouth Green Trinity Top of Boat Chest": KH1LocationData("Chests", 265_3494), - "Monstro Chamber 2 Ground Chest": KH1LocationData("Chests", 265_3534), - "Monstro Chamber 2 Platform Chest": KH1LocationData("Chests", 265_3571), - "Monstro Chamber 5 Platform Chest": KH1LocationData("Chests", 265_3613), - "Monstro Chamber 3 Ground Chest": KH1LocationData("Chests", 265_3614), - "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest": KH1LocationData("Chests", 265_3651), - "Monstro Chamber 3 Near Chamber 6 Entrance Chest": KH1LocationData("Chests", 265_3652), - "Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest": KH1LocationData("Chests", 265_3653), - "Monstro Mouth High Platform Near Teeth Chest": KH1LocationData("Chests", 265_3732), - "Monstro Chamber 5 Atop Barrel Chest": KH1LocationData("Chests", 265_3733), - "Monstro Chamber 5 Low 2nd Chest": KH1LocationData("Chests", 265_3734), - "Monstro Chamber 5 Low 1st Chest": KH1LocationData("Chests", 265_3771), - "Neverland Pirate Ship Deck White Trinity Chest": KH1LocationData("Chests", 265_3772), - "Neverland Pirate Ship Crows Nest Chest": KH1LocationData("Chests", 265_3773), - "Neverland Hold Yellow Trinity Right Blue Chest": KH1LocationData("Chests", 265_3774), - "Neverland Hold Yellow Trinity Left Blue Chest": KH1LocationData("Chests", 265_3811), - "Neverland Galley Chest": KH1LocationData("Chests", 265_3812), - "Neverland Cabin Chest": KH1LocationData("Chests", 265_3813), - "Neverland Hold Flight 1st Chest ": KH1LocationData("Chests", 265_3814), - "Neverland Clock Tower Chest": KH1LocationData("Chests", 265_4014), - "Neverland Hold Flight 2nd Chest": KH1LocationData("Chests", 265_4051), - "Neverland Hold Yellow Trinity Green Chest": KH1LocationData("Chests", 265_4052), - "Neverland Captain's Cabin Chest": KH1LocationData("Chests", 265_4053), - "Hollow Bastion Rising Falls Water's Surface Chest": KH1LocationData("Chests", 265_4054), - "Hollow Bastion Rising Falls Under Water 1st Chest": KH1LocationData("Chests", 265_4091), - "Hollow Bastion Rising Falls Under Water 2nd Chest": KH1LocationData("Chests", 265_4092), - "Hollow Bastion Rising Falls Floating Platform Near Save Chest": KH1LocationData("Chests", 265_4093), - "Hollow Bastion Rising Falls Floating Platform Near Bubble Chest": KH1LocationData("Chests", 265_4094), - "Hollow Bastion Rising Falls High Platform Chest": KH1LocationData("Chests", 265_4131), - "Hollow Bastion Castle Gates Gravity Chest": KH1LocationData("Chests", 265_4132), - "Hollow Bastion Castle Gates Freestanding Pillar Chest": KH1LocationData("Chests", 265_4133), - "Hollow Bastion Castle Gates High Pillar Chest": KH1LocationData("Chests", 265_4134), - "Hollow Bastion Great Crest Lower Chest": KH1LocationData("Chests", 265_4171), - "Hollow Bastion Great Crest After Battle Platform Chest": KH1LocationData("Chests", 265_4172), - "Hollow Bastion High Tower 2nd Gravity Chest": KH1LocationData("Chests", 265_4173), - "Hollow Bastion High Tower 1st Gravity Chest": KH1LocationData("Chests", 265_4174), - "Hollow Bastion High Tower Above Sliding Blocks Chest": KH1LocationData("Chests", 265_4211), - "Hollow Bastion Library Top of Bookshelf Chest": KH1LocationData("Chests", 265_4213), - "Hollow Bastion Library 1st Floor Turn the Carousel Chest": KH1LocationData("Chests", 265_4214), - "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest": KH1LocationData("Chests", 265_4251), - "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest": KH1LocationData("Chests", 265_4252), - "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest": KH1LocationData("Chests", 265_4253), - "Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest": KH1LocationData("Chests", 265_4254), - "Hollow Bastion Lift Stop Library Node Gravity Chest": KH1LocationData("Chests", 265_4291), - "Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest": KH1LocationData("Chests", 265_4292), - "Hollow Bastion Lift Stop Outside Library Gravity Chest": KH1LocationData("Chests", 265_4293), - "Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest": KH1LocationData("Chests", 265_4294), - "Hollow Bastion Base Level Bubble Under the Wall Platform Chest": KH1LocationData("Chests", 265_4331), - "Hollow Bastion Base Level Platform Near Entrance Chest": KH1LocationData("Chests", 265_4332), - "Hollow Bastion Base Level Near Crystal Switch Chest": KH1LocationData("Chests", 265_4333), - "Hollow Bastion Waterway Near Save Chest": KH1LocationData("Chests", 265_4334), - "Hollow Bastion Waterway Blizzard on Bubble Chest": KH1LocationData("Chests", 265_4371), - "Hollow Bastion Waterway Unlock Passage from Base Level Chest": KH1LocationData("Chests", 265_4372), - "Hollow Bastion Dungeon By Candles Chest": KH1LocationData("Chests", 265_4373), - "Hollow Bastion Dungeon Corner Chest": KH1LocationData("Chests", 265_4374), - "Hollow Bastion Grand Hall Steps Right Side Chest": KH1LocationData("Chests", 265_4454), - "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Chests", 265_4491), - "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Chests", 265_4492), - #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Chests", 265_4493), give vanilla reward - "Hollow Bastion Entrance Hall Left of Emblem Door Chest": KH1LocationData("Chests", 265_4212), - "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Chests", 265_4494), - "End of the World Final Dimension 1st Chest": KH1LocationData("Chests", 265_4531), - "End of the World Final Dimension 2nd Chest": KH1LocationData("Chests", 265_4532), - "End of the World Final Dimension 3rd Chest": KH1LocationData("Chests", 265_4533), - "End of the World Final Dimension 4th Chest": KH1LocationData("Chests", 265_4534), - "End of the World Final Dimension 5th Chest": KH1LocationData("Chests", 265_4571), - "End of the World Final Dimension 6th Chest": KH1LocationData("Chests", 265_4572), - "End of the World Final Dimension 10th Chest": KH1LocationData("Chests", 265_4573), - "End of the World Final Dimension 9th Chest": KH1LocationData("Chests", 265_4574), - "End of the World Final Dimension 8th Chest": KH1LocationData("Chests", 265_4611), - "End of the World Final Dimension 7th Chest": KH1LocationData("Chests", 265_4612), - "End of the World Giant Crevasse 3rd Chest": KH1LocationData("Chests", 265_4613), - "End of the World Giant Crevasse 5th Chest": KH1LocationData("Chests", 265_4614), - "End of the World Giant Crevasse 1st Chest": KH1LocationData("Chests", 265_4651), - "End of the World Giant Crevasse 4th Chest": KH1LocationData("Chests", 265_4652), - "End of the World Giant Crevasse 2nd Chest": KH1LocationData("Chests", 265_4653), - "End of the World World Terminus Traverse Town Chest": KH1LocationData("Chests", 265_4654), - "End of the World World Terminus Wonderland Chest": KH1LocationData("Chests", 265_4691), - "End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("Chests", 265_4692), - "End of the World World Terminus Deep Jungle Chest": KH1LocationData("Chests", 265_4693), - "End of the World World Terminus Agrabah Chest": KH1LocationData("Chests", 265_4694), - "End of the World World Terminus Atlantica Chest": KH1LocationData("Chests", 265_4731), - "End of the World World Terminus Halloween Town Chest": KH1LocationData("Chests", 265_4732), - "End of the World World Terminus Neverland Chest": KH1LocationData("Chests", 265_4733), - "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("Chests", 265_4734), - "End of the World World Terminus Hollow Bastion Chest": KH1LocationData("Chests", 265_4771), - "End of the World Final Rest Chest": KH1LocationData("Chests", 265_4772), - "Monstro Chamber 6 White Trinity Chest": KH1LocationData("Chests", 265_5092), - #"Awakening Chest": KH1LocationData("Chests", 265_5093), missable + #"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 Cemetary Behind Grave Chest": KH1LocationData("Halloween Town", 265_3054), + "Halloween Town Cemetary By Cat Shape Chest": KH1LocationData("Halloween Town", 265_3091), + "Halloween Town Cemetary 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 Cemetary 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), give vanilla reward + "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 - "Traverse Town Defeat Guard Armor Dodge Roll Event": KH1LocationData("Events", 265_6011), - "Traverse Town Defeat Guard Armor Fire Event": KH1LocationData("Events", 265_6012), - "Traverse Town Defeat Guard Armor Blue Trinity Event": KH1LocationData("Events", 265_6013), - "Traverse Town Leon Secret Waterway Earthshine Event": KH1LocationData("Events", 265_6014), - "Traverse Town Kairi Secret Waterway Oathkeeper Event": KH1LocationData("Events", 265_6015), - "Traverse Town Defeat Guard Armor Brave Warrior Event": KH1LocationData("Events", 265_6016), - "Deep Jungle Defeat Sabor White Fang Event": KH1LocationData("Events", 265_6021), - "Deep Jungle Defeat Clayton Cure Event": KH1LocationData("Events", 265_6022), - "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Events", 265_6023), - "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Events", 265_6024), - "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Events", 265_6031), - "Olympus Coliseum Defeat Cerberus Inferno Band Event": KH1LocationData("Events", 265_6033), - "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Events", 265_6041), - "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Events", 265_6042), - "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Events", 265_6051), - "Agrabah Defeat Jafar Blizzard Event": KH1LocationData("Events", 265_6052), - "Agrabah Defeat Jafar Genie Fire Event": KH1LocationData("Events", 265_6053), - "Agrabah Seal Keyhole Genie Event": KH1LocationData("Events", 265_6054), - "Agrabah Seal Keyhole Three Wishes Event": KH1LocationData("Events", 265_6055), - "Agrabah Seal Keyhole Green Trinity Event": KH1LocationData("Events", 265_6056), - "Monstro Defeat Parasite Cage I Goofy Cheer Event": KH1LocationData("Events", 265_6061), - "Monstro Defeat Parasite Cage II Stop Event": KH1LocationData("Events", 265_6062), - "Atlantica Defeat Ursula I Mermaid Kick Event": KH1LocationData("Events", 265_6071), - "Atlantica Defeat Ursula II Thunder Event": KH1LocationData("Events", 265_6072), - "Atlantica Seal Keyhole Crabclaw Event": KH1LocationData("Events", 265_6073), - "Halloween Town Defeat Oogie Boogie Holy Circlet Event": KH1LocationData("Events", 265_6081), - "Halloween Town Defeat Oogie's Manor Gravity Event": KH1LocationData("Events", 265_6082), - "Halloween Town Seal Keyhole Pumpkinhead Event": KH1LocationData("Events", 265_6083), - "Neverland Defeat Anti Sora Raven's Claw Event": KH1LocationData("Events", 265_6091), - "Neverland Encounter Hook Cure Event": KH1LocationData("Events", 265_6092), - "Neverland Seal Keyhole Fairy Harp Event": KH1LocationData("Events", 265_6093), - "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Events", 265_6094), - "Neverland Seal Keyhole Glide Event": KH1LocationData("Events", 265_6095), - "Neverland Defeat Phantom Stop Event": KH1LocationData("Events", 265_6096), - "Neverland Defeat Captain Hook Ars Arcanum Event": KH1LocationData("Events", 265_6097), - "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Events", 265_6101), - "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Events", 265_6102), - "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Events", 265_6103), - "Hollow Bastion Defeat Riku II Ragnarok Event": KH1LocationData("Events", 265_6104), - "Hollow Bastion Defeat Behemoth Omega Arts Event": KH1LocationData("Events", 265_6105), - "Hollow Bastion Speak to Princesses Fire Event": KH1LocationData("Events", 265_6106), - "End of the World Defeat Chernabog Superglide Event": KH1LocationData("Events", 265_6111), + "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 Mail Postcard 01 Event": KH1LocationData("Events", 265_6120), - "Traverse Town Mail Postcard 02 Event": KH1LocationData("Events", 265_6121), - "Traverse Town Mail Postcard 03 Event": KH1LocationData("Events", 265_6122), - "Traverse Town Mail Postcard 04 Event": KH1LocationData("Events", 265_6123), - "Traverse Town Mail Postcard 05 Event": KH1LocationData("Events", 265_6124), - "Traverse Town Mail Postcard 06 Event": KH1LocationData("Events", 265_6125), - "Traverse Town Mail Postcard 07 Event": KH1LocationData("Events", 265_6126), - "Traverse Town Mail Postcard 08 Event": KH1LocationData("Events", 265_6127), - "Traverse Town Mail Postcard 09 Event": KH1LocationData("Events", 265_6128), - "Traverse Town Mail Postcard 10 Event": KH1LocationData("Events", 265_6129), + "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 Defeat Opposite Armor Aero Event": KH1LocationData("Events", 265_6131), + "Traverse Town Defeat Opposite Armor Aero Event": KH1LocationData("Traverse Town", 265_6131), - "Atlantica Undersea Gorge Blizzard Clam": KH1LocationData("Clam", 265_6201), - "Atlantica Undersea Gorge Ocean Floor Clam": KH1LocationData("Clam", 265_6202), - "Atlantica Undersea Valley Higher Cave Clam": KH1LocationData("Clam", 265_6203), - "Atlantica Undersea Valley Lower Cave Clam": KH1LocationData("Clam", 265_6204), - "Atlantica Undersea Valley Fire Clam": KH1LocationData("Clam", 265_6205), - "Atlantica Undersea Valley Wall Clam": KH1LocationData("Clam", 265_6206), - "Atlantica Undersea Valley Pillar Clam": KH1LocationData("Clam", 265_6207), - "Atlantica Undersea Valley Ocean Floor Clam": KH1LocationData("Clam", 265_6208), - "Atlantica Triton's Palace Thunder Clam": KH1LocationData("Clam", 265_6209), - "Atlantica Triton's Palace Wall Right Clam": KH1LocationData("Clam", 265_6210), - "Atlantica Triton's Palace Near Path Clam": KH1LocationData("Clam", 265_6211), - "Atlantica Triton's Palace Wall Left Clam": KH1LocationData("Clam", 265_6212), - "Atlantica Cavern Nook Clam": KH1LocationData("Clam", 265_6213), - "Atlantica Below Deck Clam": KH1LocationData("Clam", 265_6214), - "Atlantica Undersea Garden Clam": KH1LocationData("Clam", 265_6215), - "Atlantica Undersea Cave Clam": KH1LocationData("Clam", 265_6216), + "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), - #"Traverse Town Magician's Study Turn in Naturespark": KH1LocationData("Misc", 265_6300), - #"Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Misc", 265_6301), - #"Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Misc", 265_6302), - #"Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Misc", 265_6303), - "Traverse Town Geppetto's House Geppetto Reward 1": KH1LocationData("Misc", 265_6304), - "Traverse Town Geppetto's House Geppetto Reward 2": KH1LocationData("Misc", 265_6305), - "Traverse Town Geppetto's House Geppetto Reward 3": KH1LocationData("Misc", 265_6306), - "Traverse Town Geppetto's House Geppetto Reward 4": KH1LocationData("Misc", 265_6307), - "Traverse Town Geppetto's House Geppetto Reward 5": KH1LocationData("Misc", 265_6308), - "Traverse Town Geppetto's House Geppetto All Summons Reward": KH1LocationData("Misc", 265_6309), - "Traverse Town Geppetto's House Talk to Pinocchio": KH1LocationData("Misc", 265_6310), - "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Misc", 265_6311), - "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Misc", 265_6312), - "Traverse Town Magician's Study Obtained All LV3 Magic": KH1LocationData("Misc", 265_6313), - "Traverse Town Piano Room Return 10 Puppies": KH1LocationData("Misc", 265_6314), - "Traverse Town Piano Room Return 20 Puppies": KH1LocationData("Misc", 265_6315), - "Traverse Town Piano Room Return 30 Puppies": KH1LocationData("Misc", 265_6316), - "Traverse Town Piano Room Return 40 Puppies": KH1LocationData("Misc", 265_6317), - "Traverse Town Piano Room Return 50 Puppies": KH1LocationData("Misc", 265_6318), - "Traverse Town Piano Room Return 60 Puppies": KH1LocationData("Misc", 265_6320), - "Traverse Town Piano Room Return 70 Puppies": KH1LocationData("Misc", 265_6321), - "Traverse Town Piano Room Return 80 Puppies": KH1LocationData("Misc", 265_6322), - "Traverse Town Piano Room Return 90 Puppies": KH1LocationData("Misc", 265_6324), - "Traverse Town Piano Room Return 99 Puppies Reward 1": KH1LocationData("Misc", 265_6326), - "Traverse Town Piano Room Return 99 Puppies Reward 2": KH1LocationData("Misc", 265_6327), - "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Misc", 265_6032), #Had to change the way we send this check, not changing location_id - "Olympus Coliseum Defeat Sephiroth One-Winged Angel Event": KH1LocationData("Misc", 265_6328), - "Olympus Coliseum Defeat Ice Titan Diamond Dust Event": KH1LocationData("Cups", 265_6329), - "Olympus Coliseum Gates Purple Jar After Defeating Hades": KH1LocationData("Cups", 265_6330), - "Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times": KH1LocationData("Misc", 265_6331), - #"Neverland Clock Tower 01:00 Door": KH1LocationData("Misc", 265_6332), - #"Neverland Clock Tower 02:00 Door": KH1LocationData("Misc", 265_6333), - #"Neverland Clock Tower 03:00 Door": KH1LocationData("Misc", 265_6334), - #"Neverland Clock Tower 04:00 Door": KH1LocationData("Misc", 265_6335), - #"Neverland Clock Tower 05:00 Door": KH1LocationData("Misc", 265_6336), - #"Neverland Clock Tower 06:00 Door": KH1LocationData("Misc", 265_6337), - #"Neverland Clock Tower 07:00 Door": KH1LocationData("Misc", 265_6338), - #"Neverland Clock Tower 08:00 Door": KH1LocationData("Misc", 265_6339), - #"Neverland Clock Tower 09:00 Door": KH1LocationData("Misc", 265_6340), - #"Neverland Clock Tower 10:00 Door": KH1LocationData("Misc", 265_6341), - #"Neverland Clock Tower 11:00 Door": KH1LocationData("Misc", 265_6342), - #"Neverland Clock Tower 12:00 Door": KH1LocationData("Misc", 265_6343), - "Neverland Hold Aero Chest": KH1LocationData("Misc", 265_6344), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 1": KH1LocationData("Misc", 265_6345), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 2": KH1LocationData("Misc", 265_6346), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 3": KH1LocationData("Misc", 265_6347), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 4": KH1LocationData("Misc", 265_6348), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 5": KH1LocationData("Misc", 265_6349), - "100 Acre Wood Pooh's House Owl Cheer": KH1LocationData("Misc", 265_6350), - "100 Acre Wood Convert Torn Page 1": KH1LocationData("Misc", 265_6351), - "100 Acre Wood Convert Torn Page 2": KH1LocationData("Misc", 265_6352), - "100 Acre Wood Convert Torn Page 3": KH1LocationData("Misc", 265_6353), - "100 Acre Wood Convert Torn Page 4": KH1LocationData("Misc", 265_6354), - "100 Acre Wood Convert Torn Page 5": KH1LocationData("Misc", 265_6355), - "100 Acre Wood Pooh's House Start Fire": KH1LocationData("Misc", 265_6356), - "100 Acre Wood Pooh's Room Cabinet": KH1LocationData("Misc", 265_6357), - "100 Acre Wood Pooh's Room Chimney": KH1LocationData("Misc", 265_6358), - "100 Acre Wood Bouncing Spot Break Log": KH1LocationData("Misc", 265_6359), - "100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh": KH1LocationData("Misc", 265_6360), - "Deep Jungle Camp Hi-Potion Experiment": KH1LocationData("Misc", 265_6361), - "Deep Jungle Camp Ether Experiment": KH1LocationData("Misc", 265_6362), - "Deep Jungle Camp Replication Experiment": KH1LocationData("Misc", 265_6363), - "Deep Jungle Cliff Save Gorillas": KH1LocationData("Misc", 265_6364), - "Deep Jungle Tree House Save Gorillas": KH1LocationData("Misc", 265_6365), - "Deep Jungle Camp Save Gorillas": KH1LocationData("Misc", 265_6366), - "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Misc", 265_6367), - "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Misc", 265_6368), - "Olympus Coliseum Olympia Chest": KH1LocationData("Cups", 265_6369), - "Deep Jungle Jungle Slider 10 Fruits": KH1LocationData("Misc", 265_6370), - "Deep Jungle Jungle Slider 20 Fruits": KH1LocationData("Misc", 265_6371), - "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Misc", 265_6372), - "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Misc", 265_6373), - "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Misc", 265_6374), - #"Traverse Town 1st District Speak with Cid Event": KH1LocationData("Misc", 265_6375), - "Wonderland Bizarre Room Read Book": KH1LocationData("Misc", 265_6376), - "Olympus Coliseum Coliseum Gates Green Trinity": KH1LocationData("Misc", 265_6377), - "Agrabah Defeat Kurt Zisa Zantetsuken Event": KH1LocationData("Misc", 265_6378), - "Hollow Bastion Defeat Unknown EXP Necklace Event": KH1LocationData("Misc", 265_6379), + #"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": KH1LocationData("Traverse Town", 265_6318), + "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), - "Traverse Town Synth Log": KH1LocationData("Synth", 265_6401), - "Traverse Town Synth Cloth": KH1LocationData("Synth", 265_6402), - "Traverse Town Synth Rope": KH1LocationData("Synth", 265_6403), - "Traverse Town Synth Seagull Egg": KH1LocationData("Synth", 265_6404), - "Traverse Town Synth Fish": KH1LocationData("Synth", 265_6405), - "Traverse Town Synth Mushroom": KH1LocationData("Synth", 265_6406), + "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), - "Agrabah Defeat Jafar Genie Ansem's Report 1": KH1LocationData("Reports", 265_7018), - #"Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Reports", 265_7017), - "Atlantica Defeat Ursula II Ansem's Report 3": KH1LocationData("Reports", 265_7016), - #"Hollow Bastion Speak with Aerith Ansem's Report 4": KH1LocationData("Reports", 265_7015), - "Hollow Bastion Defeat Maleficent Ansem's Report 5": KH1LocationData("Reports", 265_7014), - #"Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Reports", 265_7013), - "Halloween Town Defeat Oogie Boogie Ansem's Report 7": KH1LocationData("Reports", 265_7012), - "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Cups", 265_7011), - "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Reports", 265_7028), - #"Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Reports", 265_7027), - "Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Reports", 265_7026), - "Olympus Coliseum Defeat Sephiroth Ansem's Report 12": KH1LocationData("Reports", 265_7025), - "Hollow Bastion Defeat Unknown Ansem's Report 13": KH1LocationData("Reports", 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("Cups", 265_9001), - "Complete Phil Cup Solo": KH1LocationData("Cups", 265_9002), - "Complete Phil Cup Time Trial": KH1LocationData("Cups", 265_9003), - "Complete Pegasus Cup": KH1LocationData("Cups", 265_9004), - "Complete Pegasus Cup Solo": KH1LocationData("Cups", 265_9005), - "Complete Pegasus Cup Time Trial": KH1LocationData("Cups", 265_9006), - "Complete Hercules Cup": KH1LocationData("Cups", 265_9007), - "Complete Hercules Cup Solo": KH1LocationData("Cups", 265_9008), - "Complete Hercules Cup Time Trial": KH1LocationData("Cups", 265_9009), - "Complete Hades Cup": KH1LocationData("Cups", 265_9010), - "Complete Hades Cup Solo": KH1LocationData("Cups", 265_9011), - "Complete Hades Cup Time Trial": KH1LocationData("Cups", 265_9012), - "Hades Cup Defeat Cloud and Leon Event": KH1LocationData("Cups", 265_9013), - "Hades Cup Defeat Yuffie Event": KH1LocationData("Cups", 265_9014), - "Hades Cup Defeat Cerberus Event": KH1LocationData("Cups", 265_9015), - "Hades Cup Defeat Behemoth Event": KH1LocationData("Cups", 265_9016), - "Hades Cup Defeat Hades Event": KH1LocationData("Cups", 265_9017), - "Hercules Cup Defeat Cloud Event": KH1LocationData("Cups", 265_9018), - "Hercules Cup Yellow Trinity Event": KH1LocationData("Cups", 265_9019), - "Final Ansem": KH1LocationData("Final", 265_9999) + "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) } event_location_table: Dict[str, KH1LocationData] = { - "Traverse Town Item Shop Postcard": KH1LocationData("Event"), - "Traverse Town 1st District Safe Postcard": KH1LocationData("Event"), - "Traverse Town Gizmo Shop Postcard 1": KH1LocationData("Event"), - "Traverse Town Gizmo Shop Postcard 2": KH1LocationData("Event"), - "Traverse Town Item Workshop Postcard": KH1LocationData("Event"), - "Traverse Town 3rd District Balcony Postcard": KH1LocationData("Event"), - "Traverse Town Geppetto's House Postcard": KH1LocationData("Event"), - "Traverse Town Piano Room Return 50 Puppies Torn Page": KH1LocationData("Event"), - "Halloween Town Lab Torn Page": KH1LocationData("Event"), - "Atlantica Ariel's Grotto Torn Page": KH1LocationData("Event") + "Traverse Town Item Shop Postcard": KH1LocationData("Traverse Town"), + "Traverse Town 1st District Safe Postcard": KH1LocationData("Traverse Town"), + "Traverse Town Gizmo Shop Postcard 1": KH1LocationData("Traverse Town"), + "Traverse Town Gizmo Shop Postcard 2": KH1LocationData("Traverse Town"), + "Traverse Town Item Workshop Postcard": KH1LocationData("Traverse Town"), + "Traverse Town 3rd District Balcony Postcard": KH1LocationData("Traverse Town"), + "Traverse Town Geppetto's House Postcard": KH1LocationData("Traverse Town"), + "Traverse Town Piano Room Return 50 Puppies Torn Page": KH1LocationData("Traverse Town"), + "Halloween Town Lab Torn Page": KH1LocationData("Halloween Town"), + "Atlantica Ariel's Grotto Torn Page": KH1LocationData("Atlantica") } lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in location_table.items() if data.code} From 5db1f4e7abbbbb215f93570fe9652983918c9e9c Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 00:58:30 -0500 Subject: [PATCH 163/284] so many changes --- worlds/kh1/Items.py | 50 +- worlds/kh1/Locations.py | 76 +- worlds/kh1/Options.py | 71 +- worlds/kh1/Regions.py | 68 +- worlds/kh1/Rules.py | 2316 +++++++++++++++++++++++++++++++-------- worlds/kh1/__init__.py | 138 ++- 6 files changed, 2160 insertions(+), 559 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index e9ddbff5d4c8..9f30685bc559 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -112,20 +112,20 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, max_quantity = 1, weight = 10), #"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, max_quantity = 1, weight = 10), @@ -214,10 +214,10 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 6, weight = 10), #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Log": KH1ItemData("Key", code = 264_1192, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Cloth": KH1ItemData("Key", code = 264_1193, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Rope": KH1ItemData("Key", code = 264_1194, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -237,13 +237,13 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 3, weight = 10), - #"Torn Page 1": KH1ItemData("Key", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 1": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 2": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Torn Page 4": KH1ItemData("Key", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Torn Page 5": KH1ItemData("Key", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Slide 1": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 10, weight = 10), + "Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 4": KH1ItemData("Torn Pages", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Torn Page 5": KH1ItemData("Torn Pages", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Slides": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -284,8 +284,8 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 2, weight = 10), + "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 0, weight = 10), "Puppy 01": KH1ItemData("Puppies", code = 264_2101, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Puppy 02": KH1ItemData("Puppies", code = 264_2102, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Puppy 03": KH1ItemData("Puppies", code = 264_2103, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -478,8 +478,8 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "EXP Zero": KH1ItemData("XPZ", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Max MP Increase": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15, weight = 10), "Max AP Increase": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15, weight = 10), diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 9af75693c82f..0b0f4d6f4804 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -225,7 +225,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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), give vanilla reward + #"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), @@ -348,7 +348,8 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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": KH1LocationData("Traverse Town", 265_6318), + "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), @@ -360,18 +361,18 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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 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), @@ -403,11 +404,18 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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), + "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 Synth Log": KH1LocationData("Traverse Town", 265_6401), "Traverse Town Synth Cloth": KH1LocationData("Traverse Town", 265_6402), @@ -416,16 +424,33 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Traverse Town Synth Fish": KH1LocationData("Traverse Town", 265_6405), "Traverse Town Synth Mushroom": KH1LocationData("Traverse Town", 265_6406), + "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), + "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), + "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 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), + "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), + "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), @@ -551,18 +576,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Final Ansem": KH1LocationData("Final", 265_9999) } -event_location_table: Dict[str, KH1LocationData] = { - "Traverse Town Item Shop Postcard": KH1LocationData("Traverse Town"), - "Traverse Town 1st District Safe Postcard": KH1LocationData("Traverse Town"), - "Traverse Town Gizmo Shop Postcard 1": KH1LocationData("Traverse Town"), - "Traverse Town Gizmo Shop Postcard 2": KH1LocationData("Traverse Town"), - "Traverse Town Item Workshop Postcard": KH1LocationData("Traverse Town"), - "Traverse Town 3rd District Balcony Postcard": KH1LocationData("Traverse Town"), - "Traverse Town Geppetto's House Postcard": KH1LocationData("Traverse Town"), - "Traverse Town Piano Room Return 50 Puppies Torn Page": KH1LocationData("Traverse Town"), - "Halloween Town Lab Torn Page": KH1LocationData("Halloween Town"), - "Atlantica Ariel's Grotto Torn Page": KH1LocationData("Atlantica") -} +event_location_table: Dict[str, KH1LocationData] = {} 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 fdefea79780c..87d3d27148f6 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -291,6 +291,65 @@ class GoofyDeathLink(Toggle): """ display_name = "Goofy Death Link" +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 + + Note: Does not apply to Atlantica, 100 Acre Wood, The emblem and carousel chests in Hollow Bastion, or the Aero chest in Neverland currently. + """ + display_name = "Keyblades Unlock Chests" + +class InteractInBattle(Toggle): + """ + Allow Sora to talk, examine, and open chests in battle + """ + display_name = "Interact in Battle" + +class AdvancedLogic(Toggle): + """ + If on, logic may expect you to do advanced skips like combo master, dumbo, and other unusual methods for reaching locations. + """ + display_name = "Advanced Logic" + +class ExtraSharedAbilities(Toggle): + """ + 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. + """ + display_name = "Extra Shared Abilities" + +class EXPZeroInPool(Toggle): + """ + If on, adds EXP Zero ability to the item pool. This is redundant if you are planning on playing on Proud. + """ + display_name = "EXP Zero in Pool" + +class VanillaEmblemPieces(DefaultOnToggle): + """ + If on, the Hollow Bastion emblem pieces are in their vanilla locations. + """ + display_name = "Vanilla Emblem Pieces" + +class JunkInMissableLocations(DefaultOnToggle): + """ + If on, will place Elixirs in missable locations. If turned off, there is a chance you will need to play the game multiple times to get the missed items. + Locations include: + Leon Gift + Aerith Gift + Clock Tower Doors + World Terminus Hollow Bastion Chest + """ + display_name = "Junk in Missable Locations" + @dataclass class KH1Options(PerGameCommonOptions): goal: Goal @@ -304,7 +363,16 @@ class KH1Options(PerGameCommonOptions): hundred_acre_wood: HundredAcreWood cups: Cups puppies: Puppies + keyblades_unlock_chests: KeybladesUnlockChests + interact_in_battle: InteractInBattle exp_multiplier: EXPMultiplier + advanced_logic: AdvancedLogic + extra_shared_abilities: ExtraSharedAbilities + exp_zero_in_pool: EXPZeroInPool + vanilla_emblem_pieces: VanillaEmblemPieces + junk_in_missable_locations: JunkInMissableLocations + donald_death_link: DonaldDeathLink + goofy_death_link: GoofyDeathLink randomize_keyblade_stats: RandomizeKeybladeStats bad_starting_weapons: BadStartingWeapons keyblade_max_str: KeybladeMaxStrength @@ -320,6 +388,5 @@ class KH1Options(PerGameCommonOptions): mp_increase: MPIncrease accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease - donald_death_link: DonaldDeathLink - goofy_death_link: GoofyDeathLink + diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index eb4eb42f2664..67f01b96ed18 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -347,17 +347,17 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Atlantica"].locations.append("Atlantica Undersea Cave Clam") regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Ansem's Report 1") - #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 2") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 2") if options.atlantica: regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Ansem's Report 3") - #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 4") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 4") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Ansem's Report 5") - #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 6") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 6") regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie Boogie Ansem's Report 7") if options.cups: regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") regions["Neverland"].locations.append("Neverland Defeat Hook Ansem's Report 9") - #regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") if options.super_bosses: regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") if options.super_bosses or options.goal.current_key == "sephiroth": @@ -407,7 +407,8 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 20 Puppies") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 30 Puppies") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 40 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 50 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 50 Puppies Reward 1") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 50 Puppies Reward 2") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 60 Puppies") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 70 Puppies") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 80 Puppies") @@ -421,18 +422,18 @@ def create_regions(multiworld: MultiWorld, player: int, options): if options.cups: regions["Olympus Coliseum"].locations.append("Olympus Coliseum Gates Purple Jar After Defeating Hades") regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times") - #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 Hold Aero Chest") if options.hundred_acre_wood: regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 1") @@ -468,13 +469,21 @@ def create_regions(multiworld: MultiWorld, player: int, options): 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["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["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Green Trinity") if options.super_bosses: regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event") if options.super_bosses or options.goal.current_key == "unknown": regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Hero's License Event") + if options.atlantica: + regions["Atlantica"].locations.append("Atlantica Sunken Ship Crystal Trident Event") + regions["Halloween Town"].locations.append("Halloween Town Graveyard Forget-Me-Not Event") + regions["Deep Jungle"].locations.append("Deep Jungle Tent Protect-G Event") + regions["Deep Jungle"].locations.append("Deep Jungle Cavern of Hearts Navi-G Piece Event") + regions["Wonderland"].locations.append("Wonderland Bizarre Room Navi-G Piece Event") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Entry Pass Event") regions["Traverse Town"].locations.append("Traverse Town Synth Log") regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") @@ -482,13 +491,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Synth Seagull Egg") regions["Traverse Town"].locations.append("Traverse Town Synth Fish") regions["Traverse Town"].locations.append("Traverse Town Synth Mushroom") - - if options.goal.current_key == "final_ansem": - regions["End of the World"].locations.append("Final Ansem") - - - #Set up event locations: regions["Traverse Town"].locations.append("Traverse Town Item Shop Postcard") regions["Traverse Town"].locations.append("Traverse Town 1st District Safe Postcard") regions["Traverse Town"].locations.append("Traverse Town Gizmo Shop Postcard 1") @@ -496,10 +499,21 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Item Workshop Postcard") regions["Traverse Town"].locations.append("Traverse Town 3rd District Balcony Postcard") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Postcard") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 50 Puppies Torn Page") regions["Halloween Town"].locations.append("Halloween Town Lab Torn Page") - if options.atlantica: - regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Torn Page") + regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Flame)") + regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Chest)") + regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Statue)") + regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Fountain)") + regions["Traverse Town"].locations.append("Traverse Town 1st District Leon Gift") + regions["Traverse Town"].locations.append("Traverse Town 1st District Aerith Gift") + regions["Hollow Bastion"].locations.append("Hollow Bastion Library Speak to Belle Divine Rose") + regions["Hollow Bastion"].locations.append("Hollow Bastion Library Speak to Aerith Cure") + + if options.goal.current_key == "final_ansem": + regions["End of the World"].locations.append("Final Ansem") + + + # Set up the regions correctly. for name, data in regions.items(): diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index c1870e5a60b0..147bc33c8ca3 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,14 +1,19 @@ from BaseClasses import CollectionState, MultiWorld -def has_x_worlds(state: CollectionState, player: int, num_of_worlds) -> bool: - return sum([1 for world in ["Wonderland", "Olympus Coliseum", "Deep Jungle", - "Agrabah", "Monstro", "Atlantica", - "Halloween Town", "Neverland", "Hollow Bastion", - "End of the World"] if has_item(state, player, world)]) >= num_of_worlds +def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keyblades_unlock_chests: bool) -> bool: + worlds_acquired = 0.0 + 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"] + 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 has_keyblade(state, player, keyblades_unlock_chests, keyblades[i]): + worlds_acquired = worlds_acquired + 0.5 + return worlds_acquired >= num_of_worlds def has_slides(state: CollectionState, player: int) -> bool: - return state.has("Slide 1", player) #and state.has("Slide 2", player) and state.has("Slide 3", player) and state.has("Slide 4", player) and state.has("Slide 5", player) and state.has("Slide 6", player) + return state.has("Slides", player) def has_evidence(state: CollectionState, player: int) -> bool: return state.has("Footprints", player) #or state.has("Stench", player) or state.has("Claw Marks", player) or state.has("Antenna", player) @@ -17,7 +22,13 @@ def can_glide(state: CollectionState, player: int) -> bool: return state.has("Glide", player) or state.has("Superglide", player) def has_emblems(state: CollectionState, player: int) -> bool: - return state.has("Theon Vol. 6", player) and state.has("Red Trinity", player) and state.has("Progressive Fire", player) and (state.has("Progressive Thunder", player) or state.has("High Jump", player) or can_glide(state, player)) and state.has("Hollow Bastion", player) + return ( + state.has("Emblem Piece (Flame)", player) + and state.has("Emblem Piece (Chest)", player) + and state.has("Emblem Piece (Statue)", player) + and state.has("Emblem Piece (Fountain)", player) + and state.has("Hollow Bastion", player) + ) def has_item(state: CollectionState, player: int, item: str) -> bool: return state.has(item, player) @@ -27,7 +38,6 @@ def has_at_least(state: CollectionState, player: int, item: str, x: int) -> bool def has_postcards(state: CollectionState, player: int, postcards_required: int) -> bool: postcards_available = 0 - postcards_available = postcards_available + state.count("Vanilla Postcard", player) postcards_available = postcards_available + state.count("Postcard", player) return postcards_available >= postcards_required @@ -45,9 +55,11 @@ def has_puppies(state: CollectionState, player: int, puppies_required: int) -> b def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> bool: pages_available = 0 - pages_available = pages_available + state.count("Vanilla Torn Page", player) pages_available = pages_available + state.count("Torn Page 1", player) pages_available = pages_available + state.count("Torn Page 2", player) + pages_available = pages_available + state.count("Torn Page 3", player) + pages_available = pages_available + state.count("Torn Page 4", player) + pages_available = pages_available + state.count("Torn Page 5", player) return pages_available >= pages_required def has_all_arts(state: CollectionState, player: int) -> bool: @@ -68,7 +80,7 @@ def has_offensive_magic(state: CollectionState, player: int) -> bool: def has_reports(state: CollectionState, player: int, eotw_required_reports: int) -> bool: return state.has_group("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): +def has_final_rest_door(state: CollectionState, player:int, final_rest_door_requirement: str, final_rest_door_required_reports: int, keyblades_unlock_chests: bool): if final_rest_door_requirement == "reports": return state.has_group("Reports", player, final_rest_door_required_reports) if final_rest_door_requirement == "puppies": @@ -81,259 +93,1200 @@ def has_final_rest_door(state: CollectionState, player:int, final_rest_door_requ def has_defensive_tools(state: CollectionState, player: int) -> bool: return (state.count("Progressive Cure", player) >= 2 and state.has("Leaf Bracer", player) and state.has("Dodge Roll", player)) and (state.has("Second Chance", player) or state.has("MP Rage", player) or state.count("Progressive Aero", player) >= 2) +def has_keyblade(state: CollectionState, player: int, keyblade_required: bool, item: str) -> bool: + if keyblade_required: + return state.has(item, player) + else: + return True + +def can_dumbo_skip(state: CollectionState, player: int) -> bool: + return state.has("Dumbo", player) and state.has_any({"Progressive Fire", "Progressive Blizzard", "Progressive Thunder", "Progressive Cure", "Progressive Gravity", "Progressive Stop", "Progressive Aero"}, player) + +def has_oogie_manor(state: CollectionState, player: int, advanced_logic: bool) -> bool: + return ( + has_item(state, player, "Progressive Fire") + or (advanced_logic and has_at_least(state, player, "High Jump", 2)) + or (advanced_logic and has_item(state, player, "High Jump") and can_glide(state, player)))) + ) + def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_reports: int, final_rest_door_required_reports: int, final_rest_door_requirement: str): #Location rules. #Keys #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town 1st District Candle Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") - #multiworld.get_location("Traverse Town 1st District Accessory Shop Roof Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town 2nd District Rooftop Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town 2nd District Gizmo Shop Facade Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Alleyway Balcony Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Alleyway Blue Room Awning Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Alleyway Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Green Room Clock Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Green Room Table Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Red Room Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Mystical House Yellow Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") and has_item(state, player, "Progressive Fire") - #multiworld.get_location("Traverse Town Accessory Shop Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") - multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") and can_glide(state, player) - multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: can_glide(state, player) and has_item(state, player, "Progressive Fire") - multiworld.get_location("Traverse Town Alleyway Behind Crates Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") - multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") - multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 1 Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 2 Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest" , player).access_rule = lambda state: has_x_worlds(state, player, 5) - multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") or can_glide(state, player) - multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") or can_glide(state, player) - multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: has_evidence(state, player) or has_item(state, player, "High Jump") or can_glide(state, player) - multiworld.get_location("Wonderland Lotus Forest Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") and has_evidence(state, player) - multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") and has_evidence(state, player) - multiworld.get_location("Wonderland Lotus Forest Glide Chest" , player).access_rule = lambda state: can_glide(state, player) - #multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: can_glide(state, player) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: can_glide(state, player) - multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: can_glide(state, player) - multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_evidence(state, player) - #multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Deep Jungle Hippo's Lagoon Center Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Deep Jungle Hippo's Lagoon Left Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Deep Jungle Hippo's Lagoon Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - #multiworld.get_location("Deep Jungle Vines Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Deep Jungle Vines 2 Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Deep Jungle Climbing Trees Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") - #multiworld.get_location("Deep Jungle Tunnel Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Deep Jungle Cavern of Hearts White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_slides(state, player) - multiworld.get_location("Deep Jungle Camp Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") - #multiworld.get_location("Deep Jungle Tent Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Deep Jungle Waterfall Cavern Low Chest" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Waterfall Cavern Middle Chest" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Waterfall Cavern High Wall Chest" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Waterfall Cavern High Middle Chest" , player).access_rule = lambda state: has_slides(state, player) - #multiworld.get_location("Deep Jungle Cliff Right Cliff Left Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Deep Jungle Cliff Right Cliff Right Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Deep Jungle Tree House Suspended Boat Chest" , player).access_rule = lambda state: can_glide(state, player) + multiworld.get_location("Traverse Town 1st District Candle Puzzle Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and has_item(state, player, "Progressive Blizzard") + ) + multiworld.get_location("Traverse Town 1st District Accessory Shop Roof Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town 2nd District Rooftop Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town 2nd District Gizmo Shop Facade Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town Alleyway Balcony Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town Alleyway Blue Room Awning Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town Alleyway Corner Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town Green Room Clock Puzzle Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town Green Room Table Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town Red Room Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town Mystical House Yellow Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and has_item(state, player, "Progressive Fire") + and + ( + has_item(state, player, "Yellow Trinity") + or (options.advanced_logic and has_item(state, player, "High Jump")) + or has_at_least(state, player, "High Jump", 2) + ) + ) + multiworld.get_location("Traverse Town Accessory Shop Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and has_item(state, player, "White Trinity") + ) + multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and has_item(state, player, "Glide")) + ) + ) + multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) + multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and + ( + (has_item(state, player, "Blue Trinity") and can_glide(state, player)) + or (options.advanced_logic and can_glide(state, player)) + ) + ) + multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and + ( + can_glide(state, player) + or + ( + options.advanced_logic + and + ( + (has_item(state, player, "High Jump") and has_item(state, player, "Yellow Trinity")) + or has_at_least(state, player, "High Jump", 2) + ) + and has_item(state, player, "Combo Master") + ) + or + ( + options.advanced_logic + and has_item(state, player, "Mermaid Kick") + ) + ) + and has_item(state, player, "Progressive Fire") + ) + multiworld.get_location("Traverse Town Alleyway Behind Crates Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and has_item(state, player, "Red Trinity") + ) + multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) + multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) + multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 1 Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + ) + multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 2 Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + ) + multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) + ) + multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + has_evidence(state, player) + or has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + has_evidence(state, player) + or has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + has_evidence(state, player) + or has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("Wonderland Lotus Forest Thunder Plant Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_item(state, player, "Progressive Thunder") + and has_evidence(state, player) + ) + multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_item(state, player, "Progressive Thunder") + and has_evidence(state, player) + ) + multiworld.get_location("Wonderland Lotus Forest Glide Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + can_glide(state, player) + or + ( + options.advanced_logic + and (has_item(state, player, "High Jump") or can_dumbo_skip(state, player)) + and has_evidence(state, player) + ) + ) + ) + multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + ) + multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + or options.advanced_logic + ) + ) + multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_evidence(state, player) + ) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + can_glide(state, player) + or + ( + options.advanced_logic + and has_item(state, player, "High Jump") + and has_evidence(state, player) + ) + ) + ) + multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + can_glide(state, player) + or + ( + options.advanced_logic + and has_item(state, player, "High Jump") + and has_evidence(state, player) + ) + ) + ) + multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + has_evidence(state, player) + or (options.advanced_logic and can_glide(state, player)) + or has_at_least(state, player, "High Jump", 2) + ) + ) + multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + can_glide(state, player) + or + ( + has_at_least(state, player, "High Jump", 3) + and has_evidence(state, player) + ) + or + ( + options.advanced_logic + and has_item(state, player, "High Jump") + and has_evidence(state, player) + and has_item(state, player, "Combo Master") + ) + ) + ) + multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_item(state, player, "White Trinity") + and has_evidence(state, player) + ) + multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) + multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) + multiworld.get_location("Deep Jungle Hippo's Lagoon Center Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) + multiworld.get_location("Deep Jungle Hippo's Lagoon Left Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) + multiworld.get_location("Deep Jungle Hippo's Lagoon Right Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or options.advanced_logic + ) + ) + multiworld.get_location("Deep Jungle Vines Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) + multiworld.get_location("Deep Jungle Vines 2 Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) + multiworld.get_location("Deep Jungle Climbing Trees Blue Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_item(state, player, "Blue Trinity") + ) + multiworld.get_location("Deep Jungle Tunnel Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) + multiworld.get_location("Deep Jungle Cavern of Hearts White Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_item(state, player, "White Trinity") + and has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Camp Blue Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_item(state, player, "Blue Trinity") + ) + multiworld.get_location("Deep Jungle Tent Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) + multiworld.get_location("Deep Jungle Waterfall Cavern Low Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Waterfall Cavern Middle Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Waterfall Cavern High Wall Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Waterfall Cavern High Middle Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Cliff Right Cliff Left Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) + multiworld.get_location("Deep Jungle Cliff Right Cliff Right Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) + multiworld.get_location("Deep Jungle Tree House Suspended Boat Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and + ( + can_glide(state, player) + or options.advanced_logic + ) + ) if options.hundred_acre_wood: - #multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - #multiworld.get_location("Agrabah Plaza By Storage Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Plaza Raised Terrace Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Plaza Top Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Alley Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Bazaar Across Windows Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Bazaar High Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Main Street Right Palace Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Main Street High Above Alley Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - #multiworld.get_location("Agrabah Palace Gates Low Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Palace Gates High Opposite Palace Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - multiworld.get_location("Agrabah Palace Gates High Close to Palace Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("Agrabah Storage Green Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Agrabah Storage Behind Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Entrance Left Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest" , player).access_rule = lambda state: can_glide(state, player) - #multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - #multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Treasure Room Above Fire Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Relic Chamber Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest", player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Bridge Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") - multiworld.get_location("Agrabah Cave of Wonders Hidden Room Right Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") or has_item(state, player, "High Jump") - multiworld.get_location("Agrabah Cave of Wonders Hidden Room Left Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") or has_item(state, player, "High Jump") - #multiworld.get_location("Agrabah Aladdin's House Main Street Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Aladdin's House Plaza Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Monstro Chamber 6 Other Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - #multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: ( + True + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + ) + multiworld.get_location("Agrabah Plaza By Storage Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Plaza Raised Terrace Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Plaza Top Corner Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Alley Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Bazaar Across Windows Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Bazaar High Corner Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Main Street Right Palace Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Main Street High Above Alley Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or (options.advanced_logic and can_dumbo_skip(state, player)) + ) + ) + multiworld.get_location("Agrabah Palace Gates Low Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Palace Gates High Opposite Palace Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) + multiworld.get_location("Agrabah Palace Gates High Close to Palace Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + ( + has_item(state, player, "High Jump") + and can_glide(state, player) + or + ( + options.advanced_logic + and + ( + has_item(state, player, "Combo Master") + or can_dumbo_skip(state, player) + ) + ) + ) + or has_at_least(state, player, "High Jump", 3) + or (options.advanced_logic and can_glide(state, player)) + ) + ) + multiworld.get_location("Agrabah Storage Green Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Agrabah Storage Behind Barrel Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Entrance Left Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + can_glide(state, player) + or (options.advanced_logic and has_item(state, player, "Combo Master")) + or (options.advanced_logic and can_dumbo_skip(state, player)) + or has_at_least(state, player, "High Jump", 2) + ) + ) + multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or options.advanced_logic + ) + ) + multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Treasure Room Above Fire Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Relic Chamber Stairs Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest", player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Bridge Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and has_item(state, player, "Blue Trinity") + ) + multiworld.get_location("Agrabah Cave of Wonders Hidden Room Right Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + has_item(state, player, "Yellow Trinity") + or has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) + multiworld.get_location("Agrabah Cave of Wonders Hidden Room Left Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + has_item(state, player, "Yellow Trinity") + or has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) + multiworld.get_location("Agrabah Aladdin's House Main Street Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Aladdin's House Plaza Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) + multiworld.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and has_item(state, player, "White Trinity") + ) + multiworld.get_location("Monstro Chamber 6 Other Platform Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and has_item(state, player, "Combo Master")) + ) + ) + multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) + multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and has_item(state, player, "Combo Master")) + ) + ) + multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) if options.atlantica: - #multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Ariel's Grotto High Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Ariel's Grotto Middle Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Ariel's Grotto Low Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") - #multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - #multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and can_glide(state, player) - multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Red Trinity") - multiworld.get_location("Halloween Town Guillotine Square High Tower Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") - multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and (can_glide(state, player) or has_item(state, player, "High Jump")) - multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - #multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") and can_glide(state, player) - #multiworld.get_location("Olympus Coliseum Coliseum Gates Left Behind Columns Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") - multiworld.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "Blue Trinity") - multiworld.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: has_at_least(state, player, "Progressive Blizzard", 2) - multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzaga Chest" , player).access_rule = lambda state: has_at_least(state, player, "Progressive Blizzard", 3) - #multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - #multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: (has_item(state, player, "High Jump") or can_glide(state, player)) and has_item(state, player, "Green Trinity") - #multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Monstro Chamber 2 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - #multiworld.get_location("Monstro Chamber 3 Ground Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - #multiworld.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - #multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - #multiworld.get_location("Monstro Chamber 5 Low 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Monstro Chamber 5 Low 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Neverland Pirate Ship Deck White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") and has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Pirate Ship Crows Nest Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Hold Yellow Trinity Right Blue Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") - multiworld.get_location("Neverland Hold Yellow Trinity Left Blue Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") - #multiworld.get_location("Neverland Galley Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Neverland Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Hold Flight 1st Chest " , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Clock Tower Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) - multiworld.get_location("Neverland Hold Flight 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Hold Yellow Trinity Green Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") - multiworld.get_location("Neverland Captain's Cabin Chest" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Hollow Bastion Rising Falls Water's Surface Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Rising Falls Under Water 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) or has_item(state, player, "Progressive Blizzard") - multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) or has_item(state, player, "Progressive Blizzard") - multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: can_glide(state, player) or (has_item(state, player, "Progressive Blizzard") and has_emblems(state, player)) - multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) - multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) - multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) - multiworld.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: can_glide(state, player) or has_item(state, player, "Green Trinity") - #multiworld.get_location("Hollow Bastion Library 1st Floor Turn the Carousel Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest" , player).access_rule = lambda state: can_glide(state, player) or has_item(state, player, "Green Trinity") - #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") and has_emblems(state, player) - multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") - multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: has_emblems(state, player) and can_glide(state, player) - multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_item(state, player, "Green Trinity") - multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Gravity") and has_emblems(state, player) - #multiworld.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Base Level Platform Near Entrance Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Base Level Near Crystal Switch Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Waterway Near Save Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") and has_item(state, player, "High Jump") - #multiworld.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Dungeon By Candles Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Dungeon Corner Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Grand Hall Steps Right Side Chest" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Grand Hall Oblivion Chest" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Grand Hall Left of Gate Chest" , player).access_rule = lambda state: has_emblems(state, player) - #multiworld.get_location("Hollow Bastion Entrance Hall Push the Statue Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - multiworld.get_location("Hollow Bastion Rising Falls White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") - #multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 4th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 5th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 6th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 10th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 9th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("End of the World Giant Crevasse 5th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") or can_glide(state, player) - #multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World World Terminus Traverse Town Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World World Terminus Wonderland Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World World Terminus Olympus Coliseum Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World World Terminus Deep Jungle Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("End of the World World Terminus Agrabah Chest" , player).access_rule = lambda state: has_item(state, player, "High Jump") - #multiworld.get_location("End of the World World Terminus Atlantica Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World World Terminus Halloween Town Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World World Terminus Neverland Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World World Terminus 100 Acre Wood Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World World Terminus Hollow Bastion Chest" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("End of the World Final Rest Chest" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: has_item(state, player, "White Trinity") + multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: ( + True + ) + multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: ( + True + ) + multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: ( + True + ) + multiworld.get_location("Atlantica Ariel's Grotto High Chest" , player).access_rule = lambda state: ( + True + ) + multiworld.get_location("Atlantica Ariel's Grotto Middle Chest" , player).access_rule = lambda state: ( + True + ) + multiworld.get_location("Atlantica Ariel's Grotto Low Chest" , player).access_rule = lambda state: ( + True + ) + multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: ( + has_item(state, player, "Progressive Fire") + ) + multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: ( + True + ) + multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: ( + has_item(state, player, "White Trinity") + ) + multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "White Trinity") + ) + multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + ) + multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + ) + multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and + ( + can_glide(state, player) + or options.advanced_logic + ) + ) + multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_oogie_manor(state, player, options) + ) + multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_oogie_manor(state, player, options.advanced_logic) + ) + multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_oogie_manor(state, player, options.advanced_logic) + ) + multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_oogie_manor(state, player, options.advanced_logic) + ) + multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_oogie_manor(state, player, options.advanced_logic) + ) + multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_oogie_manor(state, player, options.advanced_logic) + ) + multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Red Trinity") + ) + multiworld.get_location("Halloween Town Guillotine Square High Tower Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_dumbo_skip(state, player)) + or (options.advanced_logic and can_glide(state, player)) + ) + ) + multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and + ( + can_glide(state, player) + or (options.advanced_logic and has_item(state, player, "Combo Master")) + or has_at_least(state, player, "High Jump", 2) + ) + ) + multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + ) + multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + ) + multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and + ( + can_glide(state, player) + or has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) + multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_oogie_manor(state, player, options.advanced_logic) + ) + multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + ) + multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and + ( + can_glide(state, player) + or (options.advanced_logic and has_item(state, player, "Combo Master")) + or has_at_least(state, player, "High Jump", 2) + ) + ) + multiworld.get_location("Olympus Coliseum Coliseum Gates Left Behind Columns Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + ) + multiworld.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and has_item(state, player, "Blue Trinity") + ) + multiworld.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and has_item(state, player, "Blue Trinity") + ) + multiworld.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and has_item(state, player, "White Trinity") + ) + multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and has_at_least(state, player, "Progressive Blizzard", 2) + ) + multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzaga Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and has_at_least(state, player, "Progressive Blizzard", 3) + ) + multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) + multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) + multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + and has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) + multiworld.get_location("Monstro Chamber 2 Platform Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) + multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and has_item(state, player, "High Jump") + ) + multiworld.get_location("Monstro Chamber 3 Ground Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) + multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) + multiworld.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) + multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) + multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) + multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) + multiworld.get_location("Monstro Chamber 5 Low 2nd Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) + multiworld.get_location("Monstro Chamber 5 Low 1st Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) + multiworld.get_location("Neverland Pirate Ship Deck White Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "White Trinity") + and has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Pirate Ship Crows Nest Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Hold Yellow Trinity Right Blue Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Yellow Trinity") + ) + multiworld.get_location("Neverland Hold Yellow Trinity Left Blue Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Yellow Trinity") + ) + multiworld.get_location("Neverland Galley Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + ) + multiworld.get_location("Neverland Cabin Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Hold Flight 1st Chest " , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and + ( + has_item(state, player, "Green Trinity") + or can_glide(state, player) + or has_at_least(state, player, "High Jump", 3) + ) + ) + multiworld.get_location("Neverland Clock Tower Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + ) + multiworld.get_location("Neverland Hold Flight 2nd Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and + ( + has_item(state, player, "Green Trinity") + or can_glide(state, player) + or has_at_least(state, player, "High Jump", 3) + ) + ) + multiworld.get_location("Neverland Hold Yellow Trinity Green Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Yellow Trinity") + ) + multiworld.get_location("Neverland Captain's Cabin Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Hollow Bastion Rising Falls Water's Surface Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) + multiworld.get_location("Hollow Bastion Rising Falls Under Water 1st Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) + multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or has_item(state, player, "Progressive Blizzard") + ) + ) + multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or has_item(state, player, "Progressive Blizzard") + ) + ) + multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + can_glide(state, player) + or has_item(state, player, "Progressive Blizzard") + or (options.advanced_logic and has_item(state, player, "Combo Master")) + ) + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + and + ( + has_emblems(state, player) + or (options.advanced_logic and has_at_least(state, player, "High Jump", 2) and can_glide(state,player)) + or (options.advanced_logic and can_dumbo_skip(state, player) and can_glide(state,player)) + ) + ) + multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + has_emblems(state, player) + or has_at_least(state, player, "High Jump", 2) + or (options.advanced_logic and can_dumbo_skip(state, player)) + ) + ) + multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + has_emblems(state, player) + or has_at_least(state, player, "High Jump", 2) + or (options.advanced_logic and can_dumbo_skip(state, player)) + ) + ) + multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) + #multiworld.get_location("Hollow Bastion Library 1st Floor Turn the Carousel Chest" , player).access_rule = lambda state: () + #multiworld.get_location("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest" , player).access_rule = lambda state: () + #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest" , player).access_rule = lambda state: () + #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest" , player).access_rule = lambda state: () + multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + ) + multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player) + and can_glide(state, player) + ) + multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + ) + multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) + multiworld.get_location("Hollow Bastion Base Level Platform Near Entrance Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) + multiworld.get_location("Hollow Bastion Base Level Near Crystal Switch Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) + multiworld.get_location("Hollow Bastion Waterway Near Save Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) + multiworld.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + (has_item(state, player, "Progressive Blizzard") and has_item(state, player, "High Jump")) + or has_at_least(state, player, "High Jump", 3) + ) + ) + multiworld.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) + multiworld.get_location("Hollow Bastion Dungeon By Candles Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) + multiworld.get_location("Hollow Bastion Dungeon Corner Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) + multiworld.get_location("Hollow Bastion Grand Hall Steps Right Side Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Grand Hall Oblivion Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Grand Hall Left of Gate Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player) + ) + #multiworld.get_location("Hollow Bastion Entrance Hall Push the Statue Chest" , player).access_rule = lambda state: () + multiworld.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + has_item(state, player, "High Jump") + or + ( + options.advanced_logic + and can_dumbo_skip(state, player) + and has_emblems(state, player) + ) + ) + ) + multiworld.get_location("Hollow Bastion Rising Falls White Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "White Trinity") + ) + multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Final Dimension 3rd Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Final Dimension 4th Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Final Dimension 5th Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Final Dimension 6th Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Final Dimension 10th Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Final Dimension 9th Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Giant Crevasse 5th Chest" , player).access_rule = lambda state: ( + has_item(state, player, "High Jump") or can_glide(state, player) + and has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + and + ( + ( + options.advanced_logic + and has_item(state, player, "High Jump") + and has_item(state, player, "Combo Master") + ) + or can_glide(state, player) + ) + ) + multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World World Terminus Traverse Town Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World World Terminus Wonderland Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World World Terminus Olympus Coliseum Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World World Terminus Deep Jungle Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World World Terminus Agrabah Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + and + ( + has_item(state, player, "High Jump") + or + ( + options.advanced_logic + and can_dumbo_skip(state, player) + and can_glide(state, player) + ) + ) + ) + multiworld.get_location("End of the World World Terminus Atlantica Chest" , player).access_rule = lambda state: ( + True + ) + multiworld.get_location("End of the World World Terminus Halloween Town Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World World Terminus Neverland Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World World Terminus 100 Acre Wood Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World World Terminus Hollow Bastion Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("End of the World Final Rest Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) + multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and has_item(state, player, "White Trinity") + ) #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town Defeat Guard Armor Dodge Roll Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town Defeat Guard Armor Fire Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town Defeat Guard Armor Blue Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town Leon Secret Waterway Earthshine Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event" , player).access_rule = lambda state: has_emblems(state, player) and has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) + multiworld.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event" , player).access_rule = lambda state: ( + has_emblems(state, player) + and has_item(state, player,"Hollow Bastion") + and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) + ) #multiworld.get_location("Traverse Town Defeat Guard Armor Brave Warrior Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Deep Jungle Defeat Sabor White Fang Event" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Defeat Clayton Cure Event" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Seal Keyhole Jungle King Event" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Seal Keyhole Red Trinity Event" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("Deep Jungle Defeat Sabor White Fang Event" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Defeat Clayton Cure Event" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Seal Keyhole Jungle King Event" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Seal Keyhole Red Trinity Event" , player).access_rule = lambda state: ( + has_slides(state, player) + ) #multiworld.get_location("Olympus Coliseum Clear Phil's Training Thunder Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Olympus Coliseum Cloud Sonic Blade Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Wonderland Defeat Trickmaster Blizzard Event" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event" , player).access_rule = lambda state: has_evidence(state, player) + multiworld.get_location("Wonderland Defeat Trickmaster Blizzard Event" , player).access_rule = lambda state: ( + has_evidence(state, player) + ) + multiworld.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event" , player).access_rule = lambda state: ( + has_evidence(state, player) + ) #multiworld.get_location("Agrabah Defeat Pot Centipede Ray of Light Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Defeat Jafar Blizzard Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Defeat Jafar Genie Fire Event" , player).access_rule = lambda state: has_item(state, player, "") @@ -341,224 +1294,733 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report #multiworld.get_location("Agrabah Seal Keyhole Three Wishes Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Agrabah Seal Keyhole Green Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Monstro Defeat Parasite Cage I Goofy Cheer Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Monstro Defeat Parasite Cage II Stop Event" , player).access_rule = lambda state: has_item(state, player, "High Jump") + multiworld.get_location("Monstro Defeat Parasite Cage II Stop Event" , player).access_rule = lambda state: ( + has_item(state, player, "High Jump") + or + ( + options.advanced_logic + and can_glide(state, player) + ) + ) if options.atlantica: - multiworld.get_location("Atlantica Defeat Ursula I Mermaid Kick Event" , player).access_rule = lambda state: has_offensive_magic(state, player) - multiworld.get_location("Atlantica Defeat Ursula II Thunder Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) - multiworld.get_location("Atlantica Seal Keyhole Crabclaw Event" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) - multiworld.get_location("Halloween Town Defeat Oogie Boogie Holy Circlet Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Defeat Oogie's Manor Gravity Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Halloween Town Seal Keyhole Pumpkinhead Event" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Neverland Defeat Anti Sora Raven's Claw Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Encounter Hook Cure Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Seal Keyhole Fairy Harp Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Atlantica Defeat Ursula I Mermaid Kick Event" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") + and has_offensive_magic(state, player) + ) + multiworld.get_location("Atlantica Defeat Ursula II Thunder Event" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") + and has_item(state, player, "Mermaid Kick") + and has_offensive_magic(state, player) + ) + multiworld.get_location("Atlantica Seal Keyhole Crabclaw Event" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") + and has_item(state, player, "Mermaid Kick") + and has_offensive_magic(state, player) + ) + multiworld.get_location("Halloween Town Defeat Oogie Boogie Holy Circlet Event" , player).access_rule = lambda state: ( + has_item(state, player, "Jack-In-The-Box") + and has_oogie_manor(state, player, options.advanced_logic) + ) + multiworld.get_location("Halloween Town Defeat Oogie's Manor Gravity Event" , player).access_rule = lambda state: ( + has_item(state, player, "Jack-In-The-Box") + and has_oogie_manor(state, player, options.advanced_logic) + ) + multiworld.get_location("Halloween Town Seal Keyhole Pumpkinhead Event" , player).access_rule = lambda state: ( + has_item(state, player, "Jack-In-The-Box") + and has_oogie_manor(state, player, options.advanced_logic) + ) + multiworld.get_location("Neverland Defeat Anti Sora Raven's Claw Event" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Encounter Hook Cure Event" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Seal Keyhole Fairy Harp Event" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) if options.super_bosses: - multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) and has_defensive_tools(state, player) and has_emblems(state, player) - multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player) + ) + multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Defeat Riku II Ragnarok Event" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Defeat Behemoth Omega Arts Event" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Speak to Princesses Fire Event" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Defeat Riku II Ragnarok Event" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Defeat Behemoth Omega Arts Event" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Speak to Princesses Fire Event" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) #multiworld.get_location("End of the World Defeat Chernabog Superglide Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Mail Postcard 01 Event" , player).access_rule = lambda state: has_postcards(state, player, 1) - multiworld.get_location("Traverse Town Mail Postcard 02 Event" , player).access_rule = lambda state: has_postcards(state, player, 2) - multiworld.get_location("Traverse Town Mail Postcard 03 Event" , player).access_rule = lambda state: has_postcards(state, player, 3) - multiworld.get_location("Traverse Town Mail Postcard 04 Event" , player).access_rule = lambda state: has_postcards(state, player, 4) - multiworld.get_location("Traverse Town Mail Postcard 05 Event" , player).access_rule = lambda state: has_postcards(state, player, 5) - multiworld.get_location("Traverse Town Mail Postcard 06 Event" , player).access_rule = lambda state: has_postcards(state, player, 6) - multiworld.get_location("Traverse Town Mail Postcard 07 Event" , player).access_rule = lambda state: has_postcards(state, player, 7) - multiworld.get_location("Traverse Town Mail Postcard 08 Event" , player).access_rule = lambda state: has_postcards(state, player, 8) - multiworld.get_location("Traverse Town Mail Postcard 09 Event" , player).access_rule = lambda state: has_postcards(state, player, 9) - multiworld.get_location("Traverse Town Mail Postcard 10 Event" , player).access_rule = lambda state: has_postcards(state, player, 10) + multiworld.get_location("Traverse Town Mail Postcard 01 Event" , player).access_rule = lambda state: ( + has_postcards(state, player, 1) + ) + multiworld.get_location("Traverse Town Mail Postcard 02 Event" , player).access_rule = lambda state: ( + has_postcards(state, player, 2) + ) + multiworld.get_location("Traverse Town Mail Postcard 03 Event" , player).access_rule = lambda state: ( + has_postcards(state, player, 3) + ) + multiworld.get_location("Traverse Town Mail Postcard 04 Event" , player).access_rule = lambda state: ( + has_postcards(state, player, 4) + ) + multiworld.get_location("Traverse Town Mail Postcard 05 Event" , player).access_rule = lambda state: ( + has_postcards(state, player, 5) + ) + multiworld.get_location("Traverse Town Mail Postcard 06 Event" , player).access_rule = lambda state: ( + has_postcards(state, player, 6) + ) + multiworld.get_location("Traverse Town Mail Postcard 07 Event" , player).access_rule = lambda state: ( + has_postcards(state, player, 7) + ) + multiworld.get_location("Traverse Town Mail Postcard 08 Event" , player).access_rule = lambda state: ( + has_postcards(state, player, 8) + ) + multiworld.get_location("Traverse Town Mail Postcard 09 Event" , player).access_rule = lambda state: ( + has_postcards(state, player, 9) + ) + multiworld.get_location("Traverse Town Mail Postcard 10 Event" , player).access_rule = lambda state: ( + has_postcards(state, player, 10) + ) - multiworld.get_location("Traverse Town Defeat Opposite Armor Aero Event" , player).access_rule = lambda state: has_item(state, player, "Red Trinity") + multiworld.get_location("Traverse Town Defeat Opposite Armor Aero Event" , player).access_rule = lambda state: ( + has_item(state, player, "Red Trinity") + ) if options.atlantica: - multiworld.get_location("Atlantica Undersea Gorge Blizzard Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") - #multiworld.get_location("Atlantica Undersea Gorge Ocean Floor Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Valley Higher Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Valley Lower Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Undersea Valley Fire Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") - #multiworld.get_location("Atlantica Undersea Valley Wall Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Valley Pillar Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Valley Ocean Floor Clam" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Triton's Palace Thunder Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") - #multiworld.get_location("Atlantica Triton's Palace Wall Right Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Triton's Palace Near Path Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Triton's Palace Wall Left Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Cavern Nook Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Below Deck Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Garden Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Undersea Gorge Blizzard Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") + #multiworld.get_location("Atlantica Undersea Gorge Ocean Floor Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Valley Higher Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Valley Lower Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Undersea Valley Fire Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") + #multiworld.get_location("Atlantica Undersea Valley Wall Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Valley Pillar Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Valley Ocean Floor Clam" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Triton's Palace Thunder Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") + #multiworld.get_location("Atlantica Triton's Palace Wall Right Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Triton's Palace Near Path Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Triton's Palace Wall Left Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Cavern Nook Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Below Deck Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Garden Clam" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("Atlantica Undersea Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Defeat Jafar Genie Ansem's Report 1" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: has_emblems(state, player) + #multiworld.get_location("Agrabah Defeat Jafar Genie Ansem's Report 1" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) if options.atlantica: - multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) - #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5" , player).access_rule = lambda state: has_emblems(state, player) - #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6" , player).access_rule = lambda state: has_emblems(state, player) - multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: has_item(state, player, "Jack-In-The-Box") and has_item(state, player, "Progressive Fire") + multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") + and has_item(state, player, "Mermaid Kick") + and has_offensive_magic(state, player) + ) + multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) + multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: ( + has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Progressive Fire") + ) if options.cups: - multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) - multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: has_emblems(state, player) + multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) + multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) if options.super_bosses: - multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: ( + has_emblems(state, player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) if options.super_bosses or options.goal.current_key == "sephiroth": - multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) if options.super_bosses or options.goal.current_key == "unknown": - multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: ( + has_emblems(state, player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) if options.cups: - multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") - multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") - multiworld.get_location("Complete Phil Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") - multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") - multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") - multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Pegasus Cup") - multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) - multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) - multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) - multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) - multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) - multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) - multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) - multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) - multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) - multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) - multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) - multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) - multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) + multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + ) + multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + ) + multiworld.get_location("Complete Phil Cup Time Trial" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + ) + multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: ( + has_item(state, player, "Pegasus Cup") + ) + multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: ( + has_item(state, player, "Pegasus Cup") + ) + multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: ( + has_item(state, player, "Pegasus Cup") + ) + multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: ( + has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + ) + multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: ( + has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + ) + multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: ( + has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + ) + multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) + multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) + multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) + multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) + multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) + multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) + multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) + multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) + multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: ( + has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + ) + multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: ( + has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + ) #multiworld.get_location("Traverse Town Magician's Study Turn in Naturespark" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Magician's Study Turn in Watergleam" , player).access_rule = lambda state: has_item(state, player, "Watergleam") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Magician's Study Turn in Fireglow" , player).access_rule = lambda state: has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") #multiworld.get_location("Traverse Town Magician's Study Turn in all Summon Gems" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Watergleam") and has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 1" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 2" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 3" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 4" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 5" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") - multiworld.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") and has_all_summons(state, player) - multiworld.get_location("Traverse Town Geppetto's House Talk to Pinocchio" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") - multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 1) and has_all_arts(state, player) and has_x_worlds(state, player, 7) - multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 1) - multiworld.get_location("Traverse Town Magician's Study Obtained All LV3 Magic" , player).access_rule = lambda state: has_all_magic_lvx(state, player, 3) - multiworld.get_location("Traverse Town Piano Room Return 10 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 10) - multiworld.get_location("Traverse Town Piano Room Return 20 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 20) - multiworld.get_location("Traverse Town Piano Room Return 30 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 30) - multiworld.get_location("Traverse Town Piano Room Return 40 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 40) - multiworld.get_location("Traverse Town Piano Room Return 50 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 50) - multiworld.get_location("Traverse Town Piano Room Return 60 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 60) - multiworld.get_location("Traverse Town Piano Room Return 70 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 70) - multiworld.get_location("Traverse Town Piano Room Return 80 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 80) - multiworld.get_location("Traverse Town Piano Room Return 90 Puppies" , player).access_rule = lambda state: has_puppies(state, player, 90) - multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: has_puppies(state, player, 99) - multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: has_puppies(state, player, 99) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 1" , player).access_rule = lambda state: ( + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 2" , player).access_rule = lambda state: ( + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 3" , player).access_rule = lambda state: ( + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 4" , player).access_rule = lambda state: ( + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) + multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 5" , player).access_rule = lambda state: ( + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) + multiworld.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward" , player).access_rule = lambda state: ( + has_item(state, player, "Monstro") + and has_item(state, player, "High Jump") + and has_all_summons(state, player) + ) + multiworld.get_location("Traverse Town Geppetto's House Talk to Pinocchio" , player).access_rule = lambda state: ( + has_item(state, player, "Monstro") + and has_item(state, player, "High Jump") + ) + multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = 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) + ) + multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: ( + has_all_magic_lvx(state, player, 1) + ) + multiworld.get_location("Traverse Town Magician's Study Obtained All LV3 Magic" , player).access_rule = lambda state: ( + has_all_magic_lvx(state, player, 3) + ) + multiworld.get_location("Traverse Town Piano Room Return 10 Puppies" , player).access_rule = lambda state: ( + has_puppies(state, player, 10) + ) + multiworld.get_location("Traverse Town Piano Room Return 20 Puppies" , player).access_rule = lambda state: ( + has_puppies(state, player, 20) + ) + multiworld.get_location("Traverse Town Piano Room Return 30 Puppies" , player).access_rule = lambda state: ( + has_puppies(state, player, 30) + ) + multiworld.get_location("Traverse Town Piano Room Return 40 Puppies" , player).access_rule = lambda state: ( + has_puppies(state, player, 40) + ) + multiworld.get_location("Traverse Town Piano Room Return 50 Puppies Reward 1" , player).access_rule = lambda state: ( + has_puppies(state, player, 50) + ) + multiworld.get_location("Traverse Town Piano Room Return 50 Puppies Reward 2" , player).access_rule = lambda state: ( + has_puppies(state, player, 50) + ) + multiworld.get_location("Traverse Town Piano Room Return 60 Puppies" , player).access_rule = lambda state: ( + has_puppies(state, player, 60) + ) + multiworld.get_location("Traverse Town Piano Room Return 70 Puppies" , player).access_rule = lambda state: ( + has_puppies(state, player, 70) + ) + multiworld.get_location("Traverse Town Piano Room Return 80 Puppies" , player).access_rule = lambda state: ( + has_puppies(state, player, 80) + ) + multiworld.get_location("Traverse Town Piano Room Return 90 Puppies" , player).access_rule = lambda state: ( + has_puppies(state, player, 90) + ) + multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: ( + has_puppies(state, player, 99) + ) + multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: ( + has_puppies(state, player, 99) + ) if options.super_bosses or options.goal.current_key == "sephiroth": - multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) if options.cups: - multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_item(state, player, "Guard") and has_defensive_tools(state, player) - multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_item(state, player, "Guard") + and has_defensive_tools(state, player) + ) + multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + ) #multiworld.get_location("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 02:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 03:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 04:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 05:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 06:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 07:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 08:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 09:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 10:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 11:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - #multiworld.get_location("Neverland Clock Tower 12:00 Door" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") - multiworld.get_location("Neverland Hold Aero Chest" , player).access_rule = lambda state: has_item(state, player, "Yellow Trinity") + multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 02:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 03:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 04:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 05:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 06:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 07:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 08:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 09:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 10:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 11:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Clock Tower 12:00 Door" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) + multiworld.get_location("Neverland Hold Aero Chest" , player).access_rule = lambda state: ( + has_item(state, player, "Yellow Trinity") + ) if options.hundred_acre_wood: - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) if options.atlantica: - multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: has_torn_pages(state, player, 5) - multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: has_torn_pages(state, player, 1) - multiworld.get_location("100 Acre Wood Convert Torn Page 2" , player).access_rule = lambda state: has_torn_pages(state, player, 2) - multiworld.get_location("100 Acre Wood Convert Torn Page 3" , player).access_rule = lambda state: has_torn_pages(state, player, 3) - multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: has_torn_pages(state, player, 4) + multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 5) + ) + multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 1) + ) + multiworld.get_location("100 Acre Wood Convert Torn Page 2" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 2) + ) + multiworld.get_location("100 Acre Wood Convert Torn Page 3" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 3) + ) + multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + ) if options.atlantica: - multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: has_torn_pages(state, player, 5) - multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: has_torn_pages(state, player, 3) - #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: has_torn_pages(state, player, 4) - multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: has_torn_pages(state, player, 4) and (has_item(state, player, "High Jump") or can_glide(state, player)) - multiworld.get_location("Deep Jungle Camp Hi-Potion Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") - multiworld.get_location("Deep Jungle Camp Ether Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") - multiworld.get_location("Deep Jungle Camp Replication Experiment" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") - multiworld.get_location("Deep Jungle Cliff Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Tree House Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Camp Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) - multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: has_slides(state, player) + multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 5) + ) + multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 3) + ) + #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") + #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("Deep Jungle Camp Hi-Potion Experiment" , player).access_rule = lambda state: ( + has_item(state, player, "Progressive Fire") + ) + multiworld.get_location("Deep Jungle Camp Ether Experiment" , player).access_rule = lambda state: ( + has_item(state, player, "Progressive Blizzard") + ) + multiworld.get_location("Deep Jungle Camp Replication Experiment" , player).access_rule = lambda state: ( + has_item(state, player, "Progressive Blizzard") + ) + multiworld.get_location("Deep Jungle Cliff Save Gorillas" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Tree House Save Gorillas" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Camp Save Gorillas" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: ( + has_slides(state, player) + ) if options.cups: - multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: has_item(state, player, "Phil Cup") and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4) - multiworld.get_location("Deep Jungle Jungle Slider 10 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") - multiworld.get_location("Deep Jungle Jungle Slider 20 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") - multiworld.get_location("Deep Jungle Jungle Slider 30 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") - multiworld.get_location("Deep Jungle Jungle Slider 40 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") - multiworld.get_location("Deep Jungle Jungle Slider 50 Fruits" , player).access_rule = lambda state: has_item(state, player, "Slide 1") - #multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: has_evidence(state, player) - multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + ) + multiworld.get_location("Deep Jungle Jungle Slider 10 Fruits" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Jungle Slider 20 Fruits" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Jungle Slider 30 Fruits" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Jungle Slider 40 Fruits" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Deep Jungle Jungle Slider 50 Fruits" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: ( + has_item(state, player, "Hollow Bastion") + and has_emblems(state, player) + and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) + ) + multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: ( + has_evidence(state, player) + ) + multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + ) if options.super_bosses: - multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) + multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) if options.super_bosses or options.goal.current_key == "unknown": - multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7) and has_defensive_tools(state, player) - - multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Synth Rope" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Synth Seagull Egg" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") - multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: has_at_least(state, player, "Empty Bottle", 6) and has_item(state, player, "Green Trinity") - - if options.goal.current_key == "final_ansem": - multiworld.get_location("Final Ansem" , player).access_rule = lambda state: has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports) - for i in range(options.level_checks): - multiworld.get_location("Level " + str(i+1).rjust(3,'0') , player).access_rule = lambda state, level_num=i: has_x_worlds(state, player, min(((level_num//10)*2), 8)) + multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + #multiworld.get_location("Olympus Coliseum Coliseum Gates Hero's License Event" , player).access_rule = lambda state: () + #if options.atlantica: + #multiworld.get_location("Atlantica Sunken Ship Crystal Trident Event" , player).access_rule = lambda state: () + #multiworld.get_location("Halloween Town Graveyard Forget-Me-Not Event" , player).access_rule = lamdba state: () + #multiworld.get_location("Deep Jungle Tent Protect-G Event" , player).access_rule = lambda state: () + multiworld.get_location("Deep Jungle Cavern of Hearts Navi-G Piece Event" , player).access_rule = lambda state: ( + has_slides(state, player) + ) + multiworld.get_location("Wonderland Bizarre Room Navi-G Piece Event" , player).access_rule = lambda state: ( + has_evidence(state, player) + ) + #multiworld.get_location("Olympus Coliseum Coliseum Gates Entry Pass Event" , player).access_rule = lambda state: () + + + multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: ( + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) + multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: ( + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) + multiworld.get_location("Traverse Town Synth Rope" , player).access_rule = lambda state: ( + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) + multiworld.get_location("Traverse Town Synth Seagull Egg" , player).access_rule = lambda state: ( + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) + multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: ( + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) + multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: ( + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) - #Set up event location rules #multiworld.get_location("Traverse Town Item Shop Postcard" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town 1st District Safe Postcard" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Gizmo Shop Postcard 1" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") - multiworld.get_location("Traverse Town Gizmo Shop Postcard 2" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") - multiworld.get_location("Traverse Town Item Workshop Postcard" , player).access_rule = lambda state: has_item(state, player, "Green Trinity") + multiworld.get_location("Traverse Town Gizmo Shop Postcard 1" , player).access_rule = lambda state: ( + has_item(state, player, "Progressive Thunder") + ) + multiworld.get_location("Traverse Town Gizmo Shop Postcard 2" , player).access_rule = lambda state: ( + has_item(state, player, "Progressive Thunder") + ) + multiworld.get_location("Traverse Town Item Workshop Postcard" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) #multiworld.get_location("Traverse Town 3rd District Balcony Postcard" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Traverse Town Geppetto's House Postcard" , player).access_rule = lambda state: has_item(state, player, "Monstro") and has_item(state, player, "High Jump") - multiworld.get_location("Traverse Town Piano Room Return 50 Puppies Torn Page" , player).access_rule = lambda state: has_puppies(state, player, 50) + multiworld.get_location("Traverse Town Geppetto's House Postcard" , player).access_rule = lambda state: ( + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) #multiworld.get_location("Halloween Town Lab Torn Page" , player).access_rule = lambda state: has_item(state, player, "") - #if options.atlantica: - # multiworld.get_location("Atlantica Ariel's Grotto Torn Page" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)" , player).access_rule = lambda state: ( + ( + has_item(state, player, "Theon Vol. 6") + or has_at_least(state, player, "High Jump", 3) + ) + and has_item(state, player, "Progressive Fire") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or has_item(state, player, "Progressive Thunder") + or options.advanced_logic + ) + ) + multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)" , player).access_rule = lambda state: ( + has_item(state, player, "Theon Vol. 6") + or has_at_least(state, player, "High Jump", 3) + ) + multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)" , player).access_rule = lambda state: ( + ( + has_item(state, player, "Theon Vol. 6") + or has_at_least(state, player, "High Jump", 3) + ) + and has_item(state, player, "Red Trinity") + ) + multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)" , player).access_rule = lambda state: ( + has_item(state, player, "Theon Vol. 6") + or has_at_least(state, player, "High Jump", 3) + ) + #multiworld.get_location("Traverse Town 1st District Leon Gift" , player).access_rule = lambda state: () + #multiworld.get_location("Traverse Town 1st District Aerith Gift" , player).access_rule = lambda state: () + multiworld.get_location("Hollow Bastion Library Speak to Belle Divine Rose" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) + multiworld.get_location("Hollow Bastion Library Speak to Aerith Cure" , player).access_rule = lambda state: ( + has_emblems(state, player) + ) + + + if options.goal.current_key == "final_ansem": + multiworld.get_location("Final Ansem" , player).access_rule = lambda state: ( + has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports, options.keyblades_unlock_chests) + ) + for i in range(options.level_checks): + multiworld.get_location("Level " + str(i+1).rjust(3,'0') , player).access_rule = lambda state, level_num=i: has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests) + + # Region rules. - multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") - multiworld.get_entrance("Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player,"Olympus Coliseum") - multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: has_item(state, player,"Deep Jungle") - multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: has_item(state, player,"Agrabah") - multiworld.get_entrance("Monstro" , player).access_rule = lambda state: has_item(state, player,"Monstro") + multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player,"Olympus Coliseum") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: has_item(state, player,"Deep Jungle") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: has_item(state, player,"Agrabah") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Monstro" , player).access_rule = lambda state: has_item(state, player,"Monstro") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) if options.atlantica: - multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2) - multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2) - multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 4) - multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5) - multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_x_worlds(state, player, 7) and (has_reports(state, player, eotw_required_reports) or has_item(state, player,"End of the World")) + multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 3, options.keyblades_unlock_chests) + multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) + multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and (has_reports(state, player, eotw_required_reports) or has_item(state, player,"End of the World")) multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") # Win condition. diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 326cca284429..d4a4fd6f5c97 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -52,43 +52,55 @@ def create_items(self): item_pool: List[KH1Item] = [] possible_level_up_item_pool = [] level_up_item_pool = [] + + #Calculate Level Up Items + if True: #Allow notepad++ to collapse this section + # Fill pool with mandatory items + for i in range(self.options.item_slot_increase): + level_up_item_pool.append("Item Slot Increase") + for i in range(self.options.accessory_slot_increase): + level_up_item_pool.append("Accessory Slot Increase") + + # Create other pool + for i in range(self.options.strength_increase): + possible_level_up_item_pool.append("Strength Increase") + for i in range(self.options.defense_increase): + possible_level_up_item_pool.append("Defense Increase") + for i in range(self.options.hp_increase): + possible_level_up_item_pool.append("Max HP Increase") + for i in range(self.options.mp_increase): + possible_level_up_item_pool.append("Max MP Increase") + for i in range(self.options.ap_increase): + possible_level_up_item_pool.append("Max AP Increase") + + # Fill remaining pool with items from other pool + while len(level_up_item_pool) < 100 and len(possible_level_up_item_pool) > 0: + level_up_item_pool.append(possible_level_up_item_pool.pop(self.random.randrange(len(possible_level_up_item_pool)))) - # Fill pool with mandatory items - for i in range(self.options.item_slot_increase): - level_up_item_pool.append("Item Slot Increase") - for i in range(self.options.accessory_slot_increase): - level_up_item_pool.append("Accessory Slot Increase") - - # Create other pool - for i in range(self.options.strength_increase): - possible_level_up_item_pool.append("Strength Increase") - for i in range(self.options.defense_increase): - possible_level_up_item_pool.append("Defense Increase") - for i in range(self.options.hp_increase): - possible_level_up_item_pool.append("Max HP Increase") - for i in range(self.options.mp_increase): - possible_level_up_item_pool.append("Max MP Increase") - for i in range(self.options.ap_increase): - possible_level_up_item_pool.append("Max AP Increase") - - # Fill remaining pool with items from other pool - while len(level_up_item_pool) < 100 and len(possible_level_up_item_pool) > 0: - level_up_item_pool.append(possible_level_up_item_pool.pop(self.random.randrange(len(possible_level_up_item_pool)))) - - level_up_locations = list(get_locations_by_category("Levels").keys()) - self.random.shuffle(level_up_item_pool) - i = self.options.force_stats_on_levels - 1 - while len(level_up_item_pool) > 0 and i < self.options.level_checks: - self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) - i = i + 1 - total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - 1 + level_up_locations = list(get_locations_by_category("Levels").keys()) + self.random.shuffle(level_up_item_pool) + i = self.options.force_stats_on_levels - 1 + while len(level_up_item_pool) > 0 and i < self.options.level_checks: + self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) + i = i + 1 + + #Calculate prefilled locations and items + if True: #Allow notepad++ to collpase this section + prefilled_items = [] + prefilled_locations = 1 #Victory + if self.options.junk_in_missable_locations: + prefilled_locations = prefilled_locations + 15 + if self.options.vanilla_emblem_pieces: + prefilled_locations = prefilled_locations + 4 + prefilled_items = prefilled_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] + + total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - prefilled_locations + non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades", "Accessory", "Weapons", "Puppies"] if self.options.hundred_acre_wood: non_filler_item_categories.append("Torn Pages") for name, data in item_table.items(): quantity = data.max_quantity - - # Ignore filler, it will be added in a later stage. if data.category not in non_filler_item_categories: continue if data.category == "Puppies": @@ -98,13 +110,32 @@ def create_items(self): 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)] - elif name == "Atlantica" or name == "Mermaid Kick": + 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)] + elif name == "High Jump": + if self.options.extra_shared_abilities: + item_pool += [self.create_item(name) for _ in range(0, 3)] + else: + item_pool += [self.create_item(name) for _ in range(0, quantity)] + elif name == "Glide": + if self.options.extra_shared_abilities: + item_pool += [self.create_item(name) for _ in range(0, 4)] + else: + item_pool += [self.create_item(name) for _ in range(0, quantity)] elif name == "End of the World": if self.options.end_of_the_world_unlock.current_key == "item": item_pool += [self.create_item(name) for _ in range(0, quantity)] - else: + 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: item_pool += [self.create_item(name) for _ in range(0, quantity)] for i in range(self.determine_reports_in_pool()): @@ -142,6 +173,27 @@ def pre_fill(self) -> None: "puppies": "Traverse Town Piano Room Return 99 Puppies Reward 2" } self.multiworld.get_location(goal_dict[self.options.goal.current_key], self.player).place_locked_item(self.create_item("Victory")) + if self.options.junk_in_missable_locations: + self.multiworld.get_location("Traverse Town 1st District Leon Gift", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Traverse Town 1st District Aerith Gift", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("End of the World World Terminus Hollow Bastion Chest", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 01:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 02:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 03:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 04:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 05:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 06:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 07:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 08:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 09:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 10:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 11:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + self.multiworld.get_location("Neverland Clock Tower 12:00 Door", self.player).place_locked_item(self.create_item("Elixir")) + if self.options.vanilla_emblem_pieces: + self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)", self.player).place_locked_item(self.create_item("Emblem Piece (Flame)")) + self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)", self.player).place_locked_item(self.create_item("Emblem Piece (Statue)")) + self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)", self.player).place_locked_item(self.create_item("Emblem Piece (Fountain)")) + self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)", self.player).place_locked_item(self.create_item("Emblem Piece (Chest)")) def get_filler_item_name(self) -> str: fillers = {} @@ -184,6 +236,12 @@ def fill_slot_data(self) -> dict: 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"] = "" return slot_data def create_item(self, name: str) -> KH1Item: @@ -199,20 +257,6 @@ def set_rules(self): def create_regions(self): create_regions(self.multiworld, self.player, self.options) - self._place_events() - - def _place_events(self): - self.multiworld.get_location("Traverse Town Item Shop Postcard" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) - self.multiworld.get_location("Traverse Town 1st District Safe Postcard" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) - self.multiworld.get_location("Traverse Town Gizmo Shop Postcard 1" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) - self.multiworld.get_location("Traverse Town Gizmo Shop Postcard 2" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) - self.multiworld.get_location("Traverse Town Item Workshop Postcard" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) - self.multiworld.get_location("Traverse Town 3rd District Balcony Postcard" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) - self.multiworld.get_location("Traverse Town Geppetto's House Postcard" , self.player).place_locked_item(self.create_event("Vanilla Postcard")) - self.multiworld.get_location("Traverse Town Piano Room Return 50 Puppies Torn Page", self.player).place_locked_item(self.create_event("Vanilla Torn Page")) - self.multiworld.get_location("Halloween Town Lab Torn Page" , self.player).place_locked_item(self.create_event("Vanilla Torn Page")) - if self.options.atlantica: - self.multiworld.get_location("Atlantica Ariel's Grotto Torn Page" , self.player).place_locked_item(self.create_event("Vanilla Torn Page")) def get_numbers_of_reports_to_consider(self) -> int: numbers_to_consider = [] From 33237d7969209dad266997231434c20b2de1624f Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 08:27:32 -0500 Subject: [PATCH 164/284] Update Rules.py --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 147bc33c8ca3..c8f7ed101c6c 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -106,7 +106,7 @@ def has_oogie_manor(state: CollectionState, player: int, advanced_logic: bool) - return ( has_item(state, player, "Progressive Fire") or (advanced_logic and has_at_least(state, player, "High Jump", 2)) - or (advanced_logic and has_item(state, player, "High Jump") and can_glide(state, player)))) + or (advanced_logic and has_item(state, player, "High Jump") and can_glide(state, player)) ) def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_reports: int, final_rest_door_required_reports: int, final_rest_door_requirement: str): From 41de7060b4812c40009f8c4b37bc8222117db552 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 19:59:28 -0500 Subject: [PATCH 165/284] fixed oathkeeper and crabclaw logic --- worlds/kh1/Items.py | 2 +- worlds/kh1/Rules.py | 27 +++++++++++++++++++++++---- worlds/kh1/docs/en_Kingdom Hearts.md | 2 ++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 9f30685bc559..7f88258fff2d 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -122,7 +122,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index c8f7ed101c6c..d16fadbcf8e4 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -8,7 +8,7 @@ def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keybla 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 has_keyblade(state, player, keyblades_unlock_chests, keyblades[i]): + if (state.has(worlds[i], player) and has_keyblade(state, player, keyblades_unlock_chests, keyblades[i])) or (state.has(worlds[i], player) and worlds[i] == "Atlantica"): worlds_acquired = worlds_acquired + 0.5 return worlds_acquired >= num_of_worlds @@ -172,6 +172,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "High Jump") or (options.advanced_logic and has_item(state, player, "Glide")) ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") @@ -450,7 +451,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ) if options.hundred_acre_wood: multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: ( - True + has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") ) multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: ( has_torn_pages(state, player, 4) @@ -459,6 +460,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "High Jump") or can_glide(state, player) ) + and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") ) multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: ( has_torn_pages(state, player, 4) @@ -467,9 +469,11 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "High Jump") or can_glide(state, player) ) + and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") ) multiworld.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest" , player).access_rule = lambda state: ( has_torn_pages(state, player, 4) + and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") ) multiworld.get_location("Agrabah Plaza By Storage Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") @@ -1590,6 +1594,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "High Jump") or (options.advanced_logic and can_glide(state, player)) ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 2" , player).access_rule = lambda state: ( has_item(state, player, "Monstro") @@ -1598,6 +1603,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "High Jump") or (options.advanced_logic and can_glide(state, player)) ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 3" , player).access_rule = lambda state: ( has_item(state, player, "Monstro") @@ -1606,6 +1612,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "High Jump") or (options.advanced_logic and can_glide(state, player)) ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 4" , player).access_rule = lambda state: ( has_item(state, player, "Monstro") @@ -1614,6 +1621,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "High Jump") or (options.advanced_logic and can_glide(state, player)) ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 5" , player).access_rule = lambda state: ( has_item(state, player, "Monstro") @@ -1622,15 +1630,26 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "High Jump") or (options.advanced_logic and can_glide(state, player)) ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward" , player).access_rule = lambda state: ( has_item(state, player, "Monstro") - and has_item(state, player, "High Jump") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) and has_all_summons(state, player) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Geppetto's House Talk to Pinocchio" , player).access_rule = lambda state: ( has_item(state, player, "Monstro") - and has_item(state, player, "High Jump") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: ( has_all_magic_lvx(state, player, 1) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 8b3469aa5afc..ba010444b27b 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -15,6 +15,8 @@ Krujo and the team from the KH1 Critical Mix Riku mod for their work on the `Sho JaredWeakStrike for helping clean up my mess of code. +KSX for their interact out of battle code. + ## Where is the options page? The [player options page for this game](../player-options) contains most of the options you need to From 7c1ffbf70052721ac5433b86ddbc176f51413d99 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 21:09:15 -0500 Subject: [PATCH 166/284] Update Rules.py --- worlds/kh1/Rules.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index d16fadbcf8e4..4ed9ebcf009b 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1984,6 +1984,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ( has_item(state, player, "Theon Vol. 6") or has_at_least(state, player, "High Jump", 3) + or has_emblems(state, player) ) and has_item(state, player, "Progressive Fire") and @@ -1997,17 +1998,20 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)" , player).access_rule = lambda state: ( has_item(state, player, "Theon Vol. 6") or has_at_least(state, player, "High Jump", 3) + or has_emblems(state, player) ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)" , player).access_rule = lambda state: ( ( has_item(state, player, "Theon Vol. 6") or has_at_least(state, player, "High Jump", 3) + or has_emblems(state, player) ) and has_item(state, player, "Red Trinity") ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)" , player).access_rule = lambda state: ( has_item(state, player, "Theon Vol. 6") or has_at_least(state, player, "High Jump", 3) + or has_emblems(state, player) ) #multiworld.get_location("Traverse Town 1st District Leon Gift" , player).access_rule = lambda state: () #multiworld.get_location("Traverse Town 1st District Aerith Gift" , player).access_rule = lambda state: () From e70dad15cad207223a08feed97bfbc9e7157003b Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 21:13:29 -0500 Subject: [PATCH 167/284] Update Rules.py --- worlds/kh1/Rules.py | 87 +++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 4ed9ebcf009b..5525febc2aad 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -21,13 +21,14 @@ def has_evidence(state: CollectionState, player: int) -> bool: def can_glide(state: CollectionState, player: int) -> bool: return state.has("Glide", player) or state.has("Superglide", player) -def has_emblems(state: CollectionState, player: int) -> bool: +def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bool) -> bool: return ( state.has("Emblem Piece (Flame)", player) and state.has("Emblem Piece (Chest)", player) and state.has("Emblem Piece (Statue)", player) and state.has("Emblem Piece (Fountain)", player) - and state.has("Hollow Bastion", player) + and state.has("Hollow Bastion", player) + and has_x_worlds(state, player, 5, keyblades_unlock_chests) ) def has_item(state: CollectionState, player: int, item: str) -> bool: @@ -88,7 +89,7 @@ def has_final_rest_door(state: CollectionState, player:int, final_rest_door_requ if final_rest_door_requirement == "postcards": return has_postcards(state, 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"}, player) and has_emblems(state, player) and has_all_magic_lvx(state, player, 2) and has_defensive_tools(state, player) + return state.has_all({"Olympus Coliseum", "Neverland", "Agrabah", "Hollow Bastion", "Green Trinity", "Phil Cup", "Pegasus Cup", "Hercules Cup"}, player) and has_emblems(state, player, options.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: return (state.count("Progressive Cure", player) >= 2 and state.has("Leaf Bracer", player) and state.has("Dodge Roll", player)) and (state.has("Second Chance", player) or state.has("MP Rage", player) or state.count("Progressive Aero", player) >= 2) @@ -982,7 +983,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ) multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") @@ -1010,14 +1011,14 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report or has_item(state, player, "Progressive Blizzard") or (options.advanced_logic and has_item(state, player, "Combo Master")) ) - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_item(state, player, "Progressive Gravity") and ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) or (options.advanced_logic and has_at_least(state, player, "High Jump", 2) and can_glide(state,player)) or (options.advanced_logic and can_dumbo_skip(state, player) and can_glide(state,player)) ) @@ -1026,7 +1027,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) or has_at_least(state, player, "High Jump", 2) or (options.advanced_logic and can_dumbo_skip(state, player)) ) @@ -1035,32 +1036,32 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) or has_at_least(state, player, "High Jump", 2) or (options.advanced_logic and can_dumbo_skip(state, player)) ) ) multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_item(state, player, "Progressive Gravity") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_item(state, player, "Progressive Gravity") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") @@ -1072,7 +1073,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_item(state, player, "Progressive Gravity") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") @@ -1080,7 +1081,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ) multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) and can_glide(state, player) ) multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: ( @@ -1090,7 +1091,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_item(state, player, "Progressive Gravity") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") @@ -1123,15 +1124,15 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ) multiworld.get_location("Hollow Bastion Grand Hall Steps Right Side Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Grand Hall Oblivion Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Grand Hall Left of Gate Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) #multiworld.get_location("Hollow Bastion Entrance Hall Push the Statue Chest" , player).access_rule = lambda state: () multiworld.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest" , player).access_rule = lambda state: ( @@ -1143,7 +1144,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ( options.advanced_logic and can_dumbo_skip(state, player) - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) ) ) @@ -1265,7 +1266,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report #multiworld.get_location("Traverse Town Defeat Guard Armor Blue Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Traverse Town Leon Secret Waterway Earthshine Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) and has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) ) @@ -1353,26 +1354,26 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "Green Trinity") and has_all_magic_lvx(state, player, 2) and has_defensive_tools(state, player) - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") ) #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Defeat Riku II Ragnarok Event" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Defeat Behemoth Omega Arts Event" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Speak to Princesses Fire Event" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) #multiworld.get_location("End of the World Defeat Chernabog Superglide Event" , player).access_rule = lambda state: has_item(state, player, "") @@ -1431,7 +1432,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report #multiworld.get_location("Agrabah Defeat Jafar Genie Ansem's Report 1" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) if options.atlantica: multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: ( @@ -1440,13 +1441,13 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_offensive_magic(state, player) ) multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: ( has_item(state, player, "Jack-In-The-Box") @@ -1464,11 +1465,11 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "Green Trinity") ) multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) if options.super_bosses: multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: ( - has_emblems(state, player) + 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) ) @@ -1482,7 +1483,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ) if options.super_bosses or options.goal.current_key == "unknown": multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: ( - has_emblems(state, player) + 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) ) @@ -1882,7 +1883,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ) multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: ( has_item(state, player, "Hollow Bastion") - and has_emblems(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) ) multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: ( @@ -1892,9 +1893,9 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_item(state, player, "Green Trinity") ) if options.super_bosses: - multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = 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) if options.super_bosses or options.goal.current_key == "unknown": - multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: has_emblems(state, player) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = 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) #multiworld.get_location("Olympus Coliseum Coliseum Gates Hero's License Event" , player).access_rule = lambda state: () #if options.atlantica: #multiworld.get_location("Atlantica Sunken Ship Crystal Trident Event" , player).access_rule = lambda state: () @@ -1984,7 +1985,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ( has_item(state, player, "Theon Vol. 6") or has_at_least(state, player, "High Jump", 3) - or has_emblems(state, player) + or has_emblems(state, player, options.keyblades_unlock_chests) ) and has_item(state, player, "Progressive Fire") and @@ -1998,28 +1999,28 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)" , player).access_rule = lambda state: ( has_item(state, player, "Theon Vol. 6") or has_at_least(state, player, "High Jump", 3) - or has_emblems(state, player) + or has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)" , player).access_rule = lambda state: ( ( has_item(state, player, "Theon Vol. 6") or has_at_least(state, player, "High Jump", 3) - or has_emblems(state, player) + or has_emblems(state, player, options.keyblades_unlock_chests) ) and has_item(state, player, "Red Trinity") ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)" , player).access_rule = lambda state: ( has_item(state, player, "Theon Vol. 6") or has_at_least(state, player, "High Jump", 3) - or has_emblems(state, player) + or has_emblems(state, player, options.keyblades_unlock_chests) ) #multiworld.get_location("Traverse Town 1st District Leon Gift" , player).access_rule = lambda state: () #multiworld.get_location("Traverse Town 1st District Aerith Gift" , player).access_rule = lambda state: () multiworld.get_location("Hollow Bastion Library Speak to Belle Divine Rose" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Library Speak to Aerith Cure" , player).access_rule = lambda state: ( - has_emblems(state, player) + has_emblems(state, player, options.keyblades_unlock_chests) ) From 62891b2c9204722022f91808827e5ba81efb6011 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 21:28:28 -0500 Subject: [PATCH 168/284] Update Rules.py --- worlds/kh1/Rules.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 5525febc2aad..ee99987b81f9 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1881,11 +1881,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Deep Jungle Jungle Slider 50 Fruits" , player).access_rule = lambda state: ( has_slides(state, player) ) - multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: ( - has_item(state, player, "Hollow Bastion") - and has_emblems(state, player, options.keyblades_unlock_chests) - and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) - ) + #multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: () multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: ( has_evidence(state, player) ) From 0f64cbf6a38eafa98a55459ee0752710dc2f56ec Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 22:29:09 -0500 Subject: [PATCH 169/284] Update Rules.py --- worlds/kh1/Rules.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index ee99987b81f9..437156786ede 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1726,39 +1726,75 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report #multiworld.get_location("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 02:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 03:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 04:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 05:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 06:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 07:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 08:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 09:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 10:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 11:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Clock Tower 12:00 Door" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Neverland Hold Aero Chest" , player).access_rule = lambda state: ( has_item(state, player, "Yellow Trinity") From 26ec0c1c847ffa2317aef3001a8ca355d311d781 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 23:29:18 -0500 Subject: [PATCH 170/284] Update en_Kingdom Hearts.md --- worlds/kh1/docs/en_Kingdom Hearts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index ba010444b27b..10ee94cc167a 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -15,7 +15,7 @@ Krujo and the team from the KH1 Critical Mix Riku mod for their work on the `Sho JaredWeakStrike for helping clean up my mess of code. -KSX for their interact out of battle code. +KSX for their interact in battle code. ## Where is the options page? From afbfe013c331ec2627f753fdb813862f646c347e Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 23:32:38 -0500 Subject: [PATCH 171/284] Update en_Kingdom Hearts.md --- worlds/kh1/docs/en_Kingdom Hearts.md | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 10ee94cc167a..1d59918f05d1 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -64,7 +64,7 @@ Phil Cup, Pegasus Cup, and Hercules Cup are all multiworld items. Finding all 3 ###The slides aren't spawning in Deep Jungle. -Find `Slide 1` in the multiworld. +Find `Slides` in the multiworld. ###I can't progress Halloween Town. @@ -76,13 +76,4 @@ Find `Theon Vol. 6` in the multiworld. ##How do I enter the End of the World? -Find the required number of Ansem's Reports defined in your settings in the multiworld. - -##I am stuck in Hollow Bastion, how do I leave? - -You can open the full menu and warp out using `L1` + `L2` + `R2` + `Select` - -##I am still receiving vanilla rewards in several locations. -There are locations that still grant vanilla rewards, as it is currently not known how to remove them. Such locations include Atlantica Clams, Spinners in the Hollow Bastion Library, Puppy Rewards, and several Postcard Locations. - -Where these items are progression, they remain vanilla. Where they are filler items, they grant a check in addition to the vanilla reward. \ No newline at end of file +Find the required number of Ansem's Reports defined in your settings in the multiworld. \ No newline at end of file From ff2c7a69759314707909931e3c27e15f9b96f912 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 23:37:06 -0500 Subject: [PATCH 172/284] fixing text --- worlds/kh1/Options.py | 3 ++- worlds/kh1/docs/en_Kingdom Hearts.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 87d3d27148f6..7d8fc690cdf2 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -304,8 +304,9 @@ class KeybladesUnlockChests(Toggle): NL - Fairy Harp HB - Divine Rose EotW - Oblivion + HAW - Oathkeeper - Note: Does not apply to Atlantica, 100 Acre Wood, The emblem and carousel chests in Hollow Bastion, or the Aero chest in Neverland currently. + 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" diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 1d59918f05d1..f687f8fcba28 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -60,7 +60,7 @@ Find `Footprints` in the multiworld. ###I can't enter any cups in Olympus Coliseum. -Phil Cup, Pegasus Cup, and Hercules Cup are all multiworld items. Finding all 3 grant you access to Hades Cup and the Platinum Match. Clearing all cups lets you challenge Ice Titan. +`Phil Cup`, `Pegasus Cup`, and `Hercules Cup` are all multiworld items. Finding all 3 grant you access to Hades Cup and the Platinum Match. Clearing all cups lets you challenge Ice Titan. ###The slides aren't spawning in Deep Jungle. From 2a695e3bd939595fe7f91752fb80dd6ba2d99420 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 8 Jun 2024 23:39:06 -0500 Subject: [PATCH 173/284] Update kh1_en.md --- worlds/kh1/docs/kh1_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index efe9442da518..0dc269796869 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -20,7 +20,7 @@ BEFORE MODDING, PLEASE INSTALL AND RUN KH1 AT LEAST ONCE. Ensure that `Launch via Epic Games` is checked and click `Next` - Extracting game data for KH1 is not required, you may skip it in the next step. + Extract game data for KH1 and any other games you wish to modify. Click `Finish` From 963724e88c8c7b3736635f0e7094d6a5d8180841 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 12 Jun 2024 21:35:41 -0500 Subject: [PATCH 174/284] Addition of new key items --- worlds/kh1/Items.py | 11 +++--- worlds/kh1/Rules.py | 78 ++++++++++++++++++++++++++++++++++++------ worlds/kh1/__init__.py | 3 ++ 3 files changed, 75 insertions(+), 17 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 7f88258fff2d..beb1b106cbcf 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -236,7 +236,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 10, weight = 10), "Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), @@ -253,9 +253,9 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), #"Pretty Stone": KH1ItemData("Synthesis", code = 264_1231, classification = ItemClassification.filler, max_quantity = 1, weight = 10), #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, max_quantity = 1, weight = 10), @@ -522,10 +522,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Hades Cup": KH1ItemData("Cups", code = 264_9004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), } -event_item_table: Dict[str, KH1ItemData] = { - "Vanilla Postcard": KH1ItemData("Event", classification = ItemClassification.progression), - "Vanilla Torn Page": KH1ItemData("Event", classification = ItemClassification.progression), -} +event_item_table: Dict[str, KH1ItemData] = {} #Make item categories item_name_groups: Dict[str, Set[str]] = {} diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 437156786ede..5346dd4774e9 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -89,7 +89,13 @@ def has_final_rest_door(state: CollectionState, player:int, final_rest_door_requ if final_rest_door_requirement == "postcards": return has_postcards(state, 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"}, player) and has_emblems(state, player, options.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) + 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: return (state.count("Progressive Cure", player) >= 2 and state.has("Leaf Bracer", player) and state.has("Dodge Roll", player)) and (state.has("Second Chance", player) or state.has("MP Rage", player) or state.count("Progressive Aero", player) >= 2) @@ -692,6 +698,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ) multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: ( has_item(state, player, "Progressive Fire") + and has_item(state, player, "Crystal Trident") ) multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: ( True @@ -702,17 +709,21 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "White Trinity") + and has_item(state, player, "Forget-Me-Not") ) multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") ) multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Forget-Me-Not") ) multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and ( can_glide(state, player) @@ -722,36 +733,43 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_oogie_manor(state, player, options) ) multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_item(state, player, "Red Trinity") ) multiworld.get_location("Halloween Town Guillotine Square High Tower Chest" , player).access_rule = lambda state: ( @@ -780,14 +798,17 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") ) multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") ) multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and ( can_glide(state, player) @@ -798,6 +819,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: ( @@ -1284,8 +1306,12 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_slides(state, player) ) #multiworld.get_location("Olympus Coliseum Clear Phil's Training Thunder Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Olympus Coliseum Cloud Sonic Blade Event" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event" , player).access_rule = lambda state: ( + has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Olympus Coliseum Cloud Sonic Blade Event" , player).access_rule = lambda state: ( + has_item(state, player, "Entry Pass") + ) multiworld.get_location("Wonderland Defeat Trickmaster Blizzard Event" , player).access_rule = lambda state: ( has_evidence(state, player) ) @@ -1311,27 +1337,33 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Atlantica Defeat Ursula I Mermaid Kick Event" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") and has_offensive_magic(state, player) + and has_item(state, player, "Crystal Trident") ) multiworld.get_location("Atlantica Defeat Ursula II Thunder Event" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") and has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) + and has_item(state, player, "Crystal Trident") ) multiworld.get_location("Atlantica Seal Keyhole Crabclaw Event" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") and has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) + and has_item(state, player, "Crystal Trident") ) multiworld.get_location("Halloween Town Defeat Oogie Boogie Holy Circlet Event" , player).access_rule = lambda state: ( has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Defeat Oogie's Manor Gravity Event" , player).access_rule = lambda state: ( has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Seal Keyhole Pumpkinhead Event" , player).access_rule = lambda state: ( has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Neverland Defeat Anti Sora Raven's Claw Event" , player).access_rule = lambda state: ( @@ -1425,7 +1457,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report #multiworld.get_location("Atlantica Triton's Palace Wall Right Clam" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Triton's Palace Near Path Clam" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Triton's Palace Wall Left Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Cavern Nook Clam" , player).access_rule = lambda state: has_item(state, player, "") + multiworld.get_location("Atlantica Cavern Nook Clam" , player).access_rule = lambda state: has_item(state, player, "Crystal Trident") #multiworld.get_location("Atlantica Below Deck Clam" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Undersea Garden Clam" , player).access_rule = lambda state: has_item(state, player, "") #multiworld.get_location("Atlantica Undersea Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") @@ -1439,6 +1471,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") and has_item(state, player, "Mermaid Kick") and has_offensive_magic(state, player) + and has_item(state, player, "Crystal Trident") ) multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: ( has_emblems(state, player, options.keyblades_unlock_chests) @@ -1451,6 +1484,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ) multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: ( has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") and has_item(state, player, "Progressive Fire") ) if options.cups: @@ -1460,6 +1494,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: ( has_item(state, player, "Green Trinity") @@ -1480,6 +1515,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) if options.super_bosses or options.goal.current_key == "unknown": multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: ( @@ -1491,33 +1527,42 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report if options.cups: multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Phil Cup Time Trial" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: ( has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: ( has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: ( has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: ( has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: ( has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: ( has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") @@ -1525,6 +1570,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") @@ -1532,6 +1578,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") @@ -1539,6 +1586,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") @@ -1546,6 +1594,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") @@ -1553,6 +1602,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") @@ -1560,6 +1610,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") @@ -1567,6 +1618,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") @@ -1574,14 +1626,17 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: ( has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: ( has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") ) #multiworld.get_location("Traverse Town Magician's Study Turn in Naturespark" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Progressive Fire") @@ -1706,6 +1761,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) if options.cups: multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: ( @@ -1715,6 +1771,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_item(state, player, "Guard") and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: ( has_item(state, player, "Phil Cup") @@ -1722,6 +1779,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") ) #multiworld.get_location("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = lambda state: ( @@ -1835,8 +1893,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report or can_glide(state, player) ) ) - if options.atlantica: - multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: ( + multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: ( has_torn_pages(state, player, 5) ) multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: ( @@ -1851,8 +1908,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: ( has_torn_pages(state, player, 4) ) - if options.atlantica: - multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: ( + multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: ( has_torn_pages(state, player, 5) ) multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: ( @@ -1901,6 +1957,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and has_item(state, player, "Pegasus Cup") and has_item(state, player, "Hercules Cup") and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") ) multiworld.get_location("Deep Jungle Jungle Slider 10 Fruits" , player).access_rule = lambda state: ( has_slides(state, player) @@ -1928,7 +1985,9 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = 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) if options.super_bosses or options.goal.current_key == "unknown": multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = 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) - #multiworld.get_location("Olympus Coliseum Coliseum Gates Hero's License Event" , player).access_rule = lambda state: () + multiworld.get_location("Olympus Coliseum Coliseum Gates Hero's License Event" , player).access_rule = lambda state: ( + has_item(state, player, "Entry Pass") + ) #if options.atlantica: #multiworld.get_location("Atlantica Sunken Ship Crystal Trident Event" , player).access_rule = lambda state: () #multiworld.get_location("Halloween Town Graveyard Forget-Me-Not Event" , player).access_rule = lamdba state: () @@ -1941,7 +2000,6 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report ) #multiworld.get_location("Olympus Coliseum Coliseum Gates Entry Pass Event" , player).access_rule = lambda state: () - multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: ( has_at_least(state, player, "Empty Bottle", 6) and diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index d4a4fd6f5c97..97d71c09919f 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -119,6 +119,9 @@ def create_items(self): 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)] elif name == "High Jump": if self.options.extra_shared_abilities: item_pool += [self.create_item(name) for _ in range(0, 3)] From 1f41bf63cfc1ab57f4e54bc3fcd23189349bed02 Mon Sep 17 00:00:00 2001 From: gaithern Date: Thu, 13 Jun 2024 08:56:59 -0500 Subject: [PATCH 175/284] Update Regions.py --- worlds/kh1/Regions.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 67f01b96ed18..7c3baa7d5ae8 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -441,14 +441,12 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 3") regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 4") regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 5") - if options.atlantica: - regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Owl Cheer") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Owl Cheer") regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 1") regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 2") regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 3") regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 4") - if options.atlantica: - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 5") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 5") regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Cabinet") regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Chimney") From 622f187022968719b7a2d2e0d8b8e1108ac0b6e7 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 28 Jun 2024 21:55:20 -0500 Subject: [PATCH 176/284] Push for start item from pool test --- worlds/kh1/Items.py | 4 ++-- worlds/kh1/Options.py | 4 ++-- worlds/kh1/Rules.py | 4 ++-- worlds/kh1/__init__.py | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index beb1b106cbcf..c584763903ef 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -155,7 +155,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Dream Shield": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, max_quantity = 1, weight = 10), + "Dream Shield (Goofy)": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, max_quantity = 1, weight = 10), "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, max_quantity = 1, weight = 10), @@ -284,7 +284,7 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat #"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, max_quantity = 1, weight = 10), "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 2, weight = 10), + "Progressive Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 2, weight = 10), "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 0, weight = 10), "Puppy 01": KH1ItemData("Puppies", code = 264_2101, classification = ItemClassification.progression, max_quantity = 1, weight = 10), "Puppy 02": KH1ItemData("Puppies", code = 264_2102, classification = ItemClassification.progression, max_quantity = 1, weight = 10), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 7d8fc690cdf2..c5a4cb6d8c8a 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from Options import NamedRange, Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionSet, PerGameCommonOptions +from Options import NamedRange, Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionSet, PerGameCommonOptions, StartInventoryPool class StrengthIncrease(Range): """ @@ -389,5 +389,5 @@ class KH1Options(PerGameCommonOptions): mp_increase: MPIncrease accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease - + start_inventory_pool: StartInventoryPool diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 5346dd4774e9..60901ced627a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -19,7 +19,7 @@ def has_evidence(state: CollectionState, player: int) -> bool: return state.has("Footprints", player) #or state.has("Stench", player) or state.has("Claw Marks", player) or state.has("Antenna", player) def can_glide(state: CollectionState, player: int) -> bool: - return state.has("Glide", player) or state.has("Superglide", player) + return state.has("Progressive Glide", player) or state.has("Superglide", player) def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bool) -> bool: return ( @@ -177,7 +177,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report and ( has_item(state, player, "High Jump") - or (options.advanced_logic and has_item(state, player, "Glide")) + or (options.advanced_logic and can_glide(state, player)) ) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) ) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 97d71c09919f..8c109969cb6b 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -127,7 +127,7 @@ def create_items(self): item_pool += [self.create_item(name) for _ in range(0, 3)] else: item_pool += [self.create_item(name) for _ in range(0, quantity)] - elif name == "Glide": + elif name == "Progressive Glide": if self.options.extra_shared_abilities: item_pool += [self.create_item(name) for _ in range(0, 4)] else: From 788af910551b74ac4a402269137df38b738d7287 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sat, 29 Jun 2024 13:19:45 -0500 Subject: [PATCH 177/284] Update worlds/kh1/Options.py Co-authored-by: Scipio Wright --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index c5a4cb6d8c8a..635f36524f16 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -389,5 +389,5 @@ class KH1Options(PerGameCommonOptions): mp_increase: MPIncrease accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease - start_inventory_pool: StartInventoryPool + start_inventory_from_pool: StartInventoryPool From 68b3efed586bf8547bab559d1e10bd9f0ee55aa0 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 29 Jun 2024 14:28:28 -0500 Subject: [PATCH 178/284] Document update --- worlds/kh1/docs/en_Kingdom Hearts.md | 17 ++++++++++------- worlds/kh1/docs/kh1_en.md | 4 +--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index f687f8fcba28..1031c53ff57c 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -7,11 +7,11 @@ Denho's original KH rando laid the foundation for the work here and makes everyt Other credits include: -Sonicshadowsilver2 for their work finding many memory addresses and working to idenitify and resolve bugs. +Sonicshadowsilver2 for their work finding many memory addresses, working to idenitify and resolve bugs, and coverting the code base to the latest EGS update. Shananas and the rest of the OpenKH team for providing such an amazing tool for us to utilize on this project. -Krujo and the team from the KH1 Critical Mix Riku mod for their work on the `Show Prompt` method. +TopazTK for their work on the `Show Prompt` method and Krujo for their implementation of the method in AP. JaredWeakStrike for helping clean up my mess of code. @@ -26,9 +26,9 @@ configure and export a config file. 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. -Worlds can only be accessed by finding the corresponding item. For example, you need to find the "Monstro" item to enter Monstro. +Worlds can only be accessed by finding the corresponding item. For example, you need to find the `Monstro` item to enter Monstro. -The default goal is to enter End of the World and defeat Final Ansem. You can enter the world by obtaining a number of Ansem's Reports defined in your YAML. +The default goal is to enter End of the World and defeat Final Ansem. ## What items and locations get shuffled? @@ -60,15 +60,18 @@ Find `Footprints` in the multiworld. ###I can't enter any cups in Olympus Coliseum. -`Phil Cup`, `Pegasus Cup`, and `Hercules Cup` are all multiworld items. Finding all 3 grant you access to Hades Cup and the Platinum Match. Clearing all cups lets you challenge Ice Titan. +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 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 Atlantica. +Find `Crystal Trident` in the multiworld. + ###I can't progress Halloween Town. -Find `Jack-in-the-Box` in the multiworld. +Find `Forget-Me-Not` and `Jack-in-the-Box` in the multiworld. ###The Hollow Bastion Library is missing a book. @@ -76,4 +79,4 @@ Find `Theon Vol. 6` in the multiworld. ##How do I enter the End of the World? -Find the required number of Ansem's Reports defined in your settings in the multiworld. \ No newline at end of file +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 settings. \ No newline at end of file diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index 0dc269796869..dc9580da7539 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -12,14 +12,12 @@ BEFORE MODDING, PLEASE INSTALL AND RUN KH1 AT LEAST ONCE. Open `OpenKh.Tools.ModsManager.exe` and run first time set up. - When prompted for game edition, choose `PC Release via Epic Games Store` and navigate to your `KH_1.5_2.5` folder in the path box and click `Next` + When prompted for game edition, choose `PC Release`, select which platform you're using (EGS or Steam), navigate to your `Kingdom Hearts I.5 + II.5` installation folder in the path box and click `Next` When prompted, install Panacea, then click `Next` When prompted, check KH1 plus any other AP game you play and click `Install and configure LUA backend`, then click `Next`. - Ensure that `Launch via Epic Games` is checked and click `Next` - Extract game data for KH1 and any other games you wish to modify. Click `Finish` From 2929f190fa146165794109c9eada7a896ab8ee53 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 30 Jun 2024 08:40:05 -0500 Subject: [PATCH 179/284] Update Rules.py --- worlds/kh1/Rules.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 60901ced627a..d5507d475114 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1105,6 +1105,7 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_emblems(state, player, options.keyblades_unlock_chests) and can_glide(state, player) + and has_item(state, player, "Progressive Gravity") ) multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") From 50844b57537be78df2187c99b604087119e94875 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 1 Jul 2024 15:44:07 -0500 Subject: [PATCH 180/284] Added starting world range and final rest goal option --- worlds/kh1/Options.py | 12 ++++++++++++ worlds/kh1/__init__.py | 17 ++++++++++++++++- worlds/kh1/test/test_goal.py | 4 ++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 635f36524f16..81a864933d04 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -119,6 +119,7 @@ class Goal(Choice): Postcards: Turn in all 10 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. + Final Rest: Open the chest in End of the World Final Rest """ display_name = "Goal" option_sephiroth = 0 @@ -126,6 +127,7 @@ class Goal(Choice): option_postcards = 2 option_final_ansem = 3 option_puppies = 4 + option_final_rest = 5 default = 3 class EndoftheWorldUnlock(Choice): @@ -351,6 +353,15 @@ class JunkInMissableLocations(DefaultOnToggle): """ display_name = "Junk in Missable Locations" +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". + """ + display_name = "Starting Worlds" + default = 0 + range_start = 0 + range_end = 10 + @dataclass class KH1Options(PerGameCommonOptions): goal: Goal @@ -364,6 +375,7 @@ class KH1Options(PerGameCommonOptions): hundred_acre_wood: HundredAcreWood cups: Cups puppies: Puppies + starting_worlds: StartingWorlds keyblades_unlock_chests: KeybladesUnlockChests interact_in_battle: InteractInBattle exp_multiplier: EXPMultiplier diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 8c109969cb6b..6784aa30fe44 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -49,6 +49,18 @@ class KH1World(World): location_name_groups = location_name_groups def create_items(self): + #Handle starting worlds + starting_worlds = [] + if self.options.starting_worlds > 0: + 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.end_of_the_world_unlock.current_key == "item": + possible_starting_worlds.append("End of the World") + starting_worlds = self.random.sample(possible_starting_worlds, min(self.options.starting_worlds, len(possible_starting_worlds))) + for starting_world in starting_worlds: + self.multiworld.push_precollected(self.create_item(starting_world)) + item_pool: List[KH1Item] = [] possible_level_up_item_pool = [] level_up_item_pool = [] @@ -103,6 +115,8 @@ def create_items(self): quantity = data.max_quantity if data.category not in non_filler_item_categories: continue + if name in starting_worlds: + continue if data.category == "Puppies": if self.options.puppies == "triplets" and "-" in name: item_pool += [self.create_item(name) for _ in range(0, quantity)] @@ -173,7 +187,8 @@ def pre_fill(self) -> None: "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" + "puppies": "Traverse Town Piano Room Return 99 Puppies Reward 2", + "final_rest": "End of the World Final Rest Chest" } self.multiworld.get_location(goal_dict[self.options.goal.current_key], self.player).place_locked_item(self.create_item("Victory")) if self.options.junk_in_missable_locations: diff --git a/worlds/kh1/test/test_goal.py b/worlds/kh1/test/test_goal.py index ce2aaf7fa7a4..09983cf497cc 100644 --- a/worlds/kh1/test/test_goal.py +++ b/worlds/kh1/test/test_goal.py @@ -26,4 +26,8 @@ class TestFinalAnsem(KH1TestBase): class TestPuppies(KH1TestBase): options = { "Goal": 4, + } +class TestFinalRest(KH1TestBase): + options = { + "Goal": 5, } \ No newline at end of file From 979132a40d79ac6a19fde702a3ee9b24b92e8773 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 2 Jul 2024 09:11:11 -0500 Subject: [PATCH 181/284] Update kh1_en.md --- worlds/kh1/docs/kh1_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index dc9580da7539..4e6491810487 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -18,7 +18,7 @@ BEFORE MODDING, PLEASE INSTALL AND RUN KH1 AT LEAST ONCE. When prompted, check KH1 plus any other AP game you play and click `Install and configure LUA backend`, then click `Next`. - Extract game data for KH1 and any other games you wish to modify. + Extracting game data for KH1 is unnecessary, but you may want to extract data for KH2 if you plan on playing KH2 AP. Click `Finish` From de67224328c5b4924ae91b0ef8c6cbe618936599 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 2 Jul 2024 11:59:35 -0500 Subject: [PATCH 182/284] Update en_Kingdom Hearts.md --- worlds/kh1/docs/en_Kingdom Hearts.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 1031c53ff57c..dc7ad6797fbe 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -17,6 +17,12 @@ JaredWeakStrike for helping clean up my mess of code. KSX for their interact in battle code. +RavSpect for their title screen image edit. + +SunCatMC for their work on ChecksFinder, which I used as a basis for game-to-client communication. + +ThePhar for their work on Rogue Legacy AP, which I used as a basis for the apworld creation. + ## Where is the options page? The [player options page for this game](../player-options) contains most of the options you need to From 264caa525953717082a3cb9283ba355354ec921e Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 2 Jul 2024 14:35:38 -0500 Subject: [PATCH 183/284] Update __init__.py --- worlds/kh1/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 6784aa30fe44..fb70e9dc1f9f 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -229,7 +229,8 @@ def fill_slot_data(self) -> dict: ,"required_reports_eotw": int(required_reports_eotw) ,"required_reports_door": int(required_reports_door) ,"door": self.options.final_rest_door.current_key - ,"seed": self.multiworld.seed_name} + ,"seed": self.multiworld.seed_name + ,"advanced_logic": bool(self.options.advanced_logic)} if self.options.randomize_keyblade_stats: min_str_bonus = min(self.options.keyblade_min_str, self.options.keyblade_max_str) max_str_bonus = max(self.options.keyblade_min_str, self.options.keyblade_max_str) From a8c0fc15229b62140f7b113060581ab0cd14ecb8 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 2 Jul 2024 14:42:21 -0500 Subject: [PATCH 184/284] Update __init__.py --- worlds/kh1/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index fb70e9dc1f9f..b23602e8966a 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -230,7 +230,10 @@ def fill_slot_data(self) -> dict: ,"required_reports_door": int(required_reports_door) ,"door": self.options.final_rest_door.current_key ,"seed": self.multiworld.seed_name - ,"advanced_logic": bool(self.options.advanced_logic)} + ,"advanced_logic": bool(self.options.advanced_logic) + ,"hundred_acre_wood": bool(self.options.hundred_acre_wood) + ,"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, self.options.keyblade_max_str) max_str_bonus = max(self.options.keyblade_min_str, self.options.keyblade_max_str) From 5891fbe5c7ec9613465b72f5d0c09d982df64c74 Mon Sep 17 00:00:00 2001 From: gaithern Date: Wed, 3 Jul 2024 08:27:04 -0500 Subject: [PATCH 185/284] Clean up options descriptions --- worlds/kh1/Options.py | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 81a864933d04..316b53c87bd9 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -4,9 +4,9 @@ class StrengthIncrease(Range): """ - Number of Strength Increases to Add to the Level Up Rewards + Number of Strength Increases to add to the multiworld - The randomizer will add all stat up defined here into a pool and choose up to 100 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. """ display_name = "STR Increases" @@ -16,9 +16,9 @@ class StrengthIncrease(Range): class DefenseIncrease(Range): """ - Number of Defense Increases to Add to the Level Up Rewards + Number of Defense Increases to add to the multiworld - The randomizer will add all stat up defined here into a pool and choose up to 100 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. """ display_name = "DEF Increases" @@ -28,9 +28,9 @@ class DefenseIncrease(Range): class HPIncrease(Range): """ - Number of HP Increases to Add to the Level Up Rewards + Number of HP Increases to add to the multiworld - The randomizer will add all stat up defined here into a pool and choose up to 100 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. """ display_name = "HP Increases" @@ -40,9 +40,9 @@ class HPIncrease(Range): class APIncrease(Range): """ - Number of AP Increases to Add to the Level Up Rewards + Number of AP Increases to add to the multiworld - The randomizer will add all stat up defined here into a pool and choose up to 100 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. """ display_name = "AP Increases" @@ -52,9 +52,9 @@ class APIncrease(Range): class MPIncrease(Range): """ - Number of MP Increases to Add to the Level Up Rewards + Number of MP Increases to add to the multiworld - The randomizer will add all stat up defined here into a pool and choose up to 100 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. """ display_name = "MP Increases" @@ -64,9 +64,9 @@ class MPIncrease(Range): class AccessorySlotIncrease(Range): """ - Number of Accessory Slot Increases to Add to the Level Up Rewards + Number of Accessory Slot Increases to add to the multiworld - The randomizer will add all stat up defined here into a pool and choose up to 100 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. """ display_name = "Accessory Slot Increases" @@ -76,9 +76,9 @@ class AccessorySlotIncrease(Range): class ItemSlotIncrease(Range): """ - Number of Item Slot Increases to Add to the Level Up Rewards + Number of Item Slot Increases to add to the multiworld - The randomizer will add all stat up defined here into a pool and choose up to 100 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. """ display_name = "Item Slot Increases" @@ -88,7 +88,7 @@ class ItemSlotIncrease(Range): class Atlantica(Toggle): """ - Toggle whether Atlantica locations/items should be included. + Toggle whether to include Atlantica locations/items. """ display_name = "Atlantica" @@ -106,7 +106,7 @@ class SuperBosses(Toggle): class Cups(Toggle): """ - Toggle whether to include checks behind completing Phil, Pegasus, Hercules, or Hades cups. Please note that the items will still appear in the multiworld, as they are required to challenge Sephiroth. + 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. """ display_name = "Cups" @@ -114,11 +114,11 @@ class Goal(Choice): """ Determines when victory is achieved in your playthrough. - Sephiroth: Defeat Sephiroth. - Unknown: Defeat Unknown. + Sephiroth: Defeat Sephiroth + Unknown: Defeat Unknown Postcards: Turn in all 10 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 all 99 puppies in Traverse Town Final Rest: Open the chest in End of the World Final Rest """ display_name = "Goal" @@ -217,7 +217,7 @@ class RandomizeKeybladeStats(DefaultOnToggle): class KeybladeMinStrength(Range): """ - Determines the lowest STR bonus a keyblade can have + Determines the minimum STR bonus a keyblade can have """ display_name = "Keyblade Minimum STR Bonus" default = 3 @@ -344,7 +344,7 @@ class VanillaEmblemPieces(DefaultOnToggle): class JunkInMissableLocations(DefaultOnToggle): """ - If on, will place Elixirs in missable locations. If turned off, there is a chance you will need to play the game multiple times to get the missed items. + If on, will place Elixirs in missable locations. If turned off, there is a chance you will need to play the game multiple times to check missed locations. Locations include: Leon Gift Aerith Gift From 01ded3229cba506b64a00b27f6f725accc734179 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:28:15 -0500 Subject: [PATCH 186/284] Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index b23602e8966a..71fa1d1c72c7 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -55,7 +55,7 @@ def create_items(self): 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.end_of_the_world_unlock.current_key == "item": + 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, len(possible_starting_worlds))) for starting_world in starting_worlds: From 52d677d18946dd9de834b71f95b59dfe6df68bc0 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:28:22 -0500 Subject: [PATCH 187/284] Update worlds/kh1/Options.py Co-authored-by: Scipio Wright --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 316b53c87bd9..bfb0357f1cce 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from Options import NamedRange, Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionSet, PerGameCommonOptions, StartInventoryPool +from Options import NamedRange, Choice, Range, Toggle, DefaultOnToggle, PerGameCommonOptions, StartInventoryPool class StrengthIncrease(Range): """ From 9b55c6b695966959131eeeb8acea4dc19fe9624d Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:30:53 -0500 Subject: [PATCH 188/284] Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 71fa1d1c72c7..c968d1f3e82f 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -68,7 +68,7 @@ def create_items(self): #Calculate Level Up Items if True: #Allow notepad++ to collapse this section # Fill pool with mandatory items - for i in range(self.options.item_slot_increase): + for _ in range(self.options.item_slot_increase): level_up_item_pool.append("Item Slot Increase") for i in range(self.options.accessory_slot_increase): level_up_item_pool.append("Accessory Slot Increase") From 34c24e0aeb99e6d6bdb91d35c1a0d408d8239ec4 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:32:01 -0500 Subject: [PATCH 189/284] Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index c968d1f3e82f..c9f56cd6015e 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -94,7 +94,7 @@ def create_items(self): i = self.options.force_stats_on_levels - 1 while len(level_up_item_pool) > 0 and i < self.options.level_checks: self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) - i = i + 1 + i += 1 #Calculate prefilled locations and items if True: #Allow notepad++ to collpase this section From fac386b3823cbef0da838521186ebdec549f47eb Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:32:13 -0500 Subject: [PATCH 190/284] Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index c9f56cd6015e..a688f69b26f5 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -119,7 +119,7 @@ def create_items(self): continue if data.category == "Puppies": if self.options.puppies == "triplets" and "-" in name: - item_pool += [self.create_item(name) for _ in range(0, quantity)] + 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": From 83def3f1c7236a709f0315a0aa2ccc38ba16c7b9 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:33:00 -0500 Subject: [PATCH 191/284] Update worlds/kh1/Rules.py Co-authored-by: Scipio Wright --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index d5507d475114..0915c2d25b2e 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -35,7 +35,7 @@ def has_item(state: CollectionState, player: int, item: str) -> bool: return state.has(item, player) def has_at_least(state: CollectionState, player: int, item: str, x: int) -> bool: - return state.count(item, player) >= x + return state.has(item, player, x) def has_postcards(state: CollectionState, player: int, postcards_required: int) -> bool: postcards_available = 0 From ec738c48e7112ffc7e8fccb6942d44b9fa3356cb Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:35:50 -0500 Subject: [PATCH 192/284] Update worlds/kh1/Rules.py Co-authored-by: Scipio Wright --- worlds/kh1/Rules.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 0915c2d25b2e..5d071a6fc23d 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -2139,4 +2139,5 @@ def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_report multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") # Win condition. - multiworld.completion_condition[player] = lambda state: state.has_all({"Victory"}, player) \ No newline at end of file + multiworld.completion_condition[player] = lambda state: state.has("Victory", player) + \ No newline at end of file From 3085321a398a9d8028357dc345ae0a1173cb9b40 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:36:01 -0500 Subject: [PATCH 193/284] Update worlds/kh1/Client.py Co-authored-by: Scipio Wright --- worlds/kh1/Client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index d22503f53624..20a13f4661fc 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -188,7 +188,7 @@ class KH1Manager(GameManager): async def game_watcher(ctx: KH1Context): - from worlds.kh1.Locations import lookup_id_to_name + 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: From 84814594d5ab5e4880a7247e0a541dd66a04d5c2 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 7 Jul 2024 10:37:17 -0500 Subject: [PATCH 194/284] Fix grammar in document --- worlds/kh1/docs/en_Kingdom Hearts.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index dc7ad6797fbe..90c219f391f5 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -58,7 +58,7 @@ When the player receives an item, your client will display a message displaying Please reach out to Gicu#7034 on Discord. -## How do I progress a certain world? +## How do I progress a in certain world? ###The evidence boxes aren't spawning in Wonderland. @@ -72,10 +72,10 @@ Firstly, find `Entry Pass` in the multiworld. Additionally, `Phil Cup`, `Pegasu Find `Slides` in the multiworld. -###I can't progress Atlantica. +###I can't progress in Atlantica. Find `Crystal Trident` in the multiworld. -###I can't progress Halloween Town. +###I can't progress in Halloween Town. Find `Forget-Me-Not` and `Jack-in-the-Box` in the multiworld. From 3f4b569469711db287b5ad2697800ef9ac682f71 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 7 Jul 2024 10:39:31 -0500 Subject: [PATCH 195/284] Update __init__.py --- worlds/kh1/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index a688f69b26f5..13bbbcbb55bb 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -91,10 +91,10 @@ def create_items(self): level_up_locations = list(get_locations_by_category("Levels").keys()) self.random.shuffle(level_up_item_pool) - i = self.options.force_stats_on_levels - 1 + starting_level_for_stats_only = self.options.force_stats_on_levels - 1 while len(level_up_item_pool) > 0 and i < self.options.level_checks: - self.multiworld.get_location(level_up_locations[i], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) - i += 1 + self.multiworld.get_location(level_up_locations[starting_level_for_stats_only], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) + starting_level_for_stats_only += 1 #Calculate prefilled locations and items if True: #Allow notepad++ to collpase this section From a3cf066163cd16c0dc661d9b5559f681980ba521 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:42:34 -0500 Subject: [PATCH 196/284] Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright --- worlds/kh1/__init__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 13bbbcbb55bb..c85e3971e1b1 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -223,11 +223,9 @@ def get_filler_item_name(self) -> str: return self.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] def fill_slot_data(self) -> dict: - 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() - slot_data = {"xpmult": int(self.options.exp_multiplier)/16 - ,"required_reports_eotw": int(required_reports_eotw) - ,"required_reports_door": int(required_reports_door) + 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) From 9afaffe6473e943160eb625384032eecd5554d96 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 7 Jul 2024 10:43:30 -0500 Subject: [PATCH 197/284] Removed return type --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index c85e3971e1b1..37728f585cd0 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -278,7 +278,7 @@ def set_rules(self): def create_regions(self): create_regions(self.multiworld, self.player, self.options) - def get_numbers_of_reports_to_consider(self) -> int: + def get_numbers_of_reports_to_consider(self): numbers_to_consider = [] if self.options.end_of_the_world_unlock.current_key == "reports": numbers_to_consider.append(self.options.required_reports_eotw) From 7268c3871570455d9202f81c9052935033a3a364 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 7 Jul 2024 10:45:56 -0500 Subject: [PATCH 198/284] Update __init__.py --- worlds/kh1/__init__.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 37728f585cd0..bff656e054c0 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -226,12 +226,12 @@ 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) - ,"atlantica": bool(self.options.atlantica) - ,"goal": str(self.options.goal.current_key)} + "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), + "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, self.options.keyblade_max_str) max_str_bonus = max(self.options.keyblade_min_str, self.options.keyblade_max_str) @@ -278,7 +278,7 @@ def set_rules(self): def create_regions(self): create_regions(self.multiworld, self.player, self.options) - def get_numbers_of_reports_to_consider(self): + def get_numbers_of_reports_to_consider(self) -> List: numbers_to_consider = [] if self.options.end_of_the_world_unlock.current_key == "reports": numbers_to_consider.append(self.options.required_reports_eotw) @@ -289,21 +289,21 @@ def get_numbers_of_reports_to_consider(self): numbers_to_consider.sort() return numbers_to_consider - def determine_reports_in_pool(self): + def determine_reports_in_pool(self) -> int: numbers_to_consider = self.get_numbers_of_reports_to_consider() if len(numbers_to_consider) > 0: return max(numbers_to_consider) else: return 0 - def determine_reports_required_to_open_end_of_the_world(self): + def determine_reports_required_to_open_end_of_the_world(self) -> int: if self.options.end_of_the_world_unlock.current_key == "reports": numbers_to_consider = self.get_numbers_of_reports_to_consider() if len(numbers_to_consider) > 0: return numbers_to_consider[0] return 14 - def determine_reports_required_to_open_final_rest_door(self): + def determine_reports_required_to_open_final_rest_door(self) -> int: if self.options.final_rest_door.current_key == "reports": numbers_to_consider = self.get_numbers_of_reports_to_consider() if len(numbers_to_consider) == 3: From eabf376e3bffe218779d22aad3c6a69d89a36256 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 7 Jul 2024 10:48:31 -0500 Subject: [PATCH 199/284] Update __init__.py --- worlds/kh1/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index bff656e054c0..68ef718ebed1 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -281,11 +281,11 @@ def create_regions(self): def get_numbers_of_reports_to_consider(self) -> List: numbers_to_consider = [] if self.options.end_of_the_world_unlock.current_key == "reports": - numbers_to_consider.append(self.options.required_reports_eotw) + numbers_to_consider.append(self.options.required_reports_eotw.value) if self.options.final_rest_door.current_key == "reports": - numbers_to_consider.append(self.options.required_reports_door) + numbers_to_consider.append(self.options.required_reports_door.value) if self.options.final_rest_door.current_key == "reports" or self.options.end_of_the_world_unlock.current_key == "reports": - numbers_to_consider.append(self.options.reports_in_pool) + numbers_to_consider.append(self.options.reports_in_pool.value) numbers_to_consider.sort() return numbers_to_consider From fdecebd0e49df2f75fe6aaf737b57559707e57bd Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:49:15 -0500 Subject: [PATCH 200/284] Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright --- worlds/kh1/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 68ef718ebed1..70eff2e0bfed 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -310,4 +310,5 @@ def determine_reports_required_to_open_final_rest_door(self) -> int: return numbers_to_consider[1] elif len(numbers_to_consider) == 2: return numbers_to_consider[0] - return 14 \ No newline at end of file + return 14 + \ No newline at end of file From 2b690da1cd4f310d502c6ba0b5eb18d4974ef09e Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sun, 7 Jul 2024 12:01:27 -0500 Subject: [PATCH 201/284] Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 70eff2e0bfed..ca83fc1946da 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -278,7 +278,7 @@ def set_rules(self): def create_regions(self): create_regions(self.multiworld, self.player, self.options) - def get_numbers_of_reports_to_consider(self) -> List: + def get_numbers_of_reports_to_consider(self) -> List[int]: numbers_to_consider = [] if self.options.end_of_the_world_unlock.current_key == "reports": numbers_to_consider.append(self.options.required_reports_eotw.value) From bdd00125d9fcfe0b449f5855c332b12f04eb7958 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 7 Jul 2024 12:10:21 -0500 Subject: [PATCH 202/284] Update __init__.py --- worlds/kh1/__init__.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index ca83fc1946da..b520484a2702 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -70,19 +70,19 @@ def create_items(self): # Fill pool with mandatory items for _ in range(self.options.item_slot_increase): level_up_item_pool.append("Item Slot Increase") - for i in range(self.options.accessory_slot_increase): + for _ in range(self.options.accessory_slot_increase): level_up_item_pool.append("Accessory Slot Increase") # Create other pool - for i in range(self.options.strength_increase): + for _ in range(self.options.strength_increase): possible_level_up_item_pool.append("Strength Increase") - for i in range(self.options.defense_increase): + for _ in range(self.options.defense_increase): possible_level_up_item_pool.append("Defense Increase") - for i in range(self.options.hp_increase): + for _ in range(self.options.hp_increase): possible_level_up_item_pool.append("Max HP Increase") - for i in range(self.options.mp_increase): + for _ in range(self.options.mp_increase): possible_level_up_item_pool.append("Max MP Increase") - for i in range(self.options.ap_increase): + for _ in range(self.options.ap_increase): possible_level_up_item_pool.append("Max AP Increase") # Fill remaining pool with items from other pool From 35993e63aa17f745fd5fde343d5dc947ee3d36b9 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 7 Jul 2024 13:09:27 -0500 Subject: [PATCH 203/284] Fix missing i replacement, rework set rules to use "self" instead of a million arguments --- worlds/kh1/Rules.py | 9 ++++++++- worlds/kh1/__init__.py | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 5d071a6fc23d..60a3a2a3c473 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -116,7 +116,14 @@ def has_oogie_manor(state: CollectionState, player: int, advanced_logic: bool) - or (advanced_logic and has_item(state, player, "High Jump") and can_glide(state, player)) ) -def set_rules(multiworld: MultiWorld, player: int, options, eotw_required_reports: int, final_rest_door_required_reports: int, final_rest_door_requirement: str): +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 + #Location rules. #Keys #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index b520484a2702..3be3bd631398 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -92,7 +92,7 @@ def create_items(self): level_up_locations = list(get_locations_by_category("Levels").keys()) self.random.shuffle(level_up_item_pool) starting_level_for_stats_only = self.options.force_stats_on_levels - 1 - while len(level_up_item_pool) > 0 and i < self.options.level_checks: + while len(level_up_item_pool) > 0 and starting_level_for_stats_only < self.options.level_checks: self.multiworld.get_location(level_up_locations[starting_level_for_stats_only], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) starting_level_for_stats_only += 1 @@ -273,7 +273,7 @@ def create_event(self, name: str) -> KH1Item: return KH1Item(name, data.classification, data.code, self.player) def set_rules(self): - set_rules(self.multiworld, self.player, self.options, self.determine_reports_required_to_open_end_of_the_world(), self.determine_reports_required_to_open_final_rest_door(), self.options.final_rest_door.current_key) + set_rules(self) def create_regions(self): create_regions(self.multiworld, self.player, self.options) From 729775bd87287879c88cb9c98d1921b1a6f1d1be Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sat, 27 Jul 2024 12:23:37 -0500 Subject: [PATCH 204/284] Update KH1Client.py Co-authored-by: Doug Hoskisson --- KH1Client.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/KH1Client.py b/KH1Client.py index ff00c6b77ba4..4c3ed501901b 100644 --- a/KH1Client.py +++ b/KH1Client.py @@ -1,8 +1,9 @@ -import ModuleUpdate -import Utils -from worlds.kh1.Client import launch -ModuleUpdate.update() - if __name__ == '__main__': + import ModuleUpdate + ModuleUpdate.update() + + import Utils Utils.init_logging("KH1Client", exception_logger="Client") + + from worlds.kh1.Client import launch launch() From be9a53826516ffff3d6d5916ef7aab9f24b57a56 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 27 Jul 2024 13:10:31 -0500 Subject: [PATCH 205/284] Reformat rules, fix bug with exp mult, add to readme --- README.md | 1 + worlds/kh1/Options.py | 4 +- worlds/kh1/Rules.py | 3365 ++++++++++++++++++++--------------------- 3 files changed, 1647 insertions(+), 1723 deletions(-) diff --git a/README.md b/README.md index cebd4f7e7529..75dc568cdff5 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,7 @@ Currently, the following games are supported: * Aquaria * Yu-Gi-Oh! Ultimate Masters: World Championship Tournament 2006 * A Hat in Time +* Kingdom Hearts 1 For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index bfb0357f1cce..60607b65ae1e 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -173,8 +173,8 @@ class EXPMultiplier(NamedRange): range_start = default / 4 range_end = 128 special_range_names = { - "0.25x": default / 4, - "0.5x": default / 2, + "0.25x": int(default / 4), + "0.5x": int(default / 2), "1x": default, "2x": default * 2, "3x": default * 3, diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 60a3a2a3c473..101924e1ddcc 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,5 +1,16 @@ from BaseClasses import CollectionState, MultiWorld +SINGLE_PUPPIES = [] +for i in range(1,100): + SINGLE_PUPPIES.append("Puppy " + str(i).rjust(2,"0")) + +TRIPLE_PUPPIES = [] +for i in range(1,34): + TRIPLE_PUPPIES.append("Puppies " + str(3*(i-1)+1).rjust(2, "0") + "-" + str(3*(i-1)+3).rjust(2, "0")) + +TORN_PAGES = [] +for i in range(1,6): + TORN_PAGES.append("Torn Page " + str(i)) def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keyblades_unlock_chests: bool) -> bool: worlds_acquired = 0.0 @@ -16,7 +27,7 @@ def has_slides(state: CollectionState, player: int) -> bool: return state.has("Slides", player) def has_evidence(state: CollectionState, player: int) -> bool: - return state.has("Footprints", player) #or state.has("Stench", player) or state.has("Claw Marks", player) or state.has("Antenna", player) + return state.has("Footprints", player) def can_glide(state: CollectionState, player: int) -> bool: return state.has("Progressive Glide", player) or state.has("Superglide", player) @@ -29,7 +40,7 @@ def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bo and state.has("Emblem Piece (Fountain)", player) and state.has("Hollow Bastion", player) and has_x_worlds(state, player, 5, keyblades_unlock_chests) - ) + ) def has_item(state: CollectionState, player: int, item: str) -> bool: return state.has(item, player) @@ -38,42 +49,32 @@ def has_at_least(state: CollectionState, player: int, item: str, x: int) -> bool return state.has(item, player, x) def has_postcards(state: CollectionState, player: int, postcards_required: int) -> bool: - postcards_available = 0 - postcards_available = postcards_available + state.count("Postcard", player) - return postcards_available >= postcards_required + return state.has("Postcard", player, postcards_required) def has_puppies(state: CollectionState, player: int, puppies_required: int) -> bool: - puppies_available = 0 - for i in range(1,100): - if state.has("Puppy " + str(i).rjust(2,"0"), player): - puppies_available = puppies_available + 1 - for i in range(1,34): - if state.has("Puppies " + str(3*(i-1)+1).rjust(2, "0") + "-" + str(3*(i-1)+3).rjust(2, "0"), player): - puppies_available = puppies_available + 3 - if state.has("All Puppies", player): - puppies_available = puppies_available + 99 - return puppies_available >= puppies_required + puppies_available = state.count_from_list(SINGLE_PUPPIES, player) + puppies_available = puppies_available + (state.count_from_list(TRIPLE_PUPPIES, player) * 3) + return (puppies_available >= puppies_required) or state.has("All Puppies", player) def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> bool: - pages_available = 0 - pages_available = pages_available + state.count("Torn Page 1", player) - pages_available = pages_available + state.count("Torn Page 2", player) - pages_available = pages_available + state.count("Torn Page 3", player) - pages_available = pages_available + state.count("Torn Page 4", player) - pages_available = pages_available + state.count("Torn Page 5", player) - return pages_available >= pages_required + return state.count_from_list(TORN_PAGES, player) >= pages_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) def has_all_summons(state: CollectionState, player: int) -> bool: - return state.has("Simba", player) and state.has("Bambi", player) and state.has("Genie", player) \ - and state.has("Dumbo", player) and state.has("Mushu", player) and state.has("Tinker Bell", player) + return state.has_all({"Simba", "Bambi", "Genie", "Dumbo", "Mushu", "Tinker Bell"}, player) def has_all_magic_lvx(state: CollectionState, player: int, level) -> bool: - return state.count("Progressive Fire", player) >= level and state.count("Progressive Blizzard", player) >= level and state.count("Progressive Thunder", player) >= level \ - and state.count("Progressive Cure", player) >= level and state.count("Progressive Gravity", player) >= level and state.count("Progressive Aero", player) >= level \ - and state.count("Progressive Stop", player) >= level + return ( + state.count("Progressive Fire", player) >= level + and state.count("Progressive Blizzard", player) >= level + and state.count("Progressive Thunder", player) >= level + and state.count("Progressive Cure", player) >= level + and state.count("Progressive Gravity", player) >= level + and state.count("Progressive Aero", player) >= level + and state.count("Progressive Stop", player) >= level + ) def has_offensive_magic(state: CollectionState, player: int) -> bool: return state.has_any({"Progressive Fire", "Progressive Blizzard", "Progressive Thunder", "Progressive Gravity", "Progressive Stop"}, player) @@ -90,15 +91,26 @@ def has_final_rest_door(state: CollectionState, player:int, final_rest_door_requ return has_postcards(state, 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) - ) + 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: - return (state.count("Progressive Cure", player) >= 2 and state.has("Leaf Bracer", player) and state.has("Dodge Roll", player)) and (state.has("Second Chance", player) or state.has("MP Rage", player) or state.count("Progressive Aero", player) >= 2) + return ( + ( + state.count("Progressive Cure", player) >= 2 + and state.has("Leaf Bracer", player) + and state.has("Dodge Roll", player) + ) + and ( + state.has("Second Chance", player) + or state.has("MP Rage", player) + or state.count("Progressive Aero", player) >= 2 + ) + ) def has_keyblade(state: CollectionState, player: int, keyblade_required: bool, item: str) -> bool: if keyblade_required: @@ -107,7 +119,10 @@ def has_keyblade(state: CollectionState, player: int, keyblade_required: bool, i return True def can_dumbo_skip(state: CollectionState, player: int) -> bool: - return state.has("Dumbo", player) and state.has_any({"Progressive Fire", "Progressive Blizzard", "Progressive Thunder", "Progressive Cure", "Progressive Gravity", "Progressive Stop", "Progressive Aero"}, player) + return ( + state.has("Dumbo", player) + and state.has_group("Magic", player, 1) + ) def has_oogie_manor(state: CollectionState, player: int, advanced_logic: bool) -> bool: return ( @@ -124,2014 +139,1924 @@ def set_rules(kh1world): 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 - #Location rules. - #Keys - #multiworld.get_location("Destiny Islands Chest" , player).access_rule = lambda state: has_item(state, player, "") multiworld.get_location("Traverse Town 1st District Candle Puzzle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and has_item(state, player, "Progressive Blizzard") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and has_item(state, player, "Progressive Blizzard") + ) multiworld.get_location("Traverse Town 1st District Accessory Shop Roof Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town 2nd District Rooftop Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town 2nd District Gizmo Shop Facade Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town Alleyway Balcony Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town Alleyway Blue Room Awning Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town Alleyway Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town Green Room Clock Puzzle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town Green Room Table Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town Red Room Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town Mystical House Yellow Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and has_item(state, player, "Progressive Fire") - and - ( - has_item(state, player, "Yellow Trinity") - or (options.advanced_logic and has_item(state, player, "High Jump")) - or has_at_least(state, player, "High Jump", 2) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and has_item(state, player, "Progressive Fire") + and + ( + has_item(state, player, "Yellow Trinity") + or (options.advanced_logic and has_item(state, player, "High Jump")) + or has_at_least(state, player, "High Jump", 2) + ) + ) multiworld.get_location("Traverse Town Accessory Shop Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and has_item(state, player, "White Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and has_item(state, player, "White Trinity") + ) multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and has_item(state, player, "Monstro") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and - ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and - ( - (has_item(state, player, "Blue Trinity") and can_glide(state, player)) - or (options.advanced_logic and can_glide(state, player)) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and + ( + (has_item(state, player, "Blue Trinity") and can_glide(state, player)) + or (options.advanced_logic and can_glide(state, player)) + ) + ) multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and - ( - can_glide(state, player) - or - ( - options.advanced_logic - and - ( - (has_item(state, player, "High Jump") and has_item(state, player, "Yellow Trinity")) - or has_at_least(state, player, "High Jump", 2) - ) - and has_item(state, player, "Combo Master") - ) - or - ( - options.advanced_logic - and has_item(state, player, "Mermaid Kick") - ) - ) - and has_item(state, player, "Progressive Fire") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and + ( + can_glide(state, player) + or + ( + options.advanced_logic + and + ( + (has_item(state, player, "High Jump") and has_item(state, player, "Yellow Trinity")) + or has_at_least(state, player, "High Jump", 2) + ) + and has_item(state, player, "Combo Master") + ) + or + ( + options.advanced_logic + and has_item(state, player, "Mermaid Kick") + ) + ) + and has_item(state, player, "Progressive Fire") + ) multiworld.get_location("Traverse Town Alleyway Behind Crates Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and has_item(state, player, "Red Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and has_item(state, player, "Red Trinity") + ) multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and - ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") + ) multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_item(state, player, "Green Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_item(state, player, "Green Trinity") + ) multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 1 Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + ) multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 2 Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + ) multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) + ) multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_item(state, player, "Green Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_item(state, player, "Green Trinity") + ) multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - has_evidence(state, player) - or has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + has_evidence(state, player) + or has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - has_evidence(state, player) - or has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + has_evidence(state, player) + or has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - has_evidence(state, player) - or has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + has_evidence(state, player) + or has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) multiworld.get_location("Wonderland Lotus Forest Thunder Plant Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_item(state, player, "Progressive Thunder") - and has_evidence(state, player) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_item(state, player, "Progressive Thunder") + and has_evidence(state, player) + ) multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_item(state, player, "Progressive Thunder") - and has_evidence(state, player) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_item(state, player, "Progressive Thunder") + and has_evidence(state, player) + ) multiworld.get_location("Wonderland Lotus Forest Glide Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - can_glide(state, player) - or - ( - options.advanced_logic - and (has_item(state, player, "High Jump") or can_dumbo_skip(state, player)) - and has_evidence(state, player) - ) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + can_glide(state, player) + or + ( + options.advanced_logic + and (has_item(state, player, "High Jump") or can_dumbo_skip(state, player)) + and has_evidence(state, player) + ) + ) + ) multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + ) multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - or options.advanced_logic - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + or options.advanced_logic + ) + ) multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_evidence(state, player) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_evidence(state, player) + ) multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - can_glide(state, player) - or - ( - options.advanced_logic - and has_item(state, player, "High Jump") - and has_evidence(state, player) - ) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + can_glide(state, player) + or + ( + options.advanced_logic + and has_item(state, player, "High Jump") + and has_evidence(state, player) + ) + ) + ) multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - can_glide(state, player) - or - ( - options.advanced_logic - and has_item(state, player, "High Jump") - and has_evidence(state, player) - ) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + can_glide(state, player) + or + ( + options.advanced_logic + and has_item(state, player, "High Jump") + and has_evidence(state, player) + ) + ) + ) multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - has_evidence(state, player) - or (options.advanced_logic and can_glide(state, player)) - or has_at_least(state, player, "High Jump", 2) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + has_evidence(state, player) + or (options.advanced_logic and can_glide(state, player)) + or has_at_least(state, player, "High Jump", 2) + ) + ) multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - can_glide(state, player) - or - ( - has_at_least(state, player, "High Jump", 3) - and has_evidence(state, player) - ) - or - ( - options.advanced_logic - and has_item(state, player, "High Jump") - and has_evidence(state, player) - and has_item(state, player, "Combo Master") - ) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and + ( + can_glide(state, player) + or + ( + has_at_least(state, player, "High Jump", 3) + and has_evidence(state, player) + ) + or + ( + options.advanced_logic + and has_item(state, player, "High Jump") + and has_evidence(state, player) + and has_item(state, player, "Combo Master") + ) + ) + ) multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_item(state, player, "White Trinity") - and has_evidence(state, player) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and has_item(state, player, "White Trinity") + and has_evidence(state, player) + ) multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) multiworld.get_location("Deep Jungle Hippo's Lagoon Center Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) multiworld.get_location("Deep Jungle Hippo's Lagoon Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) multiworld.get_location("Deep Jungle Hippo's Lagoon Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - or options.advanced_logic - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or options.advanced_logic + ) + ) multiworld.get_location("Deep Jungle Vines Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) multiworld.get_location("Deep Jungle Vines 2 Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) multiworld.get_location("Deep Jungle Climbing Trees Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_item(state, player, "Blue Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_item(state, player, "Blue Trinity") + ) multiworld.get_location("Deep Jungle Tunnel Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) multiworld.get_location("Deep Jungle Cavern of Hearts White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_item(state, player, "White Trinity") - and has_slides(state, player) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_item(state, player, "White Trinity") + and has_slides(state, player) + ) multiworld.get_location("Deep Jungle Camp Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_item(state, player, "Blue Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_item(state, player, "Blue Trinity") + ) multiworld.get_location("Deep Jungle Tent Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) multiworld.get_location("Deep Jungle Waterfall Cavern Low Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_slides(state, player) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_slides(state, player) + ) multiworld.get_location("Deep Jungle Waterfall Cavern Middle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_slides(state, player) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_slides(state, player) + ) multiworld.get_location("Deep Jungle Waterfall Cavern High Wall Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_slides(state, player) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_slides(state, player) + ) multiworld.get_location("Deep Jungle Waterfall Cavern High Middle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_slides(state, player) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and has_slides(state, player) + ) multiworld.get_location("Deep Jungle Cliff Right Cliff Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) multiworld.get_location("Deep Jungle Cliff Right Cliff Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + ) multiworld.get_location("Deep Jungle Tree House Suspended Boat Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and - ( - can_glide(state, player) - or options.advanced_logic - ) - ) - if options.hundred_acre_wood: - multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and + ( + can_glide(state, player) + or options.advanced_logic + ) + ) multiworld.get_location("Agrabah Plaza By Storage Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Plaza Raised Terrace Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Plaza Top Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Alley Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Bazaar Across Windows Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Bazaar High Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Main Street Right Palace Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Main Street High Above Alley Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - or (options.advanced_logic and can_dumbo_skip(state, player)) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or (options.advanced_logic and can_dumbo_skip(state, player)) + ) + ) multiworld.get_location("Agrabah Palace Gates Low Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Palace Gates High Opposite Palace Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - has_item(state, player, "High Jump") - or options.advanced_logic - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) multiworld.get_location("Agrabah Palace Gates High Close to Palace Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - ( - has_item(state, player, "High Jump") - and can_glide(state, player) - or - ( - options.advanced_logic - and - ( - has_item(state, player, "Combo Master") - or can_dumbo_skip(state, player) - ) - ) - ) - or has_at_least(state, player, "High Jump", 3) - or (options.advanced_logic and can_glide(state, player)) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + ( + has_item(state, player, "High Jump") + and can_glide(state, player) + or + ( + options.advanced_logic + and + ( + has_item(state, player, "Combo Master") + or can_dumbo_skip(state, player) + ) + ) + ) + or has_at_least(state, player, "High Jump", 3) + or (options.advanced_logic and can_glide(state, player)) + ) + ) multiworld.get_location("Agrabah Storage Green Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and has_item(state, player, "Green Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and has_item(state, player, "Green Trinity") + ) multiworld.get_location("Agrabah Storage Behind Barrel Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Entrance Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - can_glide(state, player) - or (options.advanced_logic and has_item(state, player, "Combo Master")) - or (options.advanced_logic and can_dumbo_skip(state, player)) - or has_at_least(state, player, "High Jump", 2) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + can_glide(state, player) + or (options.advanced_logic and has_item(state, player, "Combo Master")) + or (options.advanced_logic and can_dumbo_skip(state, player)) + or has_at_least(state, player, "High Jump", 2) + ) + ) multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - or options.advanced_logic - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or options.advanced_logic + ) + ) multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Treasure Room Above Fire Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Relic Chamber Stairs Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest", player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Bridge Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and has_item(state, player, "Blue Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and has_item(state, player, "Blue Trinity") + ) multiworld.get_location("Agrabah Cave of Wonders Hidden Room Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - has_item(state, player, "Yellow Trinity") - or has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + has_item(state, player, "Yellow Trinity") + or has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) multiworld.get_location("Agrabah Cave of Wonders Hidden Room Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - has_item(state, player, "Yellow Trinity") - or has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and + ( + has_item(state, player, "Yellow Trinity") + or has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) multiworld.get_location("Agrabah Aladdin's House Main Street Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Aladdin's House Plaza Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + ) multiworld.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and has_item(state, player, "White Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and has_item(state, player, "White Trinity") + ) multiworld.get_location("Monstro Chamber 6 Other Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and has_item(state, player, "Combo Master")) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and has_item(state, player, "Combo Master")) + ) + ) multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - has_item(state, player, "High Jump") - or options.advanced_logic - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and has_item(state, player, "Combo Master")) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and has_item(state, player, "Combo Master")) + ) + ) multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - if options.atlantica: - multiworld.get_location("Atlantica Sunken Ship In Flipped Boat Chest" , player).access_rule = lambda state: ( - True - ) - multiworld.get_location("Atlantica Sunken Ship Seabed Chest" , player).access_rule = lambda state: ( - True - ) - multiworld.get_location("Atlantica Sunken Ship Inside Ship Chest" , player).access_rule = lambda state: ( - True - ) - multiworld.get_location("Atlantica Ariel's Grotto High Chest" , player).access_rule = lambda state: ( - True - ) - multiworld.get_location("Atlantica Ariel's Grotto Middle Chest" , player).access_rule = lambda state: ( - True - ) - multiworld.get_location("Atlantica Ariel's Grotto Low Chest" , player).access_rule = lambda state: ( - True - ) - multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Fire") - and has_item(state, player, "Crystal Trident") - ) - multiworld.get_location("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest" , player).access_rule = lambda state: ( - True - ) - multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: ( - has_item(state, player, "White Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "White Trinity") - and has_item(state, player, "Forget-Me-Not") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "White Trinity") + and has_item(state, player, "Forget-Me-Not") + ) multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + ) multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Forget-Me-Not") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Forget-Me-Not") + ) multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and - ( - can_glide(state, player) - or options.advanced_logic - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and + ( + can_glide(state, player) + or options.advanced_logic + ) + ) multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_oogie_manor(state, player, options) + ) multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options.advanced_logic) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_oogie_manor(state, player, options.advanced_logic) + ) multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options.advanced_logic) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_oogie_manor(state, player, options.advanced_logic) + ) multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options.advanced_logic) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_oogie_manor(state, player, options.advanced_logic) + ) multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options.advanced_logic) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_oogie_manor(state, player, options.advanced_logic) + ) multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options.advanced_logic) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_oogie_manor(state, player, options.advanced_logic) + ) multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_item(state, player, "Red Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_item(state, player, "Red Trinity") + ) multiworld.get_location("Halloween Town Guillotine Square High Tower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_dumbo_skip(state, player)) - or (options.advanced_logic and can_glide(state, player)) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_dumbo_skip(state, player)) + or (options.advanced_logic and can_glide(state, player)) + ) + ) multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - and - ( - can_glide(state, player) - or (options.advanced_logic and has_item(state, player, "Combo Master")) - or has_at_least(state, player, "High Jump", 2) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and + ( + can_glide(state, player) + or (options.advanced_logic and has_item(state, player, "Combo Master")) + or has_at_least(state, player, "High Jump", 2) + ) + ) multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + ) multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + ) multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and - ( - can_glide(state, player) - or has_item(state, player, "High Jump") - or options.advanced_logic - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and + ( + can_glide(state, player) + or has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options.advanced_logic) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_oogie_manor(state, player, options.advanced_logic) + ) multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + ) multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - and - ( - can_glide(state, player) - or (options.advanced_logic and has_item(state, player, "Combo Master")) - or has_at_least(state, player, "High Jump", 2) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and + ( + can_glide(state, player) + or (options.advanced_logic and has_item(state, player, "Combo Master")) + or has_at_least(state, player, "High Jump", 2) + ) + ) multiworld.get_location("Olympus Coliseum Coliseum Gates Left Behind Columns Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + ) multiworld.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and has_item(state, player, "Blue Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and has_item(state, player, "Blue Trinity") + ) multiworld.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and has_item(state, player, "Blue Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and has_item(state, player, "Blue Trinity") + ) multiworld.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and has_item(state, player, "White Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and has_item(state, player, "White Trinity") + ) multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and has_at_least(state, player, "Progressive Blizzard", 2) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and has_at_least(state, player, "Progressive Blizzard", 2) + ) multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzaga Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and has_at_least(state, player, "Progressive Blizzard", 3) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and has_at_least(state, player, "Progressive Blizzard", 3) + ) multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - and has_item(state, player, "Green Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + and has_item(state, player, "Green Trinity") + ) multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) multiworld.get_location("Monstro Chamber 2 Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and has_item(state, player, "High Jump") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and has_item(state, player, "High Jump") + ) multiworld.get_location("Monstro Chamber 3 Ground Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - has_item(state, player, "High Jump") - or options.advanced_logic - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) multiworld.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - has_item(state, player, "High Jump") - or options.advanced_logic - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - has_item(state, player, "High Jump") - or options.advanced_logic - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and + ( + has_item(state, player, "High Jump") + or options.advanced_logic + ) + ) multiworld.get_location("Monstro Chamber 5 Low 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) multiworld.get_location("Monstro Chamber 5 Low 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + ) multiworld.get_location("Neverland Pirate Ship Deck White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "White Trinity") - and has_item(state, player, "Green Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "White Trinity") + and has_item(state, player, "Green Trinity") + ) multiworld.get_location("Neverland Pirate Ship Crows Nest Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Green Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Green Trinity") + ) multiworld.get_location("Neverland Hold Yellow Trinity Right Blue Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Yellow Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Yellow Trinity") + ) multiworld.get_location("Neverland Hold Yellow Trinity Left Blue Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Yellow Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Yellow Trinity") + ) multiworld.get_location("Neverland Galley Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + ) multiworld.get_location("Neverland Cabin Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Green Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Green Trinity") + ) multiworld.get_location("Neverland Hold Flight 1st Chest " , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and - ( - has_item(state, player, "Green Trinity") - or can_glide(state, player) - or has_at_least(state, player, "High Jump", 3) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and + ( + has_item(state, player, "Green Trinity") + or can_glide(state, player) + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Neverland Clock Tower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + ) multiworld.get_location("Neverland Hold Flight 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and - ( - has_item(state, player, "Green Trinity") - or can_glide(state, player) - or has_at_least(state, player, "High Jump", 3) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and + ( + has_item(state, player, "Green Trinity") + or can_glide(state, player) + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Neverland Hold Yellow Trinity Green Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Yellow Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Yellow Trinity") + ) multiworld.get_location("Neverland Captain's Cabin Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Green Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and has_item(state, player, "Green Trinity") + ) multiworld.get_location("Hollow Bastion Rising Falls Water's Surface Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) multiworld.get_location("Hollow Bastion Rising Falls Under Water 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - or has_item(state, player, "Progressive Blizzard") - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or has_item(state, player, "Progressive Blizzard") + ) + ) multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - or has_item(state, player, "Progressive Blizzard") - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or has_item(state, player, "Progressive Blizzard") + ) + ) multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - can_glide(state, player) - or has_item(state, player, "Progressive Blizzard") - or (options.advanced_logic and has_item(state, player, "Combo Master")) - ) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + can_glide(state, player) + or has_item(state, player, "Progressive Blizzard") + or (options.advanced_logic and has_item(state, player, "Combo Master")) + ) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") - and - ( - has_emblems(state, player, options.keyblades_unlock_chests) - or (options.advanced_logic and has_at_least(state, player, "High Jump", 2) and can_glide(state,player)) - or (options.advanced_logic and can_dumbo_skip(state, player) and can_glide(state,player)) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + and + ( + has_emblems(state, player, options.keyblades_unlock_chests) + or (options.advanced_logic and has_at_least(state, player, "High Jump", 2) and can_glide(state,player)) + or (options.advanced_logic and can_dumbo_skip(state, player) and can_glide(state,player)) + ) + ) multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - has_emblems(state, player, options.keyblades_unlock_chests) - or has_at_least(state, player, "High Jump", 2) - or (options.advanced_logic and can_dumbo_skip(state, player)) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + has_emblems(state, player, options.keyblades_unlock_chests) + or has_at_least(state, player, "High Jump", 2) + or (options.advanced_logic and can_dumbo_skip(state, player)) + ) + ) multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - has_emblems(state, player, options.keyblades_unlock_chests) - or has_at_least(state, player, "High Jump", 2) - or (options.advanced_logic and can_dumbo_skip(state, player)) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + has_emblems(state, player, options.keyblades_unlock_chests) + or has_at_least(state, player, "High Jump", 2) + or (options.advanced_logic and can_dumbo_skip(state, player)) + ) + ) multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - #multiworld.get_location("Hollow Bastion Library 1st Floor Turn the Carousel Chest" , player).access_rule = lambda state: () - #multiworld.get_location("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest" , player).access_rule = lambda state: () - #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest" , player).access_rule = lambda state: () - #multiworld.get_location("Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest" , player).access_rule = lambda state: () + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + ) multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - and can_glide(state, player) - and has_item(state, player, "Progressive Gravity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player, options.keyblades_unlock_chests) + and can_glide(state, player) + and has_item(state, player, "Progressive Gravity") + ) multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + ) multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "Progressive Gravity") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) multiworld.get_location("Hollow Bastion Base Level Platform Near Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) multiworld.get_location("Hollow Bastion Base Level Near Crystal Switch Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) multiworld.get_location("Hollow Bastion Waterway Near Save Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) multiworld.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - (has_item(state, player, "Progressive Blizzard") and has_item(state, player, "High Jump")) - or has_at_least(state, player, "High Jump", 3) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + (has_item(state, player, "Progressive Blizzard") and has_item(state, player, "High Jump")) + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) multiworld.get_location("Hollow Bastion Dungeon By Candles Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) multiworld.get_location("Hollow Bastion Dungeon Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + ) multiworld.get_location("Hollow Bastion Grand Hall Steps Right Side Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Grand Hall Oblivion Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Grand Hall Left of Gate Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - #multiworld.get_location("Hollow Bastion Entrance Hall Push the Statue Chest" , player).access_rule = lambda state: () + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - has_item(state, player, "High Jump") - or - ( - options.advanced_logic - and can_dumbo_skip(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and + ( + has_item(state, player, "High Jump") + or + ( + options.advanced_logic + and can_dumbo_skip(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) + ) + ) multiworld.get_location("Hollow Bastion Rising Falls White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "White Trinity") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_item(state, player, "White Trinity") + ) multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Final Dimension 3rd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Final Dimension 4th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Final Dimension 5th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Final Dimension 6th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Final Dimension 10th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Final Dimension 9th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Giant Crevasse 5th Chest" , player).access_rule = lambda state: ( - has_item(state, player, "High Jump") or can_glide(state, player) - and has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_item(state, player, "High Jump") or can_glide(state, player) + and has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - and - ( - ( - options.advanced_logic - and has_item(state, player, "High Jump") - and has_item(state, player, "Combo Master") - ) - or can_glide(state, player) - ) - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + and + ( + ( + options.advanced_logic + and has_item(state, player, "High Jump") + and has_item(state, player, "Combo Master") + ) + or can_glide(state, player) + ) + ) multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World World Terminus Traverse Town Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World World Terminus Wonderland Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World World Terminus Olympus Coliseum Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World World Terminus Deep Jungle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World World Terminus Agrabah Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - and - ( - has_item(state, player, "High Jump") - or - ( - options.advanced_logic - and can_dumbo_skip(state, player) - and can_glide(state, player) - ) - ) - ) - multiworld.get_location("End of the World World Terminus Atlantica Chest" , player).access_rule = lambda state: ( - True - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + and + ( + has_item(state, player, "High Jump") + or + ( + options.advanced_logic + and can_dumbo_skip(state, player) + and can_glide(state, player) + ) + ) + ) multiworld.get_location("End of the World World Terminus Halloween Town Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World World Terminus Neverland Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World World Terminus 100 Acre Wood Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World World Terminus Hollow Bastion Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("End of the World Final Rest Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + ) multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and has_item(state, player, "White Trinity") - ) - #multiworld.get_location("Awakening Chest" , player).access_rule = lambda state: has_item(state, player, "") - - #multiworld.get_location("Traverse Town Defeat Guard Armor Dodge Roll Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Defeat Guard Armor Fire Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Defeat Guard Armor Blue Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town Leon Secret Waterway Earthshine Event" , player).access_rule = lambda state: has_item(state, player, "") + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and has_item(state, player, "White Trinity") + ) multiworld.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and has_item(state, player,"Hollow Bastion") - and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) - ) - #multiworld.get_location("Traverse Town Defeat Guard Armor Brave Warrior Event" , player).access_rule = lambda state: has_item(state, player, "") + has_emblems(state, player, options.keyblades_unlock_chests) + and has_item(state, player,"Hollow Bastion") + and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) + ) multiworld.get_location("Deep Jungle Defeat Sabor White Fang Event" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Defeat Clayton Cure Event" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Seal Keyhole Jungle King Event" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Seal Keyhole Red Trinity Event" , player).access_rule = lambda state: ( - has_slides(state, player) - ) - #multiworld.get_location("Olympus Coliseum Clear Phil's Training Thunder Event" , player).access_rule = lambda state: has_item(state, player, "") + has_slides(state, player) + ) multiworld.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event" , player).access_rule = lambda state: ( - has_item(state, player, "Entry Pass") - ) + has_item(state, player, "Entry Pass") + ) multiworld.get_location("Olympus Coliseum Cloud Sonic Blade Event" , player).access_rule = lambda state: ( - has_item(state, player, "Entry Pass") - ) + has_item(state, player, "Entry Pass") + ) multiworld.get_location("Wonderland Defeat Trickmaster Blizzard Event" , player).access_rule = lambda state: ( - has_evidence(state, player) - ) + has_evidence(state, player) + ) multiworld.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event" , player).access_rule = lambda state: ( - has_evidence(state, player) - ) - #multiworld.get_location("Agrabah Defeat Pot Centipede Ray of Light Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Defeat Jafar Blizzard Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Defeat Jafar Genie Fire Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Seal Keyhole Genie Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Seal Keyhole Three Wishes Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Agrabah Seal Keyhole Green Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Monstro Defeat Parasite Cage I Goofy Cheer Event" , player).access_rule = lambda state: has_item(state, player, "") + has_evidence(state, player) + ) multiworld.get_location("Monstro Defeat Parasite Cage II Stop Event" , player).access_rule = lambda state: ( - has_item(state, player, "High Jump") - or - ( - options.advanced_logic - and can_glide(state, player) - ) - ) - if options.atlantica: - multiworld.get_location("Atlantica Defeat Ursula I Mermaid Kick Event" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") - and has_offensive_magic(state, player) - and has_item(state, player, "Crystal Trident") - ) - multiworld.get_location("Atlantica Defeat Ursula II Thunder Event" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") - and has_item(state, player, "Mermaid Kick") - and has_offensive_magic(state, player) - and has_item(state, player, "Crystal Trident") - ) - multiworld.get_location("Atlantica Seal Keyhole Crabclaw Event" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") - and has_item(state, player, "Mermaid Kick") - and has_offensive_magic(state, player) - and has_item(state, player, "Crystal Trident") - ) + has_item(state, player, "High Jump") + or + ( + options.advanced_logic + and can_glide(state, player) + ) + ) multiworld.get_location("Halloween Town Defeat Oogie Boogie Holy Circlet Event" , player).access_rule = lambda state: ( - has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options.advanced_logic) - ) + has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_oogie_manor(state, player, options.advanced_logic) + ) multiworld.get_location("Halloween Town Defeat Oogie's Manor Gravity Event" , player).access_rule = lambda state: ( - has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options.advanced_logic) - ) + has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_oogie_manor(state, player, options.advanced_logic) + ) multiworld.get_location("Halloween Town Seal Keyhole Pumpkinhead Event" , player).access_rule = lambda state: ( - has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options.advanced_logic) - ) + has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_oogie_manor(state, player, options.advanced_logic) + ) multiworld.get_location("Neverland Defeat Anti Sora Raven's Claw Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - ) + has_item(state, player, "Green Trinity") + ) multiworld.get_location("Neverland Encounter Hook Cure Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - ) + has_item(state, player, "Green Trinity") + ) multiworld.get_location("Neverland Seal Keyhole Fairy Harp Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - ) + has_item(state, player, "Green Trinity") + ) multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - ) + has_item(state, player, "Green Trinity") + ) multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - ) - if options.super_bosses: - multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + ) multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - ) - #multiworld.get_location("Hollow Bastion Defeat Riku I White Trinity Event" , player).access_rule = lambda state: has_item(state, player, "") + has_item(state, player, "Green Trinity") + ) multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Defeat Riku II Ragnarok Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Defeat Behemoth Omega Arts Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Speak to Princesses Fire Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - #multiworld.get_location("End of the World Defeat Chernabog Superglide Event" , player).access_rule = lambda state: has_item(state, player, "") - + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Mail Postcard 01 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 1) - ) + has_postcards(state, player, 1) + ) multiworld.get_location("Traverse Town Mail Postcard 02 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 2) - ) + has_postcards(state, player, 2) + ) multiworld.get_location("Traverse Town Mail Postcard 03 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 3) - ) + has_postcards(state, player, 3) + ) multiworld.get_location("Traverse Town Mail Postcard 04 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 4) - ) + has_postcards(state, player, 4) + ) multiworld.get_location("Traverse Town Mail Postcard 05 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 5) - ) + has_postcards(state, player, 5) + ) multiworld.get_location("Traverse Town Mail Postcard 06 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 6) - ) + has_postcards(state, player, 6) + ) multiworld.get_location("Traverse Town Mail Postcard 07 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 7) - ) + has_postcards(state, player, 7) + ) multiworld.get_location("Traverse Town Mail Postcard 08 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 8) - ) + has_postcards(state, player, 8) + ) multiworld.get_location("Traverse Town Mail Postcard 09 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 9) - ) + has_postcards(state, player, 9) + ) multiworld.get_location("Traverse Town Mail Postcard 10 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 10) - ) - + has_postcards(state, player, 10) + ) multiworld.get_location("Traverse Town Defeat Opposite Armor Aero Event" , player).access_rule = lambda state: ( - has_item(state, player, "Red Trinity") - ) - - if options.atlantica: - multiworld.get_location("Atlantica Undersea Gorge Blizzard Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Blizzard") - #multiworld.get_location("Atlantica Undersea Gorge Ocean Floor Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Valley Higher Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Valley Lower Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Undersea Valley Fire Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") - #multiworld.get_location("Atlantica Undersea Valley Wall Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Valley Pillar Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Valley Ocean Floor Clam" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Triton's Palace Thunder Clam" , player).access_rule = lambda state: has_item(state, player, "Progressive Thunder") - #multiworld.get_location("Atlantica Triton's Palace Wall Right Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Triton's Palace Near Path Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Triton's Palace Wall Left Clam" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("Atlantica Cavern Nook Clam" , player).access_rule = lambda state: has_item(state, player, "Crystal Trident") - #multiworld.get_location("Atlantica Below Deck Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Garden Clam" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Atlantica Undersea Cave Clam" , player).access_rule = lambda state: has_item(state, player, "") - - #multiworld.get_location("Agrabah Defeat Jafar Genie Ansem's Report 1" , player).access_rule = lambda state: has_item(state, player, "") + has_item(state, player, "Red Trinity") + ) multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - if options.atlantica: - multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") - and has_item(state, player, "Mermaid Kick") - and has_offensive_magic(state, player) - and has_item(state, player, "Crystal Trident") - ) + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: ( - has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_item(state, player, "Progressive Fire") - ) - if options.cups: - multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) + has_item(state, player, "Jack-In-The-Box") + and has_item(state, player, "Forget-Me-Not") + and has_item(state, player, "Progressive Fire") + ) multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - ) + has_item(state, player, "Green Trinity") + ) multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - if options.super_bosses: - multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = 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) - ) - if options.super_bosses or options.goal.current_key == "sephiroth": - multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - if options.super_bosses or options.goal.current_key == "unknown": - multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = 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) - ) - - if options.cups: - multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Phil Cup Time Trial" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: ( - has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: ( - has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: ( - has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: ( - has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: ( - has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: ( - has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: ( - has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: ( - has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") - ) - - #multiworld.get_location("Traverse Town Magician's Study Turn in Naturespark" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Progressive Fire") - #multiworld.get_location("Traverse Town Magician's Study Turn in Watergleam" , player).access_rule = lambda state: has_item(state, player, "Watergleam") and has_item(state, player, "Progressive Fire") - #multiworld.get_location("Traverse Town Magician's Study Turn in Fireglow" , player).access_rule = lambda state: has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") - #multiworld.get_location("Traverse Town Magician's Study Turn in all Summon Gems" , player).access_rule = lambda state: has_item(state, player, "Naturespark") and has_item(state, player, "Watergleam") and has_item(state, player, "Fireglow") and has_item(state, player, "Progressive Fire") + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 1" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 2" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 3" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 4" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 5" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - and has_all_summons(state, player) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and has_all_summons(state, player) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Geppetto's House Talk to Pinocchio" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = 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) - ) + has_all_magic_lvx(state, player, 1) + and has_all_arts(state, player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + ) multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: ( - has_all_magic_lvx(state, player, 1) - ) + has_all_magic_lvx(state, player, 1) + ) multiworld.get_location("Traverse Town Magician's Study Obtained All LV3 Magic" , player).access_rule = lambda state: ( - has_all_magic_lvx(state, player, 3) - ) + has_all_magic_lvx(state, player, 3) + ) multiworld.get_location("Traverse Town Piano Room Return 10 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 10) - ) + has_puppies(state, player, 10) + ) multiworld.get_location("Traverse Town Piano Room Return 20 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 20) - ) + has_puppies(state, player, 20) + ) multiworld.get_location("Traverse Town Piano Room Return 30 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 30) - ) + has_puppies(state, player, 30) + ) multiworld.get_location("Traverse Town Piano Room Return 40 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 40) - ) + has_puppies(state, player, 40) + ) multiworld.get_location("Traverse Town Piano Room Return 50 Puppies Reward 1" , player).access_rule = lambda state: ( - has_puppies(state, player, 50) - ) + has_puppies(state, player, 50) + ) multiworld.get_location("Traverse Town Piano Room Return 50 Puppies Reward 2" , player).access_rule = lambda state: ( - has_puppies(state, player, 50) - ) + has_puppies(state, player, 50) + ) multiworld.get_location("Traverse Town Piano Room Return 60 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 60) - ) + has_puppies(state, player, 60) + ) multiworld.get_location("Traverse Town Piano Room Return 70 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 70) - ) + has_puppies(state, player, 70) + ) multiworld.get_location("Traverse Town Piano Room Return 80 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 80) - ) + has_puppies(state, player, 80) + ) multiworld.get_location("Traverse Town Piano Room Return 90 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 90) - ) + has_puppies(state, player, 90) + ) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: ( - has_puppies(state, player, 99) - ) + has_puppies(state, player, 99) + ) multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: ( - has_puppies(state, player, 99) - ) - if options.super_bosses or options.goal.current_key == "sephiroth": - multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - if options.cups: - multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_item(state, player, "Guard") - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") - ) - #multiworld.get_location("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times" , player).access_rule = lambda state: has_item(state, player, "") + has_puppies(state, player, 99) + ) multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 02:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 03:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 04:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 05:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 06:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 07:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 08:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 09:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 10:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 11:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Clock Tower 12:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Neverland Hold Aero Chest" , player).access_rule = lambda state: ( - has_item(state, player, "Yellow Trinity") - ) - if options.hundred_acre_wood: - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) - multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 5) - ) - multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 1) - ) - multiworld.get_location("100 Acre Wood Convert Torn Page 2" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 2) - ) - multiworld.get_location("100 Acre Wood Convert Torn Page 3" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 3) - ) - multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - ) - multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 5) - ) - multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 3) - ) - #multiworld.get_location("100 Acre Wood Pooh's Room Cabinet" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("100 Acre Wood Pooh's Room Chimney" , player).access_rule = lambda state: has_item(state, player, "") - multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - ) + has_item(state, player, "Yellow Trinity") + ) multiworld.get_location("Deep Jungle Camp Hi-Potion Experiment" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Fire") - ) + has_item(state, player, "Progressive Fire") + ) multiworld.get_location("Deep Jungle Camp Ether Experiment" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Blizzard") - ) + has_item(state, player, "Progressive Blizzard") + ) multiworld.get_location("Deep Jungle Camp Replication Experiment" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Blizzard") - ) + has_item(state, player, "Progressive Blizzard") + ) multiworld.get_location("Deep Jungle Cliff Save Gorillas" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Tree House Save Gorillas" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Camp Save Gorillas" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: ( - has_slides(state, player) - ) - if options.cups: - multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Jungle Slider 10 Fruits" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Jungle Slider 20 Fruits" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Jungle Slider 30 Fruits" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Jungle Slider 40 Fruits" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Deep Jungle Jungle Slider 50 Fruits" , player).access_rule = lambda state: ( - has_slides(state, player) - ) - #multiworld.get_location("Traverse Town 1st District Speak with Cid Event" , player).access_rule = lambda state: () + has_slides(state, player) + ) multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: ( - has_evidence(state, player) - ) + has_evidence(state, player) + ) multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - ) - if options.super_bosses: - multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = 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) - if options.super_bosses or options.goal.current_key == "unknown": - multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = 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_item(state, player, "Green Trinity") + ) multiworld.get_location("Olympus Coliseum Coliseum Gates Hero's License Event" , player).access_rule = lambda state: ( - has_item(state, player, "Entry Pass") - ) - #if options.atlantica: - #multiworld.get_location("Atlantica Sunken Ship Crystal Trident Event" , player).access_rule = lambda state: () - #multiworld.get_location("Halloween Town Graveyard Forget-Me-Not Event" , player).access_rule = lamdba state: () - #multiworld.get_location("Deep Jungle Tent Protect-G Event" , player).access_rule = lambda state: () + has_item(state, player, "Entry Pass") + ) multiworld.get_location("Deep Jungle Cavern of Hearts Navi-G Piece Event" , player).access_rule = lambda state: ( - has_slides(state, player) - ) + has_slides(state, player) + ) multiworld.get_location("Wonderland Bizarre Room Navi-G Piece Event" , player).access_rule = lambda state: ( - has_evidence(state, player) - ) - #multiworld.get_location("Olympus Coliseum Coliseum Gates Entry Pass Event" , player).access_rule = lambda state: () - + has_evidence(state, player) + ) multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and - ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) - ) - ) + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and - ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) - ) - ) + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Traverse Town Synth Rope" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and - ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) - ) - ) + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Traverse Town Synth Seagull Egg" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and - ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) - ) - ) + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and - ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) - ) - ) + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and - ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) - ) - ) - - #multiworld.get_location("Traverse Town Item Shop Postcard" , player).access_rule = lambda state: has_item(state, player, "") - #multiworld.get_location("Traverse Town 1st District Safe Postcard" , player).access_rule = lambda state: has_item(state, player, "") + has_at_least(state, player, "Empty Bottle", 6) + and + ( + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) + ) multiworld.get_location("Traverse Town Gizmo Shop Postcard 1" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Thunder") - ) + has_item(state, player, "Progressive Thunder") + ) multiworld.get_location("Traverse Town Gizmo Shop Postcard 2" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Thunder") - ) + has_item(state, player, "Progressive Thunder") + ) multiworld.get_location("Traverse Town Item Workshop Postcard" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) - ) - #multiworld.get_location("Traverse Town 3rd District Balcony Postcard" , player).access_rule = lambda state: has_item(state, player, "") + has_item(state, player, "Green Trinity") + or has_at_least(state, player, "High Jump", 3) + ) multiworld.get_location("Traverse Town Geppetto's House Postcard" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and - ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) - ) - ) - #multiworld.get_location("Halloween Town Lab Torn Page" , player).access_rule = lambda state: has_item(state, player, "") + has_item(state, player, "Monstro") + and + ( + has_item(state, player, "High Jump") + or (options.advanced_logic and can_glide(state, player)) + ) + ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)" , player).access_rule = lambda state: ( - ( - has_item(state, player, "Theon Vol. 6") - or has_at_least(state, player, "High Jump", 3) - or has_emblems(state, player, options.keyblades_unlock_chests) - ) - and has_item(state, player, "Progressive Fire") - and - ( - has_item(state, player, "High Jump") - or can_glide(state, player) - or has_item(state, player, "Progressive Thunder") - or options.advanced_logic - ) - ) + ( + has_item(state, player, "Theon Vol. 6") + or has_at_least(state, player, "High Jump", 3) + or has_emblems(state, player, options.keyblades_unlock_chests) + ) + and has_item(state, player, "Progressive Fire") + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + or has_item(state, player, "Progressive Thunder") + or options.advanced_logic + ) + ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)" , player).access_rule = lambda state: ( - has_item(state, player, "Theon Vol. 6") - or has_at_least(state, player, "High Jump", 3) - or has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_item(state, player, "Theon Vol. 6") + or has_at_least(state, player, "High Jump", 3) + or has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)" , player).access_rule = lambda state: ( - ( - has_item(state, player, "Theon Vol. 6") - or has_at_least(state, player, "High Jump", 3) - or has_emblems(state, player, options.keyblades_unlock_chests) - ) - and has_item(state, player, "Red Trinity") - ) + ( + has_item(state, player, "Theon Vol. 6") + or has_at_least(state, player, "High Jump", 3) + or has_emblems(state, player, options.keyblades_unlock_chests) + ) + and has_item(state, player, "Red Trinity") + ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)" , player).access_rule = lambda state: ( - has_item(state, player, "Theon Vol. 6") - or has_at_least(state, player, "High Jump", 3) - or has_emblems(state, player, options.keyblades_unlock_chests) - ) - #multiworld.get_location("Traverse Town 1st District Leon Gift" , player).access_rule = lambda state: () - #multiworld.get_location("Traverse Town 1st District Aerith Gift" , player).access_rule = lambda state: () + has_item(state, player, "Theon Vol. 6") + or has_at_least(state, player, "High Jump", 3) + or has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Library Speak to Belle Divine Rose" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) + has_emblems(state, player, options.keyblades_unlock_chests) + ) multiworld.get_location("Hollow Bastion Library Speak to Aerith Cure" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - - + has_emblems(state, player, options.keyblades_unlock_chests) + ) + if options.hundred_acre_wood: + multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 5) + ) + multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 1) + ) + multiworld.get_location("100 Acre Wood Convert Torn Page 2" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 2) + ) + multiworld.get_location("100 Acre Wood Convert Torn Page 3" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 3) + ) + multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + ) + multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 5) + ) + multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 3) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + ) + multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: ( + has_torn_pages(state, player, 4) + and + ( + has_item(state, player, "High Jump") + or can_glide(state, player) + ) + ) + if options.atlantica: + multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: ( + has_item(state, player, "Progressive Fire") + and has_item(state, player, "Crystal Trident") + ) + multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: ( + has_item(state, player, "White Trinity") + ) + multiworld.get_location("Atlantica Defeat Ursula I Mermaid Kick Event" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") + and has_offensive_magic(state, player) + and has_item(state, player, "Crystal Trident") + ) + multiworld.get_location("Atlantica Defeat Ursula II Thunder Event" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") + and has_item(state, player, "Mermaid Kick") + and has_offensive_magic(state, player) + and has_item(state, player, "Crystal Trident") + ) + multiworld.get_location("Atlantica Seal Keyhole Crabclaw Event" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") + and has_item(state, player, "Mermaid Kick") + and has_offensive_magic(state, player) + and has_item(state, player, "Crystal Trident") + ) + multiworld.get_location("Atlantica Undersea Gorge Blizzard Clam" , player).access_rule = lambda state: ( + has_item(state, player, "Progressive Blizzard") + ) + multiworld.get_location("Atlantica Undersea Valley Fire Clam" , player).access_rule = lambda state: ( + has_item(state, player, "Progressive Fire") + ) + multiworld.get_location("Atlantica Triton's Palace Thunder Clam" , player).access_rule = lambda state: ( + has_item(state, player, "Progressive Thunder") + ) + multiworld.get_location("Atlantica Cavern Nook Clam" , player).access_rule = lambda state: ( + has_item(state, player, "Crystal Trident") + ) + multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: ( + has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") + and has_item(state, player, "Mermaid Kick") + and has_offensive_magic(state, player) + and has_item(state, player, "Crystal Trident") + ) + if options.cups: + multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Phil Cup Time Trial" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: ( + has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: ( + has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: ( + has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: ( + has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: ( + has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: ( + has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: ( + has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: ( + has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_item(state, player, "Guard") + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + and has_item(state, player, "Entry Pass") + ) + if options.super_bosses: + multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: ( + has_item(state, player, "Green Trinity") + and has_all_magic_lvx(state, player, 2) + and has_defensive_tools(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) + ) + multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = 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) + ) + multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = 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) + ) + if options.super_bosses or options.goal.current_key == "sephiroth": + multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: ( + has_item(state, player, "Phil Cup") + and has_item(state, player, "Pegasus Cup") + and has_item(state, player, "Hercules Cup") + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_defensive_tools(state, player) + and has_item(state, player, "Entry Pass") + ) + if options.super_bosses or options.goal.current_key == "unknown": + multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = 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) + ) + multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = 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) + ) + for i in range(options.level_checks): + multiworld.get_location("Level " + str(i+1).rjust(3,'0') , player).access_rule = lambda state, level_num=i: ( + has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests) + ) if options.goal.current_key == "final_ansem": multiworld.get_location("Final Ansem" , player).access_rule = lambda state: ( - has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports, options.keyblades_unlock_chests) - ) - for i in range(options.level_checks): - multiworld.get_location("Level " + str(i+1).rjust(3,'0') , player).access_rule = lambda state, level_num=i: has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests) - - + has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports, options.keyblades_unlock_chests) + ) - # Region rules. multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) multiworld.get_entrance("Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player,"Olympus Coliseum") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: has_item(state, player,"Deep Jungle") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) @@ -2145,6 +2070,4 @@ def set_rules(kh1world): multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and (has_reports(state, player, eotw_required_reports) or has_item(state, player,"End of the World")) multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") - # Win condition. - multiworld.completion_condition[player] = lambda state: state.has("Victory", player) - \ No newline at end of file + multiworld.completion_condition[player] = lambda state: state.has("Victory", player) \ No newline at end of file From ab4e12541efe28d2a5f5afd0f6c01345c5a69c1b Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 27 Jul 2024 21:32:25 -0500 Subject: [PATCH 206/284] Clean up regions, fix client --- worlds/kh1/Client.py | 2 +- worlds/kh1/Regions.py | 796 ++++++++++++++++++++---------------------- 2 files changed, 382 insertions(+), 416 deletions(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 20a13f4661fc..10a5498fee5c 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -150,7 +150,7 @@ def on_package(self, cmd: str, args: dict): senderID = networkItem.player locationID = networkItem.location if recieverID != self.slot and senderID == self.slot: - itemName = self.item_names[networkItem.item] + itemName = self.item_names.lookup_in_slot(networkItem.item, networkItem.player) itemCategory = networkItem.flags recieverName = self.player_names[recieverID] filename = "sent" diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 7c3baa7d5ae8..7407d64d0e51 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -34,287 +34,304 @@ def create_regions(multiworld: MultiWorld, player: int, options): } # Set up locations - #regions["Destiny Islands"].locations.append("Destiny Islands Chest"), missable - regions["Traverse Town"].locations.append("Traverse Town 1st District Candle Puzzle Chest"), - regions["Traverse Town"].locations.append("Traverse Town 1st District Accessory Shop Roof Chest"), - regions["Traverse Town"].locations.append("Traverse Town 2nd District Boots and Shoes Awning Chest"), - regions["Traverse Town"].locations.append("Traverse Town 2nd District Rooftop Chest"), - regions["Traverse Town"].locations.append("Traverse Town 2nd District Gizmo Shop Facade Chest"), - regions["Traverse Town"].locations.append("Traverse Town Alleyway Balcony Chest"), - regions["Traverse Town"].locations.append("Traverse Town Alleyway Blue Room Awning Chest"), - regions["Traverse Town"].locations.append("Traverse Town Alleyway Corner Chest"), - regions["Traverse Town"].locations.append("Traverse Town Green Room Clock Puzzle Chest"), - regions["Traverse Town"].locations.append("Traverse Town Green Room Table Chest"), - regions["Traverse Town"].locations.append("Traverse Town Red Room Chest"), - regions["Traverse Town"].locations.append("Traverse Town Mystical House Yellow Trinity Chest"), - regions["Traverse Town"].locations.append("Traverse Town Accessory Shop Chest"), - regions["Traverse Town"].locations.append("Traverse Town Secret Waterway White Trinity Chest"), - regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Chest"), - regions["Traverse Town"].locations.append("Traverse Town Item Workshop Right Chest"), - regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity Balcony Chest"), - regions["Traverse Town"].locations.append("Traverse Town Mystical House Glide Chest"), - regions["Traverse Town"].locations.append("Traverse Town Alleyway Behind Crates Chest"), - regions["Traverse Town"].locations.append("Traverse Town Item Workshop Left Chest"), - regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Near Stairs Chest"), - regions["Wonderland"].locations.append("Wonderland Rabbit Hole Green Trinity Chest"), - regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless 1 Chest"), - regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless 2 Chest"), - regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless 3 Chest"), - regions["Wonderland"].locations.append("Wonderland Bizarre Room Green Trinity Chest"), - 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"), - regions["Wonderland"].locations.append("Wonderland Lotus Forest Thunder Plant Chest"), - regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting Thunder Plant 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 Corner Chest"), - regions["Wonderland"].locations.append("Wonderland Bizarre Room Lamp Chest"), - regions["Wonderland"].locations.append("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest"), - regions["Wonderland"].locations.append("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest"), - regions["Wonderland"].locations.append("Wonderland Tea Party Garden Bear and Clock Puzzle Chest"), - regions["Wonderland"].locations.append("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest"), - regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting White Trinity Chest"), - 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 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 Vines Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Vines 2 Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Climbing Trees Blue Trinity Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Tunnel Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Cavern of Hearts White Trinity Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Camp Blue Trinity Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Tent Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern Low Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern Middle Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern High Wall Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern High Middle Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Cliff Right Cliff Left Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Cliff Right Cliff Right Chest"), - regions["Deep Jungle"].locations.append("Deep Jungle Tree House Suspended Boat Chest"), - 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"), - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), - regions["Agrabah"].locations.append("Agrabah Plaza By Storage Chest"), - regions["Agrabah"].locations.append("Agrabah Plaza Raised Terrace Chest"), - regions["Agrabah"].locations.append("Agrabah Plaza Top Corner Chest"), - regions["Agrabah"].locations.append("Agrabah Alley Chest"), - regions["Agrabah"].locations.append("Agrabah Bazaar Across Windows Chest"), - regions["Agrabah"].locations.append("Agrabah Bazaar High Corner Chest"), - regions["Agrabah"].locations.append("Agrabah Main Street Right Palace Entrance Chest"), - regions["Agrabah"].locations.append("Agrabah Main Street High Above Alley Entrance Chest"), - regions["Agrabah"].locations.append("Agrabah Main Street High Above Palace Gates Entrance Chest"), - regions["Agrabah"].locations.append("Agrabah Palace Gates Low Chest"), - regions["Agrabah"].locations.append("Agrabah Palace Gates High Opposite Palace Chest"), - regions["Agrabah"].locations.append("Agrabah Palace Gates High Close to Palace Chest"), - regions["Agrabah"].locations.append("Agrabah Storage Green Trinity Chest"), - regions["Agrabah"].locations.append("Agrabah Storage Behind Barrel Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Entrance Left Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Entrance Tall Tower Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hall High Left Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Pillar Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Across Platforms Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Small Treasure Pile 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 Above Fire Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Relic Chamber Stairs Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Bridge Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Near Save Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hidden Room Right Chest"), - regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hidden Room Left Chest"), - 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 Cave of Wonders Entrance White Trinity Chest"), - regions["Monstro"].locations.append("Monstro Chamber 6 Other Platform Chest"), - regions["Monstro"].locations.append("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), - regions["Monstro"].locations.append("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), - regions["Monstro"].locations.append("Monstro Chamber 6 Low Chest"), - if options.atlantica: - regions["Atlantica"].locations.append("Atlantica Sunken Ship In Flipped Boat Chest"), - regions["Atlantica"].locations.append("Atlantica Sunken Ship Seabed Chest"), - regions["Atlantica"].locations.append("Atlantica Sunken Ship Inside Ship Chest"), - regions["Atlantica"].locations.append("Atlantica Ariel's Grotto High Chest"), - regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Middle Chest"), - regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Low Chest"), - regions["Atlantica"].locations.append("Atlantica Ursula's Lair Use Fire on Urchin Chest"), - regions["Atlantica"].locations.append("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest"), - regions["Atlantica"].locations.append("Atlantica Triton's Palace White Trinity Chest"), - regions["Halloween Town"].locations.append("Halloween Town Moonlight Hill White Trinity Chest"), - regions["Halloween Town"].locations.append("Halloween Town Bridge Under Bridge"), - regions["Halloween Town"].locations.append("Halloween Town Boneyard Tombstone Puzzle Chest"), - regions["Halloween Town"].locations.append("Halloween Town Bridge Right of Gate Chest"), - regions["Halloween Town"].locations.append("Halloween Town Cemetary Behind Grave Chest"), - regions["Halloween Town"].locations.append("Halloween Town Cemetary By Cat Shape Chest"), - regions["Halloween Town"].locations.append("Halloween Town Cemetary Between Graves Chest"), - regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Lower Iron Cage Chest"), - regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Upper Iron Cage Chest"), - regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Hollow Chest"), - regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Grounds Red Trinity Chest"), - regions["Halloween Town"].locations.append("Halloween Town Guillotine Square High Tower Chest"), - regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Pumpkin Structure Left Chest"), - regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Entrance Steps Chest"), - regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Inside Entrance Chest"), - regions["Halloween Town"].locations.append("Halloween Town Bridge Left of Gate Chest"), - regions["Halloween Town"].locations.append("Halloween Town Cemetary By Striped Grave Chest"), - regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Under Jack's House Stairs Chest"), - regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Pumpkin Structure Right Chest"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Left Behind Columns Chest"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates White Trinity Chest"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Blizzara Chest"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Blizzaga Chest"), - regions["Monstro"].locations.append("Monstro Mouth Boat Deck Chest"), - regions["Monstro"].locations.append("Monstro Mouth High Platform Boat Side Chest"), - regions["Monstro"].locations.append("Monstro Mouth High Platform Across from Boat Chest"), - regions["Monstro"].locations.append("Monstro Mouth Near Ship Chest"), - regions["Monstro"].locations.append("Monstro Mouth Green Trinity Top of Boat Chest"), - regions["Monstro"].locations.append("Monstro Chamber 2 Ground Chest"), - regions["Monstro"].locations.append("Monstro Chamber 2 Platform Chest"), - regions["Monstro"].locations.append("Monstro Chamber 5 Platform Chest"), - regions["Monstro"].locations.append("Monstro Chamber 3 Ground Chest"), - regions["Monstro"].locations.append("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest"), - regions["Monstro"].locations.append("Monstro Chamber 3 Near Chamber 6 Entrance Chest"), - regions["Monstro"].locations.append("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest"), - regions["Monstro"].locations.append("Monstro Mouth High Platform Near Teeth Chest"), - regions["Monstro"].locations.append("Monstro Chamber 5 Atop Barrel Chest"), - regions["Monstro"].locations.append("Monstro Chamber 5 Low 2nd Chest"), - regions["Monstro"].locations.append("Monstro Chamber 5 Low 1st Chest"), - regions["Neverland"].locations.append("Neverland Pirate Ship Deck White Trinity Chest"), - regions["Neverland"].locations.append("Neverland Pirate Ship Crows Nest Chest"), - regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Right Blue Chest"), - regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Left Blue Chest"), - regions["Neverland"].locations.append("Neverland Galley Chest"), - regions["Neverland"].locations.append("Neverland Cabin Chest"), - regions["Neverland"].locations.append("Neverland Hold Flight 1st Chest "), - regions["Neverland"].locations.append("Neverland Clock Tower Chest"), - regions["Neverland"].locations.append("Neverland Hold Flight 2nd Chest"), - regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Green Chest"), - regions["Neverland"].locations.append("Neverland Captain's Cabin Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Water's Surface Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Under Water 1st Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Under Water 2nd Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls High Platform Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Castle Gates Gravity Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Castle Gates Freestanding Pillar Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Castle Gates High Pillar Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest Lower Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest After Battle Platform Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 2nd Gravity Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 1st Gravity Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower Above Sliding Blocks Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Library 1st Floor Turn the Carousel Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Library 2nd Floor Turn the Carousel 2nd 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"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Outside Library Gravity Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Base Level Bubble Under the Wall Platform Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Base Level Platform Near Entrance Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Base Level Near Crystal Switch Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Waterway Near Save Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Waterway Blizzard on Bubble Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Waterway Unlock Passage from Base Level Chest"), - 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 Grand Hall Steps Right Side Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Oblivion Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Left of Gate Chest"), - #regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Push the Statue Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Left of Emblem Door Chest"), - regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls White Trinity Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 1st Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 2nd Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 3rd Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 4th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 5th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 6th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 10th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 9th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 8th Chest"), - regions["End of the World"].locations.append("End of the World Final Dimension 7th Chest"), - regions["End of the World"].locations.append("End of the World Giant Crevasse 3rd Chest"), - regions["End of the World"].locations.append("End of the World Giant Crevasse 5th Chest"), - regions["End of the World"].locations.append("End of the World Giant Crevasse 1st Chest"), - regions["End of the World"].locations.append("End of the World Giant Crevasse 4th Chest"), - regions["End of the World"].locations.append("End of the World Giant Crevasse 2nd Chest"), - regions["End of the World"].locations.append("End of the World World Terminus Traverse Town Chest"), - regions["End of the World"].locations.append("End of the World World Terminus Wonderland 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 Deep Jungle Chest"), - regions["End of the World"].locations.append("End of the World World Terminus Agrabah Chest"), - 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 Halloween Town 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 100 Acre Wood 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 Final Rest Chest"), - regions["Monstro"].locations.append("Monstro Chamber 6 White Trinity Chest"), - #regions["Awakening"].locations.append("Awakening Chest"), missable - - 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 Guard Armor Blue Trinity Event"), - regions["Traverse Town"].locations.append("Traverse Town Leon Secret Waterway Earthshine Event"), - regions["Traverse Town"].locations.append("Traverse Town Kairi Secret Waterway Oathkeeper Event"), - regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Brave Warrior Event"), - regions["Deep Jungle"].locations.append("Deep Jungle Defeat Sabor White Fang Event"), - regions["Deep Jungle"].locations.append("Deep Jungle Defeat Clayton Cure Event"), - 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["Olympus Coliseum"].locations.append("Olympus Coliseum Clear Phil's Training Thunder Event"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Cerberus Inferno Band Event"), - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Cloud Sonic Blade Event"), - regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Blizzard Event"), - regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Ifrit's Horn Event"), - regions["Agrabah"].locations.append("Agrabah Defeat Pot Centipede Ray of Light Event"), - regions["Agrabah"].locations.append("Agrabah Defeat Jafar Blizzard Event"), - regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Fire Event"), - regions["Agrabah"].locations.append("Agrabah Seal Keyhole Genie Event"), - regions["Agrabah"].locations.append("Agrabah Seal Keyhole Three Wishes Event"), - regions["Agrabah"].locations.append("Agrabah Seal Keyhole Green Trinity Event"), - regions["Monstro"].locations.append("Monstro Defeat Parasite Cage I Goofy Cheer Event"), - regions["Monstro"].locations.append("Monstro Defeat Parasite Cage II Stop Event"), - if options.atlantica: - regions["Atlantica"].locations.append("Atlantica Defeat Ursula I Mermaid Kick Event") - regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Thunder Event") - regions["Atlantica"].locations.append("Atlantica Seal Keyhole Crabclaw Event") + 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 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") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Bridge Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Dark Chamber Near Save Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Entrance Left Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Entrance Tall Tower Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Entrance White Trinity Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hall High Left Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hidden Room Left Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Hidden Room Right Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Relic Chamber Stairs Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest") + 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 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") + regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Fire Event") + regions["Agrabah"].locations.append("Agrabah Defeat Pot Centipede Ray of Light Event") + regions["Agrabah"].locations.append("Agrabah Main Street High Above Alley Entrance Chest") + regions["Agrabah"].locations.append("Agrabah Main Street High Above Palace Gates Entrance Chest") + regions["Agrabah"].locations.append("Agrabah Main Street Right Palace Entrance Chest") + regions["Agrabah"].locations.append("Agrabah Palace Gates High Close to Palace Chest") + regions["Agrabah"].locations.append("Agrabah Palace Gates High Opposite Palace Chest") + regions["Agrabah"].locations.append("Agrabah Palace Gates Low Chest") + regions["Agrabah"].locations.append("Agrabah Plaza By Storage Chest") + regions["Agrabah"].locations.append("Agrabah Plaza Raised Terrace Chest") + regions["Agrabah"].locations.append("Agrabah Plaza Top Corner Chest") + regions["Agrabah"].locations.append("Agrabah Seal Keyhole Genie Event") + regions["Agrabah"].locations.append("Agrabah Seal Keyhole Green Trinity Event") + regions["Agrabah"].locations.append("Agrabah Seal Keyhole Three Wishes Event") + regions["Agrabah"].locations.append("Agrabah Storage Behind Barrel Chest") + regions["Agrabah"].locations.append("Agrabah Storage Green Trinity Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Bamboo Thicket Save Gorillas") + regions["Deep Jungle"].locations.append("Deep Jungle Camp Blue Trinity Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Camp Ether Experiment") + regions["Deep Jungle"].locations.append("Deep Jungle Camp Hi-Potion Experiment") + regions["Deep Jungle"].locations.append("Deep Jungle Camp Replication Experiment") + regions["Deep Jungle"].locations.append("Deep Jungle Camp Save Gorillas") + regions["Deep Jungle"].locations.append("Deep Jungle Cavern of Hearts Navi-G Piece Event") + regions["Deep Jungle"].locations.append("Deep Jungle Cavern of Hearts White Trinity Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Cliff Right Cliff Left Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Cliff Right Cliff Right Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Cliff Save Gorillas") + regions["Deep Jungle"].locations.append("Deep Jungle Climbing Trees Blue Trinity Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Climbing Trees Save Gorillas") + regions["Deep Jungle"].locations.append("Deep Jungle Defeat Clayton Cure Event") + regions["Deep Jungle"].locations.append("Deep Jungle Defeat Sabor White Fang Event") + 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 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") + regions["Deep Jungle"].locations.append("Deep Jungle Tree House Suspended Boat Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Tunnel Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Vines 2 Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Vines Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern High Middle Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern High Wall Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern Low Chest") + regions["Deep Jungle"].locations.append("Deep Jungle Waterfall Cavern Middle Chest") + regions["End of the World"].locations.append("End of the World Defeat Chernabog Superglide Event") + regions["End of the World"].locations.append("End of the World Final Dimension 10th Chest") + regions["End of the World"].locations.append("End of the World Final Dimension 1st Chest") + regions["End of the World"].locations.append("End of the World Final Dimension 2nd Chest") + regions["End of the World"].locations.append("End of the World Final Dimension 3rd Chest") + regions["End of the World"].locations.append("End of the World Final Dimension 4th Chest") + regions["End of the World"].locations.append("End of the World Final Dimension 5th Chest") + regions["End of the World"].locations.append("End of the World Final Dimension 6th Chest") + regions["End of the World"].locations.append("End of the World Final Dimension 7th Chest") + regions["End of the World"].locations.append("End of the World Final Dimension 8th Chest") + regions["End of the World"].locations.append("End of the World Final Dimension 9th Chest") + regions["End of the World"].locations.append("End of the World Final Rest Chest") + regions["End of the World"].locations.append("End of the World Giant Crevasse 1st Chest") + regions["End of the World"].locations.append("End of the World Giant Crevasse 2nd Chest") + regions["End of the World"].locations.append("End of the World Giant Crevasse 3rd Chest") + regions["End of the World"].locations.append("End of the World Giant Crevasse 4th Chest") + regions["End of the World"].locations.append("End of the World Giant Crevasse 5th Chest") + regions["End of the World"].locations.append("End of the World World Terminus 100 Acre Wood Chest") + regions["End of the World"].locations.append("End of the World World Terminus Agrabah Chest") + 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 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") + regions["End of the World"].locations.append("End of the World World Terminus Wonderland Chest") + regions["Halloween Town"].locations.append("Halloween Town Boneyard Tombstone Puzzle Chest") + regions["Halloween Town"].locations.append("Halloween Town Bridge Left of Gate Chest") + regions["Halloween Town"].locations.append("Halloween Town Bridge Right of Gate Chest") + regions["Halloween Town"].locations.append("Halloween Town Bridge Under Bridge") + regions["Halloween Town"].locations.append("Halloween Town Cemetary Behind Grave Chest") + regions["Halloween Town"].locations.append("Halloween Town Cemetary Between Graves Chest") + regions["Halloween Town"].locations.append("Halloween Town Cemetary By Cat Shape Chest") + regions["Halloween Town"].locations.append("Halloween Town Cemetary By Striped Grave Chest") + regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie Boogie Ansem's Report 7") regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie Boogie Holy Circlet Event") regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie's Manor Gravity Event") + regions["Halloween Town"].locations.append("Halloween Town Graveyard Forget-Me-Not Event") + regions["Halloween Town"].locations.append("Halloween Town Guillotine Square High Tower Chest") + regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Pumpkin Structure Left Chest") + regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Pumpkin Structure Right Chest") + regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times") + regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Under Jack's House Stairs Chest") + regions["Halloween Town"].locations.append("Halloween Town Lab Torn Page") + regions["Halloween Town"].locations.append("Halloween Town Moonlight Hill White Trinity Chest") + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Entrance Steps Chest") + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Grounds Red Trinity Chest") + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Hollow Chest") + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Inside Entrance Chest") + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Lower Iron Cage Chest") + regions["Halloween Town"].locations.append("Halloween Town Oogie's Manor Upper Iron Cage Chest") regions["Halloween Town"].locations.append("Halloween Town Seal Keyhole Pumpkinhead Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Base Level Bubble Under the Wall Platform Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Base Level Near Crystal Switch Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Base Level Platform Near Entrance Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Castle Gates Freestanding Pillar Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Castle Gates Gravity Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Castle Gates High Pillar Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Behemoth Omega Arts Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Dragon Maleficent Fireglow Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Ansem's Report 5") + 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 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)") + regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Flame)") + regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Fountain)") + regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Statue)") + regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Left of Emblem Door Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Left of Gate Chest") + 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 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") + regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower Above Sliding Blocks Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Library 1st Floor Turn the Carousel Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Library Speak to Aerith Cure") + 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 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") + regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Outside Library Gravity Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Floating Platform Near Save Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls High Platform Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Under Water 1st Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Under Water 2nd Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls Water's Surface Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Rising Falls White Trinity Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak to Princesses Fire Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 2") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 4") + regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 6") + regions["Hollow Bastion"].locations.append("Hollow Bastion Waterway Blizzard on Bubble Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Waterway Near Save Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Waterway Unlock Passage from Base Level Chest") + regions["Monstro"].locations.append("Monstro Chamber 2 Ground Chest") + regions["Monstro"].locations.append("Monstro Chamber 2 Platform Chest") + regions["Monstro"].locations.append("Monstro Chamber 3 Ground Chest") + regions["Monstro"].locations.append("Monstro Chamber 3 Near Chamber 6 Entrance Chest") + 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 Low 1st Chest") + regions["Monstro"].locations.append("Monstro Chamber 5 Low 2nd Chest") + regions["Monstro"].locations.append("Monstro Chamber 5 Platform Chest") + regions["Monstro"].locations.append("Monstro Chamber 6 Low Chest") + regions["Monstro"].locations.append("Monstro Chamber 6 Other Platform Chest") + regions["Monstro"].locations.append("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest") + regions["Monstro"].locations.append("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest") + 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 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["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 Chest") regions["Neverland"].locations.append("Neverland Defeat Anti Sora Raven's Claw Event") + regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Arcanum Event") + regions["Neverland"].locations.append("Neverland Defeat Hook Ansem's Report 9") regions["Neverland"].locations.append("Neverland Encounter Hook Cure Event") + regions["Neverland"].locations.append("Neverland Galley Chest") + regions["Neverland"].locations.append("Neverland Hold Aero Chest") + regions["Neverland"].locations.append("Neverland Hold Flight 1st Chest ") + regions["Neverland"].locations.append("Neverland Hold Flight 2nd Chest") + regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Green Chest") + regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Left Blue Chest") + regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Right Blue Chest") + regions["Neverland"].locations.append("Neverland Pirate Ship Crows Nest Chest") + 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 Tinker Bell Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") - if options.super_bosses: - regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") - regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Arcanum Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Donald Cheer Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Dragon Maleficent Fireglow Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku II Ragnarok Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Behemoth Omega Arts Event") - regions["Hollow Bastion"].locations.append("Hollow Bastion Speak to Princesses Fire Event") - regions["End of the World"].locations.append("End of the World Defeat Chernabog Superglide 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") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Blizzaga Chest") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Blizzara Chest") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Entry Pass Event") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Green Trinity") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Hero's License Event") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Left Behind Columns Chest") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates White Trinity Chest") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Cerberus Inferno Band Event") + 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 Candle Puzzle Chest") + 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 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 Accessory Shop Chest") + regions["Traverse Town"].locations.append("Traverse Town Alleyway Balcony Chest") + regions["Traverse Town"].locations.append("Traverse Town Alleyway Behind Crates Chest") + regions["Traverse Town"].locations.append("Traverse Town Alleyway Blue Room Awning Chest") + regions["Traverse Town"].locations.append("Traverse Town Alleyway Corner Chest") + regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Blue Trinity Event") + regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Brave Warrior Event") + 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 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") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 2") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 3") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 4") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 5") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Postcard") + regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Talk to Pinocchio") + regions["Traverse Town"].locations.append("Traverse Town Gizmo Shop Postcard 1") + regions["Traverse Town"].locations.append("Traverse Town Gizmo Shop Postcard 2") + regions["Traverse Town"].locations.append("Traverse Town Green Room Clock Puzzle Chest") + regions["Traverse Town"].locations.append("Traverse Town Green Room Table Chest") + regions["Traverse Town"].locations.append("Traverse Town Item Shop Postcard") + regions["Traverse Town"].locations.append("Traverse Town Item Workshop Left Chest") + regions["Traverse Town"].locations.append("Traverse Town Item Workshop Postcard") + 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 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") regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 01 Event") regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 02 Event") regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 03 Event") @@ -325,10 +342,86 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 08 Event") regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 09 Event") regions["Traverse Town"].locations.append("Traverse Town Mail Postcard 10 Event") - - regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Aero Event") - + regions["Traverse Town"].locations.append("Traverse Town Mystical House Glide Chest") + regions["Traverse Town"].locations.append("Traverse Town Mystical House Yellow Trinity Chest") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 10 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 20 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 30 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 40 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 50 Puppies Reward 1") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 50 Puppies Reward 2") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 60 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 70 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 80 Puppies") + regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies") + 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 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["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 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 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 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") + regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless 1 Chest") + regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless 2 Chest") + regions["Wonderland"].locations.append("Wonderland Rabbit Hole Defeat Heartless 3 Chest") + regions["Wonderland"].locations.append("Wonderland Rabbit Hole Green Trinity Chest") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest") + 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") + 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") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Right Tree Alcove Chest") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Under Giant Pot Chest") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 1") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 2") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 3") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 4") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 5") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Owl Cheer") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 1") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 2") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 3") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 4") + regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 5") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Cabinet") + regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Chimney") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Break Log") + regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh") if options.atlantica: + regions["Atlantica"].locations.append("Atlantica Sunken Ship In Flipped Boat Chest") + regions["Atlantica"].locations.append("Atlantica Sunken Ship Seabed Chest") + regions["Atlantica"].locations.append("Atlantica Sunken Ship Inside Ship Chest") + regions["Atlantica"].locations.append("Atlantica Ariel's Grotto High Chest") + regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Middle Chest") + regions["Atlantica"].locations.append("Atlantica Ariel's Grotto Low Chest") + regions["Atlantica"].locations.append("Atlantica Ursula's Lair Use Fire on Urchin Chest") + regions["Atlantica"].locations.append("Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest") + regions["Atlantica"].locations.append("Atlantica Triton's Palace White Trinity Chest") + regions["Atlantica"].locations.append("Atlantica Defeat Ursula I Mermaid Kick Event") + regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Thunder Event") + regions["Atlantica"].locations.append("Atlantica Seal Keyhole Crabclaw Event") regions["Atlantica"].locations.append("Atlantica Undersea Gorge Blizzard Clam") regions["Atlantica"].locations.append("Atlantica Undersea Gorge Ocean Floor Clam") regions["Atlantica"].locations.append("Atlantica Undersea Valley Higher Cave Clam") @@ -345,29 +438,8 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Atlantica"].locations.append("Atlantica Below Deck Clam") regions["Atlantica"].locations.append("Atlantica Undersea Garden Clam") regions["Atlantica"].locations.append("Atlantica Undersea Cave Clam") - - regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Ansem's Report 1") - regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 2") - if options.atlantica: + regions["Atlantica"].locations.append("Atlantica Sunken Ship Crystal Trident Event") regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Ansem's Report 3") - regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 4") - regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Ansem's Report 5") - regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 6") - regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie Boogie Ansem's Report 7") - if options.cups: - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") - regions["Neverland"].locations.append("Neverland Defeat Hook Ansem's Report 9") - regions["Hollow Bastion"].locations.append("Hollow Bastion Speak with Aerith Ansem's Report 10") - if options.super_bosses: - regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") - if options.super_bosses or options.goal.current_key == "sephiroth": - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") - if options.super_bosses or options.goal.current_key == "unknown": - regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") - - for i in range(options.level_checks): - regions["Levels"].locations.append("Level " + str(i+1).rjust(3,'0')) - if options.cups: regions["Olympus Coliseum"].locations.append("Complete Phil Cup") regions["Olympus Coliseum"].locations.append("Complete Phil Cup Solo") @@ -388,130 +460,24 @@ def create_regions(multiworld: MultiWorld, player: int, options): 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["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Naturespark") - #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Watergleam") - #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in Fireglow") - #regions["Traverse Town"].locations.append("Traverse Town Magician's Study Turn in all Summon Gems") - regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 1") - regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 2") - regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 3") - regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 4") - regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 5") - regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto All Summons Reward") - regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Talk to Pinocchio") - 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") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 10 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 20 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 30 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 40 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 50 Puppies Reward 1") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 50 Puppies Reward 2") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 60 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 70 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 80 Puppies") - regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 90 Puppies") - 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") - if options.super_bosses or options.goal.current_key == "sephiroth": - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") - if options.cups: + 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") - if options.cups: regions["Olympus Coliseum"].locations.append("Olympus Coliseum Gates Purple Jar After Defeating Hades") - regions["Halloween Town"].locations.append("Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times") - 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 Hold Aero Chest") - if options.hundred_acre_wood: - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 1") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 2") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 3") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 4") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Turn in Rare Nut 5") - regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Owl Cheer") - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 1") - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 2") - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 3") - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 4") - regions["100 Acre Wood"].locations.append("100 Acre Wood Convert Torn Page 5") - regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's House Start Fire") - regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Cabinet") - regions["100 Acre Wood"].locations.append("100 Acre Wood Pooh's Room Chimney") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Break Log") - regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh") - regions["Deep Jungle"].locations.append("Deep Jungle Camp Hi-Potion Experiment") - regions["Deep Jungle"].locations.append("Deep Jungle Camp Ether Experiment") - regions["Deep Jungle"].locations.append("Deep Jungle Camp Replication Experiment") - regions["Deep Jungle"].locations.append("Deep Jungle Cliff Save Gorillas") - regions["Deep Jungle"].locations.append("Deep Jungle Tree House Save Gorillas") - regions["Deep Jungle"].locations.append("Deep Jungle Camp Save Gorillas") - regions["Deep Jungle"].locations.append("Deep Jungle Bamboo Thicket Save Gorillas") - regions["Deep Jungle"].locations.append("Deep Jungle Climbing Trees Save Gorillas") - if options.cups: - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Olympia 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["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") - regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Green Trinity") 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": + 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": + 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") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Hero's License Event") - if options.atlantica: - regions["Atlantica"].locations.append("Atlantica Sunken Ship Crystal Trident Event") - regions["Halloween Town"].locations.append("Halloween Town Graveyard Forget-Me-Not Event") - regions["Deep Jungle"].locations.append("Deep Jungle Tent Protect-G Event") - regions["Deep Jungle"].locations.append("Deep Jungle Cavern of Hearts Navi-G Piece Event") - regions["Wonderland"].locations.append("Wonderland Bizarre Room Navi-G Piece Event") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates Entry Pass Event") - - regions["Traverse Town"].locations.append("Traverse Town Synth Log") - regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") - 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 Fish") - regions["Traverse Town"].locations.append("Traverse Town Synth Mushroom") - - regions["Traverse Town"].locations.append("Traverse Town Item Shop Postcard") - regions["Traverse Town"].locations.append("Traverse Town 1st District Safe Postcard") - regions["Traverse Town"].locations.append("Traverse Town Gizmo Shop Postcard 1") - regions["Traverse Town"].locations.append("Traverse Town Gizmo Shop Postcard 2") - regions["Traverse Town"].locations.append("Traverse Town Item Workshop Postcard") - regions["Traverse Town"].locations.append("Traverse Town 3rd District Balcony Postcard") - regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Postcard") - regions["Halloween Town"].locations.append("Halloween Town Lab Torn Page") - regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Flame)") - regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Chest)") - regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Statue)") - regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Fountain)") - regions["Traverse Town"].locations.append("Traverse Town 1st District Leon Gift") - regions["Traverse Town"].locations.append("Traverse Town 1st District Aerith Gift") - regions["Hollow Bastion"].locations.append("Hollow Bastion Library Speak to Belle Divine Rose") - regions["Hollow Bastion"].locations.append("Hollow Bastion Library Speak to Aerith Cure") - + 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") - - - # Set up the regions correctly. for name, data in regions.items(): From 01ca83ce4d43b3c6353b5140a44d63e42d372c1d Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 27 Jul 2024 22:02:37 -0500 Subject: [PATCH 207/284] Fix item send prompt --- worlds/kh1/Client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 10a5498fee5c..acfd5dba3825 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -150,7 +150,7 @@ def on_package(self, cmd: str, args: dict): senderID = networkItem.player locationID = networkItem.location if recieverID != self.slot and senderID == self.slot: - itemName = self.item_names.lookup_in_slot(networkItem.item, networkItem.player) + itemName = self.item_names.lookup_in_slot(networkItem.item, recieverID) itemCategory = networkItem.flags recieverName = self.player_names[recieverID] filename = "sent" From 9bfe3d01a1a27697494c6833252b8d99e5bb9d02 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:16:45 -0500 Subject: [PATCH 208/284] Update worlds/kh1/docs/en_Kingdom Hearts.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/en_Kingdom Hearts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 90c219f391f5..1d34d9ba813f 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -1,6 +1,6 @@ # Kingdom Hearts (PC) -##Credits +## Credits This is a collaborative effort from several individuals in the Kingdom Hearts community, but most of all, denhonator. Denho's original KH rando laid the foundation for the work here and makes everything here possible, so thank you Denho for such a blast of a randomizer. From f716c50705c68cc6bff55c75afb6dc2f43dadadc Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:17:00 -0500 Subject: [PATCH 209/284] Update worlds/kh1/docs/en_Kingdom Hearts.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/en_Kingdom Hearts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 1d34d9ba813f..1aea11de9753 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -30,7 +30,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 most 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. From 01c1fa35ffb97561fc43fc5363726b77cb3157c9 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:44:49 -0500 Subject: [PATCH 210/284] Update worlds/kh1/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/__init__.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 3be3bd631398..ca948216d4c4 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -242,14 +242,8 @@ def fill_slot_data(self) -> dict: if i < 4 and self.options.bad_starting_weapons: slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + "1,0," else: - if min_str_bonus != max_str_bonus: - str_bonus = int(self.random.randrange(min_str_bonus,max_str_bonus)) - else: - str_bonus = int(min_str_bonus) - if min_mp_bonus != max_mp_bonus: - mp_bonus = int(self.random.randrange(min_mp_bonus,max_mp_bonus)) - else: - mp_bonus = int(min_mp_bonus) + 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: From eb079a558fa509a989e0ce7326bd108969b1bbc5 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:45:09 -0500 Subject: [PATCH 211/284] Update worlds/kh1/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/__init__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index ca948216d4c4..381c0c2d35c0 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -285,10 +285,7 @@ def get_numbers_of_reports_to_consider(self) -> List[int]: def determine_reports_in_pool(self) -> int: numbers_to_consider = self.get_numbers_of_reports_to_consider() - if len(numbers_to_consider) > 0: - return max(numbers_to_consider) - else: - return 0 + return max(numbers_to_consider, default=0) def determine_reports_required_to_open_end_of_the_world(self) -> int: if self.options.end_of_the_world_unlock.current_key == "reports": From 3c355d479c8b80ab667e25233149367761b906be Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:45:18 -0500 Subject: [PATCH 212/284] Update worlds/kh1/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 381c0c2d35c0..a805e8b1d56b 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -302,4 +302,4 @@ def determine_reports_required_to_open_final_rest_door(self) -> int: elif len(numbers_to_consider) == 2: return numbers_to_consider[0] return 14 - \ No newline at end of file + From 2e23c378faac695bc42283a82fc8843950871d30 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:49:10 -0500 Subject: [PATCH 213/284] Update worlds/kh1/docs/en_Kingdom Hearts.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/en_Kingdom Hearts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 1aea11de9753..d27edc7a76bf 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -58,7 +58,7 @@ When the player receives an item, your client will display a message displaying Please reach out to Gicu#7034 on Discord. -## How do I progress a in certain world? +## How do I progress in a certain world? ###The evidence boxes aren't spawning in Wonderland. From 09a7485c9daf8d8a78c9a06314d6baa75e9c63f7 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:49:36 -0500 Subject: [PATCH 214/284] Update worlds/kh1/docs/en_Kingdom Hearts.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/en_Kingdom Hearts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index d27edc7a76bf..c6f92e5bbb61 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -7,7 +7,7 @@ Denho's original KH rando laid the foundation for the work here and makes everyt Other credits include: -Sonicshadowsilver2 for their work finding many memory addresses, working to idenitify and resolve bugs, and coverting the code base to the latest EGS update. +Sonicshadowsilver2 for their work finding many memory addresses, working to identify and resolve bugs, and converting the code base to the latest EGS update. Shananas and the rest of the OpenKH team for providing such an amazing tool for us to utilize on this project. From 78c46fa2824a1f90f647f136bcd855a0fe9efb04 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:49:55 -0500 Subject: [PATCH 215/284] Update worlds/kh1/docs/en_Kingdom Hearts.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/en_Kingdom Hearts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index c6f92e5bbb61..fa5624e5f6b5 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -44,7 +44,7 @@ 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 Dalmation rewards, and postcard rewards. +Locations the player can find items include chests, event rewards, Atlantica clams, level up rewards, 101 Dalmatian rewards, and postcard rewards. ## Which items can be in another player's world? From fb9aba5d3017788e2a195841d0d2c5aa5a7aa3e3 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:50:08 -0500 Subject: [PATCH 216/284] Update worlds/kh1/docs/en_Kingdom Hearts.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/en_Kingdom Hearts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index fa5624e5f6b5..671cf005f54d 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -66,7 +66,7 @@ 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 Hades Cup and the Platinum Match. Clearing all cups lets you challenge Ice Titan. +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. From 2f326baaa968dee8ddfee55ecfb8149777a2482e Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:50:19 -0500 Subject: [PATCH 217/284] Update worlds/kh1/docs/en_Kingdom Hearts.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/en_Kingdom Hearts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 671cf005f54d..f405f3f2686f 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -85,4 +85,4 @@ 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 settings. \ No newline at end of file +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. \ No newline at end of file From ee5946f5e7bf3a542fb4acf38d8db2828d046a17 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:50:30 -0500 Subject: [PATCH 218/284] Update worlds/kh1/docs/kh1_en.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/kh1_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index 4e6491810487..a4b026f2fdf8 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -1,6 +1,6 @@ # Kingdom Hearts Randomizer Setup Guide -##Setting up the required mods +## Setting up the required mods BEFORE MODDING, PLEASE INSTALL AND RUN KH1 AT LEAST ONCE. From 8b550eedaadee2bfbc49986b6bb6d18ff523c2ae Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:50:45 -0500 Subject: [PATCH 219/284] Update worlds/kh1/docs/kh1_en.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/kh1_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index a4b026f2fdf8..33310f540a8e 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -24,7 +24,7 @@ BEFORE MODDING, PLEASE INSTALL AND RUN KH1 AT LEAST ONCE. 2. Open `OpenKh.Tools.ModsManager.exe` -3. Click the drop down menu at the top-right and choose `Kingdom Hearts 1` +3. Click the drop-down menu at the top-right and choose `Kingdom Hearts 1` 4. Click `Mods>Install a New Mod` From b3aeb1e0c3261cb7f0279f648dd625f79048a191 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:51:00 -0500 Subject: [PATCH 220/284] Update worlds/kh1/docs/kh1_en.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/kh1_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index 33310f540a8e..9f346f60598b 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -47,7 +47,7 @@ an experience customized for their taste, and different players in the same mult you can customize your settings by visiting the [Kingdom Hearts Options Page](/games/Kingdom%20Hearts/player-options). -## Connect to the MultiServer +## Connect to the MultiWorld For first-time players, it is recommended to open your KH1 Client first before opening the game. From b3e6778ff092d36f7e308bfc68aa7018cdc3edb1 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:51:11 -0500 Subject: [PATCH 221/284] Update worlds/kh1/docs/kh1_en.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/docs/kh1_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index 9f346f60598b..70b16032beec 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -51,4 +51,4 @@ you can customize your settings by visiting the [Kingdom Hearts Options Page](/g For first-time players, it is recommended to open your KH1 Client first before opening the game. -On the title screen, open your KH1 Client and connect to your MultiServer. +On the title screen, open your KH1 Client and connect to your multiworld. From 5961c6b7873f98e87cd5f16e2531cd11d01c714e Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:51:25 -0500 Subject: [PATCH 222/284] Update worlds/kh1/test/test_goal.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/test/test_goal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/test/test_goal.py b/worlds/kh1/test/test_goal.py index 09983cf497cc..6b501404feee 100644 --- a/worlds/kh1/test/test_goal.py +++ b/worlds/kh1/test/test_goal.py @@ -30,4 +30,4 @@ class TestPuppies(KH1TestBase): class TestFinalRest(KH1TestBase): options = { "Goal": 5, - } \ No newline at end of file + } From d6ce1219c5cb0a2fdc1adb6bcf672a6c677c117e Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:52:00 -0500 Subject: [PATCH 223/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 60607b65ae1e..d89cd397a7a1 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -170,11 +170,11 @@ class EXPMultiplier(NamedRange): """ display_name = "EXP Multiplier" default = 16 - range_start = default / 4 + range_start = default // 4 range_end = 128 special_range_names = { - "0.25x": int(default / 4), - "0.5x": int(default / 2), + "0.25x": int(default // 4), + "0.5x": int(default // 2), "1x": default, "2x": default * 2, "3x": default * 3, From b285fd109a044f2619eb748973e2b8f1b4c23090 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:52:16 -0500 Subject: [PATCH 224/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index d89cd397a7a1..da4623ff9000 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -153,7 +153,7 @@ class FinalRestDoor(Choice): class Puppies(Choice): """ - Determines how dalmation puppies are shuffled into the pool. + 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 From fefd9e6e7b4bcdcedea84917f6a799aa754432bd Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:52:38 -0500 Subject: [PATCH 225/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index da4623ff9000..eb5218aba366 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -88,7 +88,7 @@ class ItemSlotIncrease(Range): class Atlantica(Toggle): """ - Toggle whether to include Atlantica locations/items. + Toggle whether to include checks in Atlantica. """ display_name = "Atlantica" From dca455f9cee9f90ba2e60a8ed7be30d6804f7b99 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:52:50 -0500 Subject: [PATCH 226/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index eb5218aba366..c710a55ea232 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -94,7 +94,7 @@ class Atlantica(Toggle): class HundredAcreWood(Toggle): """ - Toggle whether to include checks in the 100 Acre Wood + Toggle whether to include checks in the 100 Acre Wood. """ display_name = "100 Acre Wood" From 1aed65b4be4599711c33653c1a9267b0c0d77a2d Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:53:10 -0500 Subject: [PATCH 227/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index c710a55ea232..2850b592b8d2 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -106,7 +106,8 @@ class SuperBosses(Toggle): class Cups(Toggle): """ - 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. + 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. """ display_name = "Cups" From 922e647a63b85ce0d17923c19a1943e6362aa6b3 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:53:38 -0500 Subject: [PATCH 228/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 2850b592b8d2..468e49a6e357 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -141,7 +141,7 @@ class EndoftheWorldUnlock(Choice): class FinalRestDoor(Choice): """Determines what conditions need to be met to manifest the door in Final Rest, allowing the player to challenge Ansem - Reports: A certain number of Ansem's Reports are required. That number is defined in another setting. + 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. From c68136dc5337838a148e750c3eff8277dc60f145 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:54:53 -0500 Subject: [PATCH 229/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 468e49a6e357..027c1c755a44 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -321,7 +321,7 @@ class InteractInBattle(Toggle): class AdvancedLogic(Toggle): """ - If on, logic may expect you to do advanced skips like combo master, dumbo, and other unusual methods for reaching locations. + 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" From 777b1ef80198b14397c352125d75f684721a2de4 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:55:38 -0500 Subject: [PATCH 230/284] Update worlds/kh1/Items.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Items.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index c584763903ef..76d355322cba 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -530,4 +530,4 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat category = item_table[item].category if category not in item_name_groups.keys(): item_name_groups[category] = set([]) - item_name_groups[category].add(item) \ No newline at end of file + item_name_groups[category].add(item) From 9641e8c73d28af919e0ebc8bd15d89c6e16172a0 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:57:32 -0500 Subject: [PATCH 231/284] Update worlds/kh1/Locations.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Locations.py | 1 - 1 file changed, 1 deletion(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 0b0f4d6f4804..af188f2ccc80 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -580,7 +580,6 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in location_table.items() if data.code} -location_name_groups: Dict[str, Set[str]] #Make location categories location_name_groups: Dict[str, Set[str]] = {} From 49ff4ae26b51a129299bd3a41bb4f3b084c323b5 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:58:27 -0500 Subject: [PATCH 232/284] Update worlds/kh1/Regions.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Regions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 7407d64d0e51..4812043e20f6 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -5,13 +5,13 @@ class KH1RegionData(NamedTuple): - locations: Optional[List[str]] + locations: List[str] region_exits: Optional[List[str]] def create_regions(multiworld: MultiWorld, player: int, options): regions: Dict[str, KH1RegionData] = { - "Menu": KH1RegionData(None, ["Awakening", "Levels"]), + "Menu": KH1RegionData([], ["Awakening", "Levels"]), "Awakening": KH1RegionData([], ["Destiny Islands"]), "Destiny Islands": KH1RegionData([], ["Traverse Town"]), "Traverse Town": KH1RegionData([], ["World Map"]), From 582903edc3493b7b34fa85517e9938f75c5acb0d Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 12:59:42 -0500 Subject: [PATCH 233/284] Update worlds/kh1/Locations.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Locations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index af188f2ccc80..d32407f1f47b 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -587,4 +587,4 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: category = location_table[location].category if category not in location_name_groups.keys(): location_name_groups[category] = set([]) - location_name_groups[category].add(location) \ No newline at end of file + location_name_groups[category].add(location) From be67da542b5057fe561dffe8f6aa85d66fd1e0ab Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:01:07 -0500 Subject: [PATCH 234/284] Update worlds/kh1/Locations.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Locations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index d32407f1f47b..9ab925016974 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -586,5 +586,5 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: for location in location_table.keys(): category = location_table[location].category if category not in location_name_groups.keys(): - location_name_groups[category] = set([]) + location_name_groups[category] = set() location_name_groups[category].add(location) From d3f0a13d7264a53fd68599b34f3f30c32d2c863f Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:02:04 -0500 Subject: [PATCH 235/284] Update worlds/kh1/Items.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Items.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 76d355322cba..b1936a531228 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -529,5 +529,5 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat for item in item_table.keys(): category = item_table[item].category if category not in item_name_groups.keys(): - item_name_groups[category] = set([]) + item_name_groups[category] = set() item_name_groups[category].add(item) From a40a499d9e0cd1652a3f0b2fc05a10606b9a5172 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:02:40 -0500 Subject: [PATCH 236/284] Update worlds/kh1/Regions.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Regions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 4812043e20f6..54895f82d795 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -475,7 +475,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): 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')) + 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") From 10096e7803b46515aef4fede09a18e7e7c3c76fa Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:03:47 -0500 Subject: [PATCH 237/284] Update worlds/kh1/Regions.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Regions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 54895f82d795..b1694d6da87f 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -238,7 +238,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Monstro"].locations.append("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest") regions["Monstro"].locations.append("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest") 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 I Goofy Cheer Event") regions["Monstro"].locations.append("Monstro Defeat Parasite Cage II Stop Event") regions["Monstro"].locations.append("Monstro Mouth Boat Deck Chest") regions["Monstro"].locations.append("Monstro Mouth Green Trinity Top of Boat Chest") From e6b966516f5cb6d77f2fea6fb03d1aee55e14a0b Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:05:16 -0500 Subject: [PATCH 238/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 101924e1ddcc..2049fc17d2c3 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -2070,4 +2070,4 @@ def set_rules(kh1world): multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and (has_reports(state, player, eotw_required_reports) or has_item(state, player,"End of the World")) multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") - multiworld.completion_condition[player] = lambda state: state.has("Victory", player) \ No newline at end of file + multiworld.completion_condition[player] = lambda state: state.has("Victory", player) From b672aeaaae22e43eced7911ddff0bef70515df8d Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:07:42 -0500 Subject: [PATCH 239/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 2049fc17d2c3..e2106c91261f 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -121,7 +121,7 @@ def has_keyblade(state: CollectionState, player: int, keyblade_required: bool, i def can_dumbo_skip(state: CollectionState, player: int) -> bool: return ( state.has("Dumbo", player) - and state.has_group("Magic", player, 1) + and state.has_group("Magic", player) ) def has_oogie_manor(state: CollectionState, player: int, advanced_logic: bool) -> bool: From 12f930d6898caff63684883c3c68dda1c4671eff Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:09:25 -0500 Subject: [PATCH 240/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index e2106c91261f..691bb2eeff04 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -82,7 +82,7 @@ def has_offensive_magic(state: CollectionState, player: int) -> bool: def has_reports(state: CollectionState, player: int, eotw_required_reports: int) -> bool: return state.has_group("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): +def has_final_rest_door(state: CollectionState, player: int, final_rest_door_requirement: str, final_rest_door_required_reports: int, keyblades_unlock_chests: bool): if final_rest_door_requirement == "reports": return state.has_group("Reports", player, final_rest_door_required_reports) if final_rest_door_requirement == "puppies": From f001f5fe51ff340629dbc1e8695b0f3f6e4d197f Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:12:15 -0500 Subject: [PATCH 241/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 691bb2eeff04..67f00ea51fa7 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -52,12 +52,12 @@ def has_postcards(state: CollectionState, player: int, postcards_required: int) return state.has("Postcard", player, postcards_required) def has_puppies(state: CollectionState, player: int, puppies_required: int) -> bool: - puppies_available = state.count_from_list(SINGLE_PUPPIES, player) - puppies_available = puppies_available + (state.count_from_list(TRIPLE_PUPPIES, player) * 3) + puppies_available = state.count_from_list_unique(SINGLE_PUPPIES, player) + puppies_available = puppies_available + (state.count_from_list_unique(TRIPLE_PUPPIES, player) * 3) return (puppies_available >= puppies_required) or state.has("All Puppies", player) def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> bool: - return state.count_from_list(TORN_PAGES, player) >= pages_required + return state.count_from_list_unique(TORN_PAGES, player) >= pages_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) From 6cf4d6ebf86c714b6c31fadb08ddba93c7f843bd Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:13:01 -0500 Subject: [PATCH 242/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 67f00ea51fa7..9c3a27b1473b 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,4 +1,4 @@ -from BaseClasses import CollectionState, MultiWorld +from BaseClasses import CollectionState SINGLE_PUPPIES = [] for i in range(1,100): From 2cabd8cf68201061db9ade2c6edcbe9d2471819b Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:14:07 -0500 Subject: [PATCH 243/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 9c3a27b1473b..4d5ac210c40a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -80,7 +80,7 @@ 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("Reports", player, eotw_required_reports) + 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): if final_rest_door_requirement == "reports": From b3a2513ef4252b22cc3850492d93d084f66f0823 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:19:10 -0500 Subject: [PATCH 244/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 4d5ac210c40a..30d078f70c69 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -84,7 +84,7 @@ def has_reports(state: CollectionState, player: int, eotw_required_reports: int) def has_final_rest_door(state: CollectionState, player: int, final_rest_door_requirement: str, final_rest_door_required_reports: int, keyblades_unlock_chests: bool): if final_rest_door_requirement == "reports": - return state.has_group("Reports", player, final_rest_door_required_reports) + return state.has_group_unique("Reports", player, final_rest_door_required_reports) if final_rest_door_requirement == "puppies": return has_puppies(state, player, 99) if final_rest_door_requirement == "postcards": From 1f6c3c3091fd34dc97f2c96aa054421328bdfd01 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:20:27 -0500 Subject: [PATCH 245/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 30d078f70c69..4cb14e2c2f4a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -101,7 +101,7 @@ def has_final_rest_door(state: CollectionState, player: int, final_rest_door_req def has_defensive_tools(state: CollectionState, player: int) -> bool: return ( ( - state.count("Progressive Cure", player) >= 2 + state.has("Progressive Cure", player, 2) and state.has("Leaf Bracer", player) and state.has("Dodge Roll", player) ) From e6c5af4328b877775996f0961ad76a18b57e0436 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:20:50 -0500 Subject: [PATCH 246/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 4cb14e2c2f4a..5f650e1b0ef5 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -108,7 +108,7 @@ def has_defensive_tools(state: CollectionState, player: int) -> bool: and ( state.has("Second Chance", player) or state.has("MP Rage", player) - or state.count("Progressive Aero", player) >= 2 + or state.has("Progressive Aero", player, 2) ) ) From 86c48e649c8d42c8560d3ced57bde8f504dccdd9 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:21:18 -0500 Subject: [PATCH 247/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 5f650e1b0ef5..656421b524ed 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -113,10 +113,7 @@ def has_defensive_tools(state: CollectionState, player: int) -> bool: ) def has_keyblade(state: CollectionState, player: int, keyblade_required: bool, item: str) -> bool: - if keyblade_required: - return state.has(item, player) - else: - return True + return not keyblade_required or state.has(item, player) def can_dumbo_skip(state: CollectionState, player: int) -> bool: return ( From f04eab91f49ac593f3714c701bbf110b4b25d585 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:21:58 -0500 Subject: [PATCH 248/284] Update worlds/kh1/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index a805e8b1d56b..cde5773f1a0e 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -22,8 +22,8 @@ class KH1Web(WebWorld): theme = "ocean" tutorials = [Tutorial( "Multiworld Setup Guide", - "A guide to setting up the Kingdom Hearts Randomizer software on your computer. This guide covers single-player, " - "multiworld, and related software.", + "A guide to setting up the Kingdom Hearts Randomizer software on your computer." + "This guide covers single-player, multiworld, and related software.", "English", "kh1_en.md", "kh1/en", From e7c94751de52b0065337bb889fd262d086fb1db1 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:22:21 -0500 Subject: [PATCH 249/284] Update worlds/kh1/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index cde5773f1a0e..603963d0da4d 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -57,7 +57,7 @@ def create_items(self): possible_starting_worlds.append("Atlantica") 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, len(possible_starting_worlds))) + starting_worlds = self.random.sample(possible_starting_worlds.value, min(self.options.starting_worlds, len(possible_starting_worlds))) for starting_world in starting_worlds: self.multiworld.push_precollected(self.create_item(starting_world)) From c873d3a383b85504b81c293418e31f072be0c236 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:23:05 -0500 Subject: [PATCH 250/284] Update worlds/kh1/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 603963d0da4d..a2d7948c2f5b 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -91,7 +91,7 @@ def create_items(self): level_up_locations = list(get_locations_by_category("Levels").keys()) self.random.shuffle(level_up_item_pool) - starting_level_for_stats_only = self.options.force_stats_on_levels - 1 + starting_level_for_stats_only = self.options.force_stats_on_levels.value - 1 while len(level_up_item_pool) > 0 and starting_level_for_stats_only < self.options.level_checks: self.multiworld.get_location(level_up_locations[starting_level_for_stats_only], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) starting_level_for_stats_only += 1 From 7f303d044986fcc661aa2573f98d49bd8e685500 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:23:35 -0500 Subject: [PATCH 251/284] Update worlds/kh1/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index a2d7948c2f5b..55b84f97cf7d 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -233,10 +233,10 @@ def fill_slot_data(self) -> dict: "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, self.options.keyblade_max_str) - max_str_bonus = max(self.options.keyblade_min_str, self.options.keyblade_max_str) - min_mp_bonus = min(self.options.keyblade_min_mp, self.options.keyblade_max_mp) - max_mp_bonus = max(self.options.keyblade_min_mp, self.options.keyblade_max_mp) + 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) + 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) slot_data["keyblade_stats"] = "" for i in range(22): if i < 4 and self.options.bad_starting_weapons: From 8f128553fbd3e310a867b7030a09e32c395ff1b1 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:23:59 -0500 Subject: [PATCH 252/284] Update worlds/kh1/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 55b84f97cf7d..21e9b6288103 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -97,7 +97,7 @@ def create_items(self): starting_level_for_stats_only += 1 #Calculate prefilled locations and items - if True: #Allow notepad++ to collpase this section + if True: #Allow notepad++ to collapse this section prefilled_items = [] prefilled_locations = 1 #Victory if self.options.junk_in_missable_locations: From e7785272f94a140eb1a068e5a4b9fac52082318e Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:45:03 -0500 Subject: [PATCH 253/284] Update worlds/kh1/__init__.py Co-authored-by: Doug Hoskisson --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 21e9b6288103..f805b7542595 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -57,7 +57,7 @@ def create_items(self): possible_starting_worlds.append("Atlantica") 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.value, min(self.options.starting_worlds, len(possible_starting_worlds))) + 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)) From d53f9aa0ba30acf67da240a5e5252d3fd4e9113d Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 14:49:34 -0500 Subject: [PATCH 254/284] Fix so many suggestions --- worlds/kh1/Items.py | 991 +++++++++++++------------- worlds/kh1/Locations.py | 2 +- worlds/kh1/Options.py | 47 +- worlds/kh1/Rules.py | 1461 +++++++++++++++++++-------------------- 4 files changed, 1235 insertions(+), 1266 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index b1936a531228..5040aec4cbc6 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -9,8 +9,7 @@ class KH1Item(Item): class KH1ItemData(NamedTuple): category: str - sub: str = "None" - code: Optional[int] = None + code: int classification: ItemClassification = ItemClassification.filler max_quantity: int = 1 weight: int = 1 @@ -26,500 +25,500 @@ def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemDat item_table: Dict[str, KH1ItemData] = { - "Victory": KH1ItemData("VIC", code = 264_0000, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, weight = 10), - "Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, weight = 10), - "Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, weight = 10), - "Elixir": KH1ItemData("Item", code = 264_1004, classification = ItemClassification.filler, weight = 10), - #"B05": KH1ItemData("Item", code = 264_1005, classification = ItemClassification.filler, weight = 10), - "Mega-Potion": KH1ItemData("Item", code = 264_1006, classification = ItemClassification.filler, weight = 10), - "Mega-Ether": KH1ItemData("Item", code = 264_1007, classification = ItemClassification.filler, weight = 10), - "Megalixir": KH1ItemData("Item", code = 264_1008, classification = ItemClassification.filler, weight = 10), - #"Fury Stone": KH1ItemData("Synthesis", code = 264_1009, classification = ItemClassification.filler, weight = 10), - #"Power Stone": KH1ItemData("Synthesis", code = 264_1010, classification = ItemClassification.filler, weight = 10), - #"Energy Stone": KH1ItemData("Synthesis", code = 264_1011, classification = ItemClassification.filler, weight = 10), - #"Blazing Stone": KH1ItemData("Synthesis", code = 264_1012, classification = ItemClassification.filler, weight = 10), - #"Frost Stone": KH1ItemData("Synthesis", code = 264_1013, classification = ItemClassification.filler, weight = 10), - #"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, weight = 10), - #"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, weight = 10), - #"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, weight = 10), - "Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"A59": KH1ItemData("Accessory", code = 264_1075, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"A60": KH1ItemData("Accessory", code = 264_1076, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"A61": KH1ItemData("Accessory", code = 264_1077, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Dream Shield (Goofy)": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Genie": KH1ItemData("Weapons", code = 264_1137, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"No Weapon": KH1ItemData("Weapons", code = 264_1138, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"No Weapon": KH1ItemData("Weapons", code = 264_1139, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Tinker Bell": KH1ItemData("Weapons", code = 264_1140, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Claws": KH1ItemData("Weapons", code = 264_1141, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "Tent": KH1ItemData("Camping", code = 264_1142, classification = ItemClassification.filler, weight = 10), - "Camping Set": KH1ItemData("Camping", code = 264_1143, classification = ItemClassification.filler, weight = 10), - "Cottage": KH1ItemData("Camping", code = 264_1144, classification = ItemClassification.filler, weight = 10), - #"C04": KH1ItemData("Camping", code = 264_1145, classification = ItemClassification.filler, weight = 10), - #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, weight = 10), - #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, weight = 10), - #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, weight = 10), - "Ansem's Report 11": KH1ItemData("Reports", code = 264_1149, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 12": KH1ItemData("Reports", code = 264_1150, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 13": KH1ItemData("Reports", code = 264_1151, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, weight = 10), - "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, weight = 10), - "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, weight = 10), - #"Serenity Power": KH1ItemData("Synthesis", code = 264_1155, classification = ItemClassification.filler, weight = 10), - #"Dark Matter": KH1ItemData("Synthesis", code = 264_1156, classification = ItemClassification.filler, weight = 10), - #"Mythril Stone": KH1ItemData("Synthesis", code = 264_1157, classification = ItemClassification.filler, weight = 10), - "Fire Arts": KH1ItemData("Key", code = 264_1158, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Blizzard Arts": KH1ItemData("Key", code = 264_1159, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Thunder Arts": KH1ItemData("Key", code = 264_1160, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Cure Arts": KH1ItemData("Key", code = 264_1161, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Gravity Arts": KH1ItemData("Key", code = 264_1162, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Stop Arts": KH1ItemData("Key", code = 264_1163, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Aero Arts": KH1ItemData("Key", code = 264_1164, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Shiitank Rank": KH1ItemData("Synthesis", code = 264_1165, classification = ItemClassification.filler, weight = 10), - #"Matsutake Rank": KH1ItemData("Synthesis", code = 264_1166, classification = ItemClassification.filler, weight = 10), - #"Mystery Mold": KH1ItemData("Synthesis", code = 264_1167, classification = ItemClassification.filler, weight = 10), - "Ansem's Report 1": KH1ItemData("Reports", code = 264_1168, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 2": KH1ItemData("Reports", code = 264_1169, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 3": KH1ItemData("Reports", code = 264_1170, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 4": KH1ItemData("Reports", code = 264_1171, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 5": KH1ItemData("Reports", code = 264_1172, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 6": KH1ItemData("Reports", code = 264_1173, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 7": KH1ItemData("Reports", code = 264_1174, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 8": KH1ItemData("Reports", code = 264_1175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 9": KH1ItemData("Reports", code = 264_1176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Ansem's Report 10": KH1ItemData("Reports", code = 264_1177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Khama Vol. 8": KH1ItemData("Key", code = 264_1178, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Salegg Vol. 6": KH1ItemData("Key", code = 264_1179, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Azal Vol. 3": KH1ItemData("Key", code = 264_1180, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Mava Vol. 3": KH1ItemData("Key", code = 264_1181, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Mava Vol. 6": KH1ItemData("Key", code = 264_1182, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 6, weight = 10), - #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Log": KH1ItemData("Key", code = 264_1192, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Cloth": KH1ItemData("Key", code = 264_1193, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Rope": KH1ItemData("Key", code = 264_1194, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Seagull Egg": KH1ItemData("Key", code = 264_1195, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Fish": KH1ItemData("Key", code = 264_1196, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Mushroom": KH1ItemData("Key", code = 264_1197, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Coconut": KH1ItemData("Key", code = 264_1198, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Drinking Water": KH1ItemData("Key", code = 264_1199, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Navi-G Piece 1": KH1ItemData("Key", code = 264_1200, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Navi-G Piece 2": KH1ItemData("Key", code = 264_1201, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Navi-Gummi Unused": KH1ItemData("Key", code = 264_1202, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 10, weight = 10), - "Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 4": KH1ItemData("Torn Pages", code = 264_1215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Torn Page 5": KH1ItemData("Torn Pages", code = 264_1216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Slides": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Pretty Stone": KH1ItemData("Synthesis", code = 264_1231, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Lucid Shard": KH1ItemData("Synthesis", code = 264_1233, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Lucid Gem": KH1ItemData("Synthesis", code = 264_1234, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Lucid Crystal": KH1ItemData("Synthesis", code = 264_1235, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Spirit Shard": KH1ItemData("Synthesis", code = 264_1236, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Spirit Gem": KH1ItemData("Synthesis", code = 264_1237, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Power Shard": KH1ItemData("Synthesis", code = 264_1238, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Power Gem": KH1ItemData("Synthesis", code = 264_1239, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Power Crystal": KH1ItemData("Synthesis", code = 264_1240, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Blaze Shard": KH1ItemData("Synthesis", code = 264_1241, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Blaze Gem": KH1ItemData("Synthesis", code = 264_1242, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Frost Shard": KH1ItemData("Synthesis", code = 264_1243, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Frost Gem": KH1ItemData("Synthesis", code = 264_1244, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Thunder Shard": KH1ItemData("Synthesis", code = 264_1245, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Thunder Gem": KH1ItemData("Synthesis", code = 264_1246, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Shiny Crystal": KH1ItemData("Synthesis", code = 264_1247, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Bright Shard": KH1ItemData("Synthesis", code = 264_1248, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Bright Gem": KH1ItemData("Synthesis", code = 264_1249, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Bright Crystal": KH1ItemData("Synthesis", code = 264_1250, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Mystery Goo": KH1ItemData("Synthesis", code = 264_1251, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Gale": KH1ItemData("Synthesis", code = 264_1252, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Mythril Shard": KH1ItemData("Synthesis", code = 264_1253, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Mythril": KH1ItemData("Synthesis", code = 264_1254, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - #"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, max_quantity = 1, weight = 10), - "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Progressive Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 2, weight = 10), - "Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, max_quantity = 0, weight = 10), - "Puppy 01": KH1ItemData("Puppies", code = 264_2101, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 02": KH1ItemData("Puppies", code = 264_2102, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 03": KH1ItemData("Puppies", code = 264_2103, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 04": KH1ItemData("Puppies", code = 264_2104, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 05": KH1ItemData("Puppies", code = 264_2105, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 06": KH1ItemData("Puppies", code = 264_2106, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 07": KH1ItemData("Puppies", code = 264_2107, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 08": KH1ItemData("Puppies", code = 264_2108, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 09": KH1ItemData("Puppies", code = 264_2109, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 10": KH1ItemData("Puppies", code = 264_2110, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 11": KH1ItemData("Puppies", code = 264_2111, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 12": KH1ItemData("Puppies", code = 264_2112, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 13": KH1ItemData("Puppies", code = 264_2113, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 14": KH1ItemData("Puppies", code = 264_2114, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 15": KH1ItemData("Puppies", code = 264_2115, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 16": KH1ItemData("Puppies", code = 264_2116, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 17": KH1ItemData("Puppies", code = 264_2117, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 18": KH1ItemData("Puppies", code = 264_2118, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 19": KH1ItemData("Puppies", code = 264_2119, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 20": KH1ItemData("Puppies", code = 264_2120, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 21": KH1ItemData("Puppies", code = 264_2121, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 22": KH1ItemData("Puppies", code = 264_2122, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 23": KH1ItemData("Puppies", code = 264_2123, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 24": KH1ItemData("Puppies", code = 264_2124, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 25": KH1ItemData("Puppies", code = 264_2125, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 26": KH1ItemData("Puppies", code = 264_2126, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 27": KH1ItemData("Puppies", code = 264_2127, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 28": KH1ItemData("Puppies", code = 264_2128, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 29": KH1ItemData("Puppies", code = 264_2129, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 30": KH1ItemData("Puppies", code = 264_2130, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 31": KH1ItemData("Puppies", code = 264_2131, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 32": KH1ItemData("Puppies", code = 264_2132, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 33": KH1ItemData("Puppies", code = 264_2133, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 34": KH1ItemData("Puppies", code = 264_2134, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 35": KH1ItemData("Puppies", code = 264_2135, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 36": KH1ItemData("Puppies", code = 264_2136, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 37": KH1ItemData("Puppies", code = 264_2137, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 38": KH1ItemData("Puppies", code = 264_2138, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 39": KH1ItemData("Puppies", code = 264_2139, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 40": KH1ItemData("Puppies", code = 264_2140, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 41": KH1ItemData("Puppies", code = 264_2141, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 42": KH1ItemData("Puppies", code = 264_2142, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 43": KH1ItemData("Puppies", code = 264_2143, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 44": KH1ItemData("Puppies", code = 264_2144, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 45": KH1ItemData("Puppies", code = 264_2145, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 46": KH1ItemData("Puppies", code = 264_2146, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 47": KH1ItemData("Puppies", code = 264_2147, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 48": KH1ItemData("Puppies", code = 264_2148, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 49": KH1ItemData("Puppies", code = 264_2149, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 50": KH1ItemData("Puppies", code = 264_2150, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 51": KH1ItemData("Puppies", code = 264_2151, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 52": KH1ItemData("Puppies", code = 264_2152, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 53": KH1ItemData("Puppies", code = 264_2153, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 54": KH1ItemData("Puppies", code = 264_2154, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 55": KH1ItemData("Puppies", code = 264_2155, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 56": KH1ItemData("Puppies", code = 264_2156, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 57": KH1ItemData("Puppies", code = 264_2157, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 58": KH1ItemData("Puppies", code = 264_2158, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 59": KH1ItemData("Puppies", code = 264_2159, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 60": KH1ItemData("Puppies", code = 264_2160, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 61": KH1ItemData("Puppies", code = 264_2161, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 62": KH1ItemData("Puppies", code = 264_2162, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 63": KH1ItemData("Puppies", code = 264_2163, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 64": KH1ItemData("Puppies", code = 264_2164, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 65": KH1ItemData("Puppies", code = 264_2165, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 66": KH1ItemData("Puppies", code = 264_2166, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 67": KH1ItemData("Puppies", code = 264_2167, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 68": KH1ItemData("Puppies", code = 264_2168, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 69": KH1ItemData("Puppies", code = 264_2169, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 70": KH1ItemData("Puppies", code = 264_2170, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 71": KH1ItemData("Puppies", code = 264_2171, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 72": KH1ItemData("Puppies", code = 264_2172, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 73": KH1ItemData("Puppies", code = 264_2173, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 74": KH1ItemData("Puppies", code = 264_2174, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 75": KH1ItemData("Puppies", code = 264_2175, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 76": KH1ItemData("Puppies", code = 264_2176, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 77": KH1ItemData("Puppies", code = 264_2177, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 78": KH1ItemData("Puppies", code = 264_2178, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 79": KH1ItemData("Puppies", code = 264_2179, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 80": KH1ItemData("Puppies", code = 264_2180, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 81": KH1ItemData("Puppies", code = 264_2181, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 82": KH1ItemData("Puppies", code = 264_2182, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 83": KH1ItemData("Puppies", code = 264_2183, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 84": KH1ItemData("Puppies", code = 264_2184, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 85": KH1ItemData("Puppies", code = 264_2185, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 86": KH1ItemData("Puppies", code = 264_2186, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 87": KH1ItemData("Puppies", code = 264_2187, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 88": KH1ItemData("Puppies", code = 264_2188, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 89": KH1ItemData("Puppies", code = 264_2189, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 90": KH1ItemData("Puppies", code = 264_2190, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 91": KH1ItemData("Puppies", code = 264_2191, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 92": KH1ItemData("Puppies", code = 264_2192, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 93": KH1ItemData("Puppies", code = 264_2193, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 94": KH1ItemData("Puppies", code = 264_2194, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 95": KH1ItemData("Puppies", code = 264_2195, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 96": KH1ItemData("Puppies", code = 264_2196, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 97": KH1ItemData("Puppies", code = 264_2197, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 98": KH1ItemData("Puppies", code = 264_2198, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppy 99": KH1ItemData("Puppies", code = 264_2199, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 01-03": KH1ItemData("Puppies", code = 264_2201, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 04-06": KH1ItemData("Puppies", code = 264_2202, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 07-09": KH1ItemData("Puppies", code = 264_2203, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 10-12": KH1ItemData("Puppies", code = 264_2204, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 13-15": KH1ItemData("Puppies", code = 264_2205, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 16-18": KH1ItemData("Puppies", code = 264_2206, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 19-21": KH1ItemData("Puppies", code = 264_2207, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 22-24": KH1ItemData("Puppies", code = 264_2208, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 25-27": KH1ItemData("Puppies", code = 264_2209, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 28-30": KH1ItemData("Puppies", code = 264_2210, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 31-33": KH1ItemData("Puppies", code = 264_2211, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 34-36": KH1ItemData("Puppies", code = 264_2212, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 37-39": KH1ItemData("Puppies", code = 264_2213, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 40-42": KH1ItemData("Puppies", code = 264_2214, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 43-45": KH1ItemData("Puppies", code = 264_2215, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 46-48": KH1ItemData("Puppies", code = 264_2216, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 49-51": KH1ItemData("Puppies", code = 264_2217, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 52-54": KH1ItemData("Puppies", code = 264_2218, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 55-57": KH1ItemData("Puppies", code = 264_2219, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 58-60": KH1ItemData("Puppies", code = 264_2220, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 61-63": KH1ItemData("Puppies", code = 264_2221, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 64-66": KH1ItemData("Puppies", code = 264_2222, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 67-69": KH1ItemData("Puppies", code = 264_2223, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 70-72": KH1ItemData("Puppies", code = 264_2224, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 73-75": KH1ItemData("Puppies", code = 264_2225, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 76-78": KH1ItemData("Puppies", code = 264_2226, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 79-81": KH1ItemData("Puppies", code = 264_2227, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 82-84": KH1ItemData("Puppies", code = 264_2228, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 85-87": KH1ItemData("Puppies", code = 264_2229, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 88-90": KH1ItemData("Puppies", code = 264_2230, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 91-93": KH1ItemData("Puppies", code = 264_2231, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 94-96": KH1ItemData("Puppies", code = 264_2232, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Puppies 97-99": KH1ItemData("Puppies", code = 264_2233, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "All Puppies": KH1ItemData("Puppies", code = 264_2240, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2, weight = 10), - "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 4, weight = 10), - "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 2, weight = 10), - "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, max_quantity = 3, weight = 10), - #"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Strike Raid": KH1ItemData("Abilities", code = 264_3013, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Ragnarok": KH1ItemData("Abilities", code = 264_3014, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Trinity Limit": KH1ItemData("Abilities", code = 264_3015, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Cheer": KH1ItemData("Abilities", code = 264_3016, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Vortex": KH1ItemData("Abilities", code = 264_3017, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.progression, max_quantity = 2, weight = 10), - "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Charge": KH1ItemData("Abilities", code = 264_3029, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Rocket": KH1ItemData("Abilities", code = 264_3030, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Tornado": KH1ItemData("Abilities", code = 264_3031, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"MP Gift": KH1ItemData("Abilities", code = 264_3032, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Raging Boar": KH1ItemData("Abilities", code = 264_3033, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Asp's Bite": KH1ItemData("Abilities", code = 264_3034, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Healing Herb": KH1ItemData("Abilities", code = 264_3035, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Wind Armor": KH1ItemData("Abilities", code = 264_3036, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Crescent": KH1ItemData("Abilities", code = 264_3037, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Sandstorm": KH1ItemData("Abilities", code = 264_3038, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Applause!": KH1ItemData("Abilities", code = 264_3039, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Blazing Fury": KH1ItemData("Abilities", code = 264_3040, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Icy Terror": KH1ItemData("Abilities", code = 264_3041, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Bolts of Sorrow": KH1ItemData("Abilities", code = 264_3042, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Ghostly Scream": KH1ItemData("Abilities", code = 264_3043, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Humming Bird": KH1ItemData("Abilities", code = 264_3044, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Time-Out": KH1ItemData("Abilities", code = 264_3045, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Storm's Eye": KH1ItemData("Abilities", code = 264_3046, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Ferocious Lunge": KH1ItemData("Abilities", code = 264_3047, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Furious Bellow": KH1ItemData("Abilities", code = 264_3048, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Spiral Wave": KH1ItemData("Abilities", code = 264_3049, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Thunder Potion": KH1ItemData("Abilities", code = 264_3050, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Cure Potion": KH1ItemData("Abilities", code = 264_3051, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - #"Aero Potion": KH1ItemData("Abilities", code = 264_3052, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Slapshot": KH1ItemData("Abilities", code = 264_3053, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Sliding Dash": KH1ItemData("Abilities", code = 264_3054, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Hurricane Blast": KH1ItemData("Abilities", code = 264_3055, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Ripple Drive": KH1ItemData("Abilities", code = 264_3056, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, max_quantity = 4, weight = 10), - "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, max_quantity = 1, weight = 10), - "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Max MP Increase": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Max AP Increase": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Strength Increase": KH1ItemData("Level Up", code = 264_4004, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Defense Increase": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15, weight = 10), - "Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Tinker Bell": KH1ItemData("Summons", code = 264_5003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Mushu": KH1ItemData("Summons", code = 264_5004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Simba": KH1ItemData("Summons", code = 264_5005, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Progressive Fire": KH1ItemData("Magic", code = 264_6001, classification = ItemClassification.progression, max_quantity = 3, weight = 10), - "Progressive Blizzard": KH1ItemData("Magic", code = 264_6002, classification = ItemClassification.progression, max_quantity = 3, weight = 10), - "Progressive Thunder": KH1ItemData("Magic", code = 264_6003, classification = ItemClassification.progression, max_quantity = 3, weight = 10), - "Progressive Cure": KH1ItemData("Magic", code = 264_6004, classification = ItemClassification.progression, max_quantity = 3, weight = 10), - "Progressive Gravity": KH1ItemData("Magic", code = 264_6005, classification = ItemClassification.progression, max_quantity = 3, weight = 10), - "Progressive Stop": KH1ItemData("Magic", code = 264_6006, classification = ItemClassification.progression, max_quantity = 3, weight = 10), - "Progressive Aero": KH1ItemData("Magic", code = 264_6007, classification = ItemClassification.progression, max_quantity = 3, weight = 10), - #"Traverse Town": KH1ItemData("Worlds", code = 264_7001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Wonderland": KH1ItemData("Worlds", code = 264_7002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Olympus Coliseum": KH1ItemData("Worlds", code = 264_7003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Deep Jungle": KH1ItemData("Worlds", code = 264_7004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Agrabah": KH1ItemData("Worlds", code = 264_7005, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Halloween Town": KH1ItemData("Worlds", code = 264_7006, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Atlantica": KH1ItemData("Worlds", code = 264_7007, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Monstro": KH1ItemData("Worlds", code = 264_7011, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Blue Trinity": KH1ItemData("Trinities", code = 264_8001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Red Trinity": KH1ItemData("Trinities", code = 264_8002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Green Trinity": KH1ItemData("Trinities", code = 264_8003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Yellow Trinity": KH1ItemData("Trinities", code = 264_8004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "White Trinity": KH1ItemData("Trinities", code = 264_8005, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Phil Cup": KH1ItemData("Cups", code = 264_9001, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Pegasus Cup": KH1ItemData("Cups", code = 264_9002, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - "Hercules Cup": KH1ItemData("Cups", code = 264_9003, classification = ItemClassification.progression, max_quantity = 1, weight = 10), - #"Hades Cup": KH1ItemData("Cups", code = 264_9004, classification = ItemClassification.progression, max_quantity = 1, weight = 10), + "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, ), } event_item_table: Dict[str, KH1ItemData] = {} diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 9ab925016974..a36b50eb393c 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -11,7 +11,7 @@ class KH1Location(Location): class KH1LocationData(NamedTuple): category: str - code: Optional[int] = None + code: int def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 027c1c755a44..613136997808 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -4,7 +4,7 @@ class StrengthIncrease(Range): """ - Number of Strength Increases to add to the multiworld + 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. @@ -16,7 +16,7 @@ class StrengthIncrease(Range): class DefenseIncrease(Range): """ - Number of Defense Increases to add to the multiworld + 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. @@ -28,7 +28,7 @@ class DefenseIncrease(Range): class HPIncrease(Range): """ - Number of HP Increases to add to the multiworld + 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. @@ -40,7 +40,7 @@ class HPIncrease(Range): class APIncrease(Range): """ - Number of AP Increases to add to the multiworld + 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. @@ -52,7 +52,7 @@ class APIncrease(Range): class MPIncrease(Range): """ - Number of MP Increases to add to the multiworld + 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. @@ -64,7 +64,7 @@ class MPIncrease(Range): class AccessorySlotIncrease(Range): """ - Number of Accessory Slot Increases to add to the multiworld + 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. @@ -76,7 +76,7 @@ class AccessorySlotIncrease(Range): class ItemSlotIncrease(Range): """ - Number of Item Slot Increases to add to the multiworld + 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. @@ -132,19 +132,22 @@ class Goal(Choice): default = 3 class EndoftheWorldUnlock(Choice): - """Determines how End of the World is Unlocked""" + """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""" display_name = "End of the World Unlock" option_item = 0 option_reports = 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 + """Determines what conditions need to be met to manifest the door in Final Rest, allowing the player to challenge Ansem. - 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. + 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 """ display_name = "Final Rest Door" option_reports = 0 @@ -167,7 +170,7 @@ class Puppies(Choice): class EXPMultiplier(NamedRange): """ - Determines the multiplier to apply to EXP gained + Determines the multiplier to apply to EXP gained. """ display_name = "EXP Multiplier" default = 16 @@ -212,13 +215,13 @@ class ReportsInPool(Range): class RandomizeKeybladeStats(DefaultOnToggle): """ - Determines whether Keyblade stats should be randomized + Determines whether Keyblade stats should be randomized. """ display_name = "Randomize Keyblade Stats" class KeybladeMinStrength(Range): """ - Determines the minimum STR bonus a keyblade can have + Determines the minimum STR bonus a keyblade can have. """ display_name = "Keyblade Minimum STR Bonus" default = 3 @@ -227,7 +230,7 @@ class KeybladeMinStrength(Range): class KeybladeMaxStrength(Range): """ - Determines the maximum STR bonus a keyblade can have + Determines the maximum STR bonus a keyblade can have. """ display_name = "Keyblade Maximum STR Bonus" default = 14 @@ -236,7 +239,7 @@ class KeybladeMaxStrength(Range): class KeybladeMinMP(Range): """ - Determines the minimum MP bonus a keyblade can have + Determines the minimum MP bonus a keyblade can have. """ display_name = "Keyblade Minimum MP Bonus" default = -2 @@ -245,7 +248,7 @@ class KeybladeMinMP(Range): class KeybladeMaxMP(Range): """ - Determines the maximum MP bonus a keyblade can have + Determines the maximum MP bonus a keyblade can have. """ display_name = "Keyblade Maximum MP Bonus" default = 3 @@ -263,7 +266,7 @@ class LevelChecks(Range): 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 + 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. """ display_name = "Force Stats on Level Starting From" @@ -278,7 +281,7 @@ class ForceStatsOnLevels(NamedRange): 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 bad stats. """ display_name = "Bad Starting Weapons" @@ -315,7 +318,7 @@ class KeybladesUnlockChests(Toggle): class InteractInBattle(Toggle): """ - Allow Sora to talk, examine, and open chests in battle + Allow Sora to talk to people, examine objects, and open chests in battle. """ display_name = "Interact in Battle" diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 656421b524ed..db19248a1e1b 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,16 +1,8 @@ from BaseClasses import CollectionState -SINGLE_PUPPIES = [] -for i in range(1,100): - SINGLE_PUPPIES.append("Puppy " + str(i).rjust(2,"0")) - -TRIPLE_PUPPIES = [] -for i in range(1,34): - TRIPLE_PUPPIES.append("Puppies " + str(3*(i-1)+1).rjust(2, "0") + "-" + str(3*(i-1)+3).rjust(2, "0")) - -TORN_PAGES = [] -for i in range(1,6): - TORN_PAGES.append("Torn Page " + str(i)) +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)] def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keyblades_unlock_chests: bool) -> bool: worlds_acquired = 0.0 @@ -23,33 +15,13 @@ def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keybla worlds_acquired = worlds_acquired + 0.5 return worlds_acquired >= num_of_worlds -def has_slides(state: CollectionState, player: int) -> bool: - return state.has("Slides", player) - -def has_evidence(state: CollectionState, player: int) -> bool: - return state.has("Footprints", player) - -def can_glide(state: CollectionState, player: int) -> bool: - return state.has("Progressive Glide", player) or state.has("Superglide", player) - def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bool) -> bool: - return ( - state.has("Emblem Piece (Flame)", player) - and state.has("Emblem Piece (Chest)", player) - and state.has("Emblem Piece (Statue)", player) - and state.has("Emblem Piece (Fountain)", player) - and state.has("Hollow Bastion", player) - and has_x_worlds(state, player, 5, keyblades_unlock_chests) - ) - -def has_item(state: CollectionState, player: int, item: str) -> bool: - return state.has(item, player) - -def has_at_least(state: CollectionState, player: int, item: str, x: int) -> bool: - return state.has(item, player, x) - -def has_postcards(state: CollectionState, player: int, postcards_required: int) -> bool: - return state.has("Postcard", player, postcards_required) + 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) def has_puppies(state: CollectionState, player: int, puppies_required: int) -> bool: puppies_available = state.count_from_list_unique(SINGLE_PUPPIES, player) @@ -66,15 +38,14 @@ def has_all_summons(state: CollectionState, player: int) -> bool: return state.has_all({"Simba", "Bambi", "Genie", "Dumbo", "Mushu", "Tinker Bell"}, player) def has_all_magic_lvx(state: CollectionState, player: int, level) -> bool: - return ( - state.count("Progressive Fire", player) >= level - and state.count("Progressive Blizzard", player) >= level - and state.count("Progressive Thunder", player) >= level - and state.count("Progressive Cure", player) >= level - and state.count("Progressive Gravity", player) >= level - and state.count("Progressive Aero", player) >= level - and state.count("Progressive Stop", player) >= level - ) + return state.has_all_counts({ + "Progressive Fire": 3, + "Progressive Blizzard": 3, + "Progressive Thunder": 3, + "Progressive Cure": 3, + "Progressive Gravity": 3, + "Progressive Aero": 3, + "Progressive Stop": 3}, 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) @@ -88,26 +59,26 @@ def has_final_rest_door(state: CollectionState, player: int, final_rest_door_req if final_rest_door_requirement == "puppies": return has_puppies(state, player, 99) if final_rest_door_requirement == "postcards": - return has_postcards(state, player, 10) + 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) + 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: return ( ( state.has("Progressive Cure", player, 2) - and state.has("Leaf Bracer", player) + and state.has("Leaf Bracer", player) and state.has("Dodge Roll", player) - ) + ) and ( - state.has("Second Chance", player) - or state.has("MP Rage", player) + state.has("Second Chance", player) + or state.has("MP Rage", player) or state.has("Progressive Aero", player, 2) ) ) @@ -117,16 +88,16 @@ def has_keyblade(state: CollectionState, player: int, keyblade_required: bool, i def can_dumbo_skip(state: CollectionState, player: int) -> bool: return ( - state.has("Dumbo", player) + state.has("Dumbo", player) and state.has_group("Magic", player) ) def has_oogie_manor(state: CollectionState, player: int, advanced_logic: bool) -> bool: return ( - has_item(state, player, "Progressive Fire") - or (advanced_logic and has_at_least(state, player, "High Jump", 2)) - or (advanced_logic and has_item(state, player, "High Jump") and can_glide(state, player)) - ) + 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)) + ) def set_rules(kh1world): multiworld = kh1world.multiworld @@ -135,10 +106,10 @@ def set_rules(kh1world): 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 - + multiworld.get_location("Traverse Town 1st District Candle Puzzle Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and has_item(state, player, "Progressive Blizzard") + and state.has("Progressive Blizzard", player) ) multiworld.get_location("Traverse Town 1st District Accessory Shop Roof Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") @@ -172,12 +143,12 @@ def set_rules(kh1world): ) multiworld.get_location("Traverse Town Mystical House Yellow Trinity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and has_item(state, player, "Progressive Fire") + and state.has("Progressive Fire", player) and ( - has_item(state, player, "Yellow Trinity") - or (options.advanced_logic and has_item(state, player, "High Jump")) - or has_at_least(state, player, "High Jump", 2) + state.has("Yellow Trinity", player) + or (options.advanced_logic and state.has("High Jump", player)) + or state.has("High Jump", player, 2) ) ) multiworld.get_location("Traverse Town Accessory Shop Chest" , player).access_rule = lambda state: ( @@ -185,15 +156,15 @@ def set_rules(kh1world): ) multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and has_item(state, player, "White Trinity") + and state.has("White Trinity", player) ) multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and has_item(state, player, "Monstro") + and state.has("Monstro", player) and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + 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) ) @@ -201,51 +172,51 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") and ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") and ( - (has_item(state, player, "Blue Trinity") and can_glide(state, player)) - or (options.advanced_logic and can_glide(state, player)) + (state.has("Blue Trinity", player) and state.has("Progressive Glide", player)) + or (options.advanced_logic and state.has("Progressive Glide", player)) ) ) multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and + and ( - can_glide(state, player) - or + state.has("Progressive Glide", player) + or ( options.advanced_logic - and + and ( - (has_item(state, player, "High Jump") and has_item(state, player, "Yellow Trinity")) - or has_at_least(state, player, "High Jump", 2) + (state.has("High Jump", player) and state.has("Yellow Trinity", player)) + or state.has("High Jump", player, 2) ) - and has_item(state, player, "Combo Master") + and state.has("Combo Master", player) ) or ( options.advanced_logic - and has_item(state, player, "Mermaid Kick") + and state.has("Mermaid Kick", player) ) ) - and has_item(state, player, "Progressive Fire") + and state.has("Progressive Fire", player) ) multiworld.get_location("Traverse Town Alleyway Behind Crates Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and has_item(state, player, "Red Trinity") + and state.has("Red Trinity", player) ) multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") and ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: ( @@ -253,7 +224,7 @@ def set_rules(kh1world): ) multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_item(state, player, "Green Trinity") + and state.has("Green Trinity", player) ) multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 1 Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") @@ -267,55 +238,55 @@ def set_rules(kh1world): ) multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_item(state, player, "Green Trinity") + and state.has("Green Trinity", player) ) multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + and ( - has_evidence(state, player) - or has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("Footprints", player) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + and ( - has_evidence(state, player) - or has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("Footprints", player) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + and ( - has_evidence(state, player) - or has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("Footprints", player) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("Wonderland Lotus Forest Thunder Plant Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_item(state, player, "Progressive Thunder") - and has_evidence(state, player) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and state.has("Progressive Thunder", player) + and state.has("Footprints", player) ) multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_item(state, player, "Progressive Thunder") - and has_evidence(state, player) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and state.has("Progressive Thunder", player) + and state.has("Footprints", player) ) multiworld.get_location("Wonderland Lotus Forest Glide Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and ( - can_glide(state, player) + state.has("Progressive Glide", player) or ( options.advanced_logic - and (has_item(state, player, "High Jump") or can_dumbo_skip(state, player)) - and has_evidence(state, player) + and (state.has("High Jump", player) or can_dumbo_skip(state, player)) + and state.has("Footprints", player) ) ) ) @@ -323,78 +294,78 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") ) multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and ( ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) or options.advanced_logic ) ) multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_evidence(state, player) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and state.has("Footprints", player) ) multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and ( - can_glide(state, player) - or + state.has("Progressive Glide", player) + or ( options.advanced_logic - and has_item(state, player, "High Jump") - and has_evidence(state, player) + and state.has("High Jump", player) + and state.has("Footprints", player) ) ) ) multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and ( - can_glide(state, player) - or + state.has("Progressive Glide", player) + or ( options.advanced_logic - and has_item(state, player, "High Jump") - and has_evidence(state, player) + and state.has("High Jump", player) + and state.has("Footprints", player) ) ) ) multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and ( - has_evidence(state, player) - or (options.advanced_logic and can_glide(state, player)) - or has_at_least(state, player, "High Jump", 2) + state.has("Footprints", player) + or (options.advanced_logic and state.has("Progressive Glide", player)) + or state.has("High Jump", player, 2) ) ) multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and ( - can_glide(state, player) - or + state.has("Progressive Glide", player) + or ( - has_at_least(state, player, "High Jump", 3) - and has_evidence(state, player) + state.has("High Jump", player, 3) + and state.has("Footprints", player) ) - or + or ( options.advanced_logic - and has_item(state, player, "High Jump") - and has_evidence(state, player) - and has_item(state, player, "Combo Master") + and state.has("High Jump", player) + and state.has("Footprints", player) + and state.has("Combo Master", player) ) ) ) multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_item(state, player, "White Trinity") - and has_evidence(state, player) + has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") + and state.has("White Trinity", player) + and state.has("Footprints", player) ) multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") @@ -409,11 +380,11 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") ) multiworld.get_location("Deep Jungle Hippo's Lagoon Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) or options.advanced_logic ) ) @@ -424,39 +395,39 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") ) multiworld.get_location("Deep Jungle Climbing Trees Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_item(state, player, "Blue Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and state.has("Blue Trinity", player) ) multiworld.get_location("Deep Jungle Tunnel Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") ) multiworld.get_location("Deep Jungle Cavern of Hearts White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_item(state, player, "White Trinity") - and has_slides(state, player) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and state.has("White Trinity", player) + and state.has("Slides", player) ) multiworld.get_location("Deep Jungle Camp Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_item(state, player, "Blue Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and state.has("Blue Trinity", player) ) multiworld.get_location("Deep Jungle Tent Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") ) multiworld.get_location("Deep Jungle Waterfall Cavern Low Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_slides(state, player) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and state.has("Slides", player) ) multiworld.get_location("Deep Jungle Waterfall Cavern Middle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_slides(state, player) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and state.has("Slides", player) ) multiworld.get_location("Deep Jungle Waterfall Cavern High Wall Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_slides(state, player) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and state.has("Slides", player) ) multiworld.get_location("Deep Jungle Waterfall Cavern High Middle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and has_slides(state, player) + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and state.has("Slides", player) ) multiworld.get_location("Deep Jungle Cliff Right Cliff Left Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") @@ -465,10 +436,10 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") ) multiworld.get_location("Deep Jungle Tree House Suspended Boat Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") + and ( - can_glide(state, player) + state.has("Progressive Glide", player) or options.advanced_logic ) ) @@ -497,11 +468,11 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") ) multiworld.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) or (options.advanced_logic and can_dumbo_skip(state, player)) ) ) @@ -509,37 +480,37 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") ) multiworld.get_location("Agrabah Palace Gates High Opposite Palace Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and ( - has_item(state, player, "High Jump") + state.has("High Jump", player) or options.advanced_logic ) ) multiworld.get_location("Agrabah Palace Gates High Close to Palace Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and ( ( - has_item(state, player, "High Jump") - and can_glide(state, player) + state.has("High Jump", player) + and state.has("Progressive Glide", player) or ( options.advanced_logic - and + and ( - has_item(state, player, "Combo Master") + state.has("Combo Master", player) or can_dumbo_skip(state, player) ) ) ) - or has_at_least(state, player, "High Jump", 3) - or (options.advanced_logic and can_glide(state, player)) + or state.has("High Jump", player, 3) + or (options.advanced_logic and state.has("Progressive Glide", player)) ) ) multiworld.get_location("Agrabah Storage Green Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and has_item(state, player, "Green Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and state.has("Green Trinity", player) ) multiworld.get_location("Agrabah Storage Behind Barrel Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") @@ -548,13 +519,13 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") ) multiworld.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and ( - can_glide(state, player) - or (options.advanced_logic and has_item(state, player, "Combo Master")) + 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 has_at_least(state, player, "High Jump", 2) + or state.has("High Jump", player, 2) ) ) multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: ( @@ -567,11 +538,11 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") ) multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) or options.advanced_logic ) ) @@ -609,25 +580,25 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") ) multiworld.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and has_item(state, player, "Blue Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and state.has("Blue Trinity", player) ) multiworld.get_location("Agrabah Cave of Wonders Hidden Room Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and ( - has_item(state, player, "Yellow Trinity") - or has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + state.has("Yellow Trinity", player) + or state.has("High Jump", player) + or (options.advanced_logic and state.has("Progressive Glide", player)) ) ) multiworld.get_location("Agrabah Cave of Wonders Hidden Room Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and ( - has_item(state, player, "Yellow Trinity") - or has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + state.has("Yellow Trinity", player) + or state.has("High Jump", player) + or (options.advanced_logic and state.has("Progressive Glide", player)) ) ) multiworld.get_location("Agrabah Aladdin's House Main Street Entrance Chest" , player).access_rule = lambda state: ( @@ -637,222 +608,222 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") ) multiworld.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and has_item(state, player, "White Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") + and state.has("White Trinity", player) ) multiworld.get_location("Monstro Chamber 6 Other Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and has_item(state, player, "Combo Master")) + state.has("High Jump", player) + or (options.advanced_logic and state.has("Combo Master", player)) ) ) multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and ( - has_item(state, player, "High Jump") + state.has("High Jump", player) or options.advanced_logic ) ) multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and has_item(state, player, "Combo Master")) + state.has("High Jump", player) + or (options.advanced_logic and state.has("Combo Master", player)) ) ) multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") ) multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "White Trinity") - and has_item(state, player, "Forget-Me-Not") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("White Trinity", player) + and state.has("Forget-Me-Not", player) ) multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) ) multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Forget-Me-Not") + and state.has("Forget-Me-Not", player) ) multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) + and ( - can_glide(state, player) + state.has("Progressive Glide", player) or options.advanced_logic ) ) multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_oogie_manor(state, player, options) + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) + and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_item(state, player, "Red Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) + and state.has("Red Trinity", player) ) multiworld.get_location("Halloween Town Guillotine Square High Tower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and ( - has_item(state, player, "High Jump") + state.has("High Jump", player) or (options.advanced_logic and can_dumbo_skip(state, player)) - or (options.advanced_logic and can_glide(state, player)) + or (options.advanced_logic and state.has("Progressive Glide", player)) ) ) multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + state.has("High Jump", player) + or (options.advanced_logic and state.has("Progressive Glide", player)) ) - and + and ( - can_glide(state, player) - or (options.advanced_logic and has_item(state, player, "Combo Master")) - or has_at_least(state, player, "High Jump", 2) + state.has("Progressive Glide", player) + or (options.advanced_logic and state.has("Combo Master", player)) + or state.has("High Jump", player, 2) ) ) multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) ) multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) ) multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) + and ( - can_glide(state, player) - or has_item(state, player, "High Jump") + state.has("Progressive Glide", player) + or state.has("High Jump", player) or options.advanced_logic ) ) multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + and state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") ) multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") + has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + state.has("High Jump", player) + or (options.advanced_logic and state.has("Progressive Glide", player)) ) - and + and ( - can_glide(state, player) - or (options.advanced_logic and has_item(state, player, "Combo Master")) - or has_at_least(state, player, "High Jump", 2) + state.has("Progressive Glide", player) + or (options.advanced_logic and state.has("Combo Master", player)) + or state.has("High Jump", player, 2) ) ) multiworld.get_location("Olympus Coliseum Coliseum Gates Left Behind Columns Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") ) multiworld.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and has_item(state, player, "Blue Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and state.has("Blue Trinity", player) ) multiworld.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and has_item(state, player, "Blue Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and state.has("Blue Trinity", player) ) multiworld.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and has_item(state, player, "White Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and state.has("White Trinity", player) ) multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and has_at_least(state, player, "Progressive Blizzard", 2) + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and state.has("Progressive Blizzard", player, 2) ) multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzaga Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and has_at_least(state, player, "Progressive Blizzard", 3) + has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") + and state.has("Progressive Blizzard", player, 3) ) multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") ) multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") ) multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) - ) - and has_item(state, player, "Green Trinity") + state.has("High Jump", player) + or state.has("Progressive Glide", player) + ) + and state.has("Green Trinity", player) ) multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") @@ -861,17 +832,17 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") ) multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and has_item(state, player, "High Jump") + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and state.has("High Jump", player) ) multiworld.get_location("Monstro Chamber 3 Ground Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") ) multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and ( - has_item(state, player, "High Jump") + state.has("High Jump", player) or options.advanced_logic ) ) @@ -879,10 +850,10 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") ) multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and ( - has_item(state, player, "High Jump") + state.has("High Jump", player) or options.advanced_logic ) ) @@ -890,10 +861,10 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") ) multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and ( - has_item(state, player, "High Jump") + state.has("High Jump", player) or options.advanced_logic ) ) @@ -904,59 +875,59 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") ) multiworld.get_location("Neverland Pirate Ship Deck White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "White Trinity") - and has_item(state, player, "Green Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and state.has("White Trinity", player) + and state.has("Green Trinity", player) ) multiworld.get_location("Neverland Pirate Ship Crows Nest Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Green Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and state.has("Green Trinity", player) ) multiworld.get_location("Neverland Hold Yellow Trinity Right Blue Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Yellow Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and state.has("Yellow Trinity", player) ) multiworld.get_location("Neverland Hold Yellow Trinity Left Blue Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Yellow Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and state.has("Yellow Trinity", player) ) multiworld.get_location("Neverland Galley Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") ) multiworld.get_location("Neverland Cabin Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Green Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and state.has("Green Trinity", player) ) multiworld.get_location("Neverland Hold Flight 1st Chest " , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and ( - has_item(state, player, "Green Trinity") - or can_glide(state, player) - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("Progressive Glide", player) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Neverland Clock Tower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Green Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and state.has("Green Trinity", player) and has_all_magic_lvx(state, player, 2) ) multiworld.get_location("Neverland Hold Flight 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and ( - has_item(state, player, "Green Trinity") - or can_glide(state, player) - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("Progressive Glide", player) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Neverland Hold Yellow Trinity Green Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Yellow Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and state.has("Yellow Trinity", player) ) multiworld.get_location("Neverland Captain's Cabin Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and has_item(state, player, "Green Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") + and state.has("Green Trinity", player) ) multiworld.get_location("Hollow Bastion Rising Falls Water's Surface Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") @@ -965,112 +936,112 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") ) multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) - or has_item(state, player, "Progressive Blizzard") + state.has("High Jump", player) + or state.has("Progressive Glide", player) + or state.has("Progressive Blizzard", player) ) ) multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and ( - has_item(state, player, "High Jump") - or can_glide(state, player) - or has_item(state, player, "Progressive Blizzard") + state.has("High Jump", player) + or state.has("Progressive Glide", player) + or state.has("Progressive Blizzard", player) ) ) multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and ( - can_glide(state, player) - or has_item(state, player, "Progressive Blizzard") - or (options.advanced_logic and has_item(state, player, "Combo Master")) + state.has("Progressive Glide", player) + or state.has("Progressive Blizzard", player) + or (options.advanced_logic and state.has("Combo Master", player)) ) and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and state.has("Progressive Gravity", player) + and ( has_emblems(state, player, options.keyblades_unlock_chests) - or (options.advanced_logic and has_at_least(state, player, "High Jump", 2) and can_glide(state,player)) - or (options.advanced_logic and can_dumbo_skip(state, player) and can_glide(state,player)) + 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)) ) ) multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and ( has_emblems(state, player, options.keyblades_unlock_chests) - or has_at_least(state, player, "High Jump", 2) + or state.has("High Jump", player, 2) or (options.advanced_logic and can_dumbo_skip(state, player)) ) ) multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and ( has_emblems(state, player, options.keyblades_unlock_chests) - or has_at_least(state, player, "High Jump", 2) + or state.has("High Jump", player, 2) or (options.advanced_logic and can_dumbo_skip(state, player)) ) ) multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and state.has("Progressive Gravity", player) and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and state.has("Progressive Gravity", player) and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") ) multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and state.has("Progressive Gravity", player) and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and state.has("Progressive Gravity", player) ) multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - and can_glide(state, player) - and has_item(state, player, "Progressive Gravity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and has_emblems(state, player, options.keyblades_unlock_chests) + and state.has("Progressive Glide", player) + and state.has("Progressive Gravity", player) ) multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and state.has("Progressive Gravity", player) ) multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "Progressive Gravity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and state.has("Progressive Gravity", player) and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest" , player).access_rule = lambda state: ( @@ -1086,11 +1057,11 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") ) multiworld.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and ( - (has_item(state, player, "Progressive Blizzard") and has_item(state, player, "High Jump")) - or has_at_least(state, player, "High Jump", 3) + (state.has("Progressive Blizzard", player) and state.has("High Jump", player)) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest" , player).access_rule = lambda state: ( @@ -1103,22 +1074,22 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") ) multiworld.get_location("Hollow Bastion Grand Hall Steps Right Side Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Grand Hall Oblivion Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Grand Hall Left of Gate Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and ( - has_item(state, player, "High Jump") + state.has("High Jump", player) or ( options.advanced_logic @@ -1128,8 +1099,8 @@ def set_rules(kh1world): ) ) multiworld.get_location("Hollow Bastion Rising Falls White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_item(state, player, "White Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") + and state.has("White Trinity", player) ) multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") @@ -1165,27 +1136,27 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") ) multiworld.get_location("End of the World Giant Crevasse 5th Chest" , player).access_rule = lambda state: ( - has_item(state, player, "High Jump") or can_glide(state, player) + state.has("High Jump", player) or state.has("Progressive Glide", player) and has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") ) multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + and ( ( options.advanced_logic - and has_item(state, player, "High Jump") - and has_item(state, player, "Combo Master") + and state.has("High Jump", player) + and state.has("Combo Master", player) ) - or can_glide(state, player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: ( @@ -1204,15 +1175,15 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") ) multiworld.get_location("End of the World World Terminus Agrabah Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - and + has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + and ( - has_item(state, player, "High Jump") - or + state.has("High Jump", player) + or ( options.advanced_logic and can_dumbo_skip(state, player) - and can_glide(state, player) + and state.has("Progressive Glide", player) ) ) ) @@ -1232,78 +1203,78 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") ) multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and has_item(state, player, "White Trinity") + has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") + and state.has("White Trinity", player) ) multiworld.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and has_item(state, player,"Hollow Bastion") + has_emblems(state, player, options.keyblades_unlock_chests) + and state.has("Hollow Bastion", player) and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) ) multiworld.get_location("Deep Jungle Defeat Sabor White Fang Event" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Defeat Clayton Cure Event" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Seal Keyhole Jungle King Event" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Seal Keyhole Red Trinity Event" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event" , player).access_rule = lambda state: ( - has_item(state, player, "Entry Pass") + state.has("Entry Pass", player) ) multiworld.get_location("Olympus Coliseum Cloud Sonic Blade Event" , player).access_rule = lambda state: ( - has_item(state, player, "Entry Pass") + state.has("Entry Pass", player) ) multiworld.get_location("Wonderland Defeat Trickmaster Blizzard Event" , player).access_rule = lambda state: ( - has_evidence(state, player) + state.has("Footprints", player) ) multiworld.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event" , player).access_rule = lambda state: ( - has_evidence(state, player) + state.has("Footprints", player) ) multiworld.get_location("Monstro Defeat Parasite Cage II Stop Event" , player).access_rule = lambda state: ( - has_item(state, player, "High Jump") + state.has("High Jump", player) or ( options.advanced_logic - and can_glide(state, player) + and state.has("Progressive Glide", player) ) ) multiworld.get_location("Halloween Town Defeat Oogie Boogie Holy Circlet Event" , player).access_rule = lambda state: ( - has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Defeat Oogie's Manor Gravity Event" , player).access_rule = lambda state: ( - has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Halloween Town Seal Keyhole Pumpkinhead Event" , player).access_rule = lambda state: ( - has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") + state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) multiworld.get_location("Neverland Defeat Anti Sora Raven's Claw Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") + state.has("Green Trinity", player) ) multiworld.get_location("Neverland Encounter Hook Cure Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") + state.has("Green Trinity", player) ) multiworld.get_location("Neverland Seal Keyhole Fairy Harp Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") + state.has("Green Trinity", player) ) multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") + state.has("Green Trinity", player) ) multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") + state.has("Green Trinity", player) ) multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") + state.has("Green Trinity", player) ) multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: ( has_emblems(state, player, options.keyblades_unlock_chests) @@ -1321,37 +1292,37 @@ def set_rules(kh1world): has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Mail Postcard 01 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 1) + state.has("Postcard", player) ) multiworld.get_location("Traverse Town Mail Postcard 02 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 2) + state.has("Postcard", player, 2) ) multiworld.get_location("Traverse Town Mail Postcard 03 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 3) + state.has("Postcard", player, 3) ) multiworld.get_location("Traverse Town Mail Postcard 04 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 4) + state.has("Postcard", player, 4) ) multiworld.get_location("Traverse Town Mail Postcard 05 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 5) + state.has("Postcard", player, 5) ) multiworld.get_location("Traverse Town Mail Postcard 06 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 6) + state.has("Postcard", player, 6) ) multiworld.get_location("Traverse Town Mail Postcard 07 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 7) + state.has("Postcard", player, 7) ) multiworld.get_location("Traverse Town Mail Postcard 08 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 8) + state.has("Postcard", player, 8) ) multiworld.get_location("Traverse Town Mail Postcard 09 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 9) + state.has("Postcard", player, 9) ) multiworld.get_location("Traverse Town Mail Postcard 10 Event" , player).access_rule = lambda state: ( - has_postcards(state, player, 10) + state.has("Postcard", player, 10) ) multiworld.get_location("Traverse Town Defeat Opposite Armor Aero Event" , player).access_rule = lambda state: ( - has_item(state, player, "Red Trinity") + state.has("Red Trinity", player) ) multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: ( has_emblems(state, player, options.keyblades_unlock_chests) @@ -1366,83 +1337,83 @@ def set_rules(kh1world): has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: ( - has_item(state, player, "Jack-In-The-Box") - and has_item(state, player, "Forget-Me-Not") - and has_item(state, player, "Progressive Fire") + state.has("Jack-In-The-Box", player) + and state.has("Forget-Me-Not", player) + and state.has("Progressive Fire", player) ) multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") + state.has("Green Trinity", player) ) multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: ( has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 1" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and + state.has("Monstro", player) + and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + 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) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 2" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and + state.has("Monstro", player) + and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + 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) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 3" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and + state.has("Monstro", player) + and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + 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) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 4" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and + state.has("Monstro", player) + and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + 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) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 5" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and + state.has("Monstro", player) + and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + 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) ) multiworld.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") + state.has("Monstro", player) and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + state.has("High Jump", player) + or (options.advanced_logic and state.has("Progressive Glide", player)) ) and has_all_summons(state, player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Geppetto's House Talk to Pinocchio" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") + state.has("Monstro", player) and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + 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) ) multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: ( - has_all_magic_lvx(state, player, 1) - and has_all_arts(state, player) + has_all_magic_lvx(state, player, 1) + and has_all_arts(state, player) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) ) multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: ( @@ -1488,231 +1459,231 @@ def set_rules(kh1world): has_puppies(state, player, 99) ) multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 02:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 03:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 04:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 05:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 06:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 07:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 08:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 09:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 10:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 11:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Clock Tower 12:00 Door" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Neverland Hold Aero Chest" , player).access_rule = lambda state: ( - has_item(state, player, "Yellow Trinity") + state.has("Yellow Trinity", player) ) multiworld.get_location("Deep Jungle Camp Hi-Potion Experiment" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Fire") + state.has("Progressive Fire", player) ) multiworld.get_location("Deep Jungle Camp Ether Experiment" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Blizzard") + state.has("Progressive Blizzard", player) ) multiworld.get_location("Deep Jungle Camp Replication Experiment" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Blizzard") + state.has("Progressive Blizzard", player) ) multiworld.get_location("Deep Jungle Cliff Save Gorillas" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Tree House Save Gorillas" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Camp Save Gorillas" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Jungle Slider 10 Fruits" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Jungle Slider 20 Fruits" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Jungle Slider 30 Fruits" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Jungle Slider 40 Fruits" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Deep Jungle Jungle Slider 50 Fruits" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: ( - has_evidence(state, player) + state.has("Footprints", player) ) multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") + state.has("Green Trinity", player) ) multiworld.get_location("Olympus Coliseum Coliseum Gates Hero's License Event" , player).access_rule = lambda state: ( - has_item(state, player, "Entry Pass") + state.has("Entry Pass", player) ) multiworld.get_location("Deep Jungle Cavern of Hearts Navi-G Piece Event" , player).access_rule = lambda state: ( - has_slides(state, player) + state.has("Slides", player) ) multiworld.get_location("Wonderland Bizarre Room Navi-G Piece Event" , player).access_rule = lambda state: ( - has_evidence(state, player) + state.has("Footprints", player) ) multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and + state.has("Empty Bottle", player, 6) + and ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and + state.has("Empty Bottle", player, 6) + and ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Traverse Town Synth Rope" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and + state.has("Empty Bottle", player, 6) + and ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Traverse Town Synth Seagull Egg" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and + state.has("Empty Bottle", player, 6) + and ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and + state.has("Empty Bottle", player, 6) + and ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: ( - has_at_least(state, player, "Empty Bottle", 6) - and + state.has("Empty Bottle", player, 6) + and ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("High Jump", player, 3) ) ) multiworld.get_location("Traverse Town Gizmo Shop Postcard 1" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Thunder") + state.has("Progressive Thunder", player) ) multiworld.get_location("Traverse Town Gizmo Shop Postcard 2" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Thunder") + state.has("Progressive Thunder", player) ) multiworld.get_location("Traverse Town Item Workshop Postcard" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - or has_at_least(state, player, "High Jump", 3) + state.has("Green Trinity", player) + or state.has("High Jump", player, 3) ) multiworld.get_location("Traverse Town Geppetto's House Postcard" , player).access_rule = lambda state: ( - has_item(state, player, "Monstro") - and + state.has("Monstro", player) + and ( - has_item(state, player, "High Jump") - or (options.advanced_logic and can_glide(state, player)) + state.has("High Jump", player) + or (options.advanced_logic and state.has("Progressive Glide", player)) ) ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)" , player).access_rule = lambda state: ( ( - has_item(state, player, "Theon Vol. 6") - or has_at_least(state, player, "High Jump", 3) + state.has("Theon Vol. 6", player) + or state.has("High Jump", player, 3) or has_emblems(state, player, options.keyblades_unlock_chests) ) - and has_item(state, player, "Progressive Fire") + and state.has("Progressive Fire", player) and ( - has_item(state, player, "High Jump") - or can_glide(state, player) - or has_item(state, player, "Progressive Thunder") + state.has("High Jump", player) + or state.has("Progressive Glide", player) + or state.has("Progressive Thunder", player) or options.advanced_logic ) ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)" , player).access_rule = lambda state: ( - has_item(state, player, "Theon Vol. 6") - or has_at_least(state, player, "High Jump", 3) + state.has("Theon Vol. 6", player) + or state.has("High Jump", player, 3) or has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)" , player).access_rule = lambda state: ( ( - has_item(state, player, "Theon Vol. 6") - or has_at_least(state, player, "High Jump", 3) + state.has("Theon Vol. 6", player) + or state.has("High Jump", player, 3) or has_emblems(state, player, options.keyblades_unlock_chests) ) - and has_item(state, player, "Red Trinity") + and state.has("Red Trinity", player) ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)" , player).access_rule = lambda state: ( - has_item(state, player, "Theon Vol. 6") - or has_at_least(state, player, "High Jump", 3) + state.has("Theon Vol. 6", player) + or state.has("High Jump", player, 3) or has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Library Speak to Belle Divine Rose" , player).access_rule = lambda state: ( @@ -1726,20 +1697,20 @@ def set_rules(kh1world): has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") ) multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and + has_torn_pages(state, player, 4) + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") ) multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and + has_torn_pages(state, player, 4) + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") ) @@ -1751,35 +1722,35 @@ def set_rules(kh1world): has_torn_pages(state, player, 4) ) multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and + has_torn_pages(state, player, 4) + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and + has_torn_pages(state, player, 4) + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and + has_torn_pages(state, player, 4) + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and + has_torn_pages(state, player, 4) + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: ( @@ -1807,212 +1778,208 @@ def set_rules(kh1world): has_torn_pages(state, player, 4) ) multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and + has_torn_pages(state, player, 4) + and ( - has_item(state, player, "High Jump") - or can_glide(state, player) + state.has("High Jump", player) + or state.has("Progressive Glide", player) ) ) if options.atlantica: multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Fire") - and has_item(state, player, "Crystal Trident") + state.has("Progressive Fire", player) + and state.has("Crystal Trident", player) ) multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: ( - has_item(state, player, "White Trinity") + state.has("White Trinity", player) ) multiworld.get_location("Atlantica Defeat Ursula I Mermaid Kick Event" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") - and has_offensive_magic(state, player) - and has_item(state, player, "Crystal Trident") + has_offensive_magic(state, player) + and state.has("Crystal Trident", player) ) multiworld.get_location("Atlantica Defeat Ursula II Thunder Event" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") - and has_item(state, player, "Mermaid Kick") + state.has("Mermaid Kick", player) and has_offensive_magic(state, player) - and has_item(state, player, "Crystal Trident") + and state.has("Crystal Trident", player) ) multiworld.get_location("Atlantica Seal Keyhole Crabclaw Event" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") - and has_item(state, player, "Mermaid Kick") + state.has("Mermaid Kick", player) and has_offensive_magic(state, player) - and has_item(state, player, "Crystal Trident") + and state.has("Crystal Trident", player) ) multiworld.get_location("Atlantica Undersea Gorge Blizzard Clam" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Blizzard") + state.has("Progressive Blizzard", player) ) multiworld.get_location("Atlantica Undersea Valley Fire Clam" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Fire") + state.has("Progressive Fire", player) ) multiworld.get_location("Atlantica Triton's Palace Thunder Clam" , player).access_rule = lambda state: ( - has_item(state, player, "Progressive Thunder") + state.has("Progressive Thunder", player) ) multiworld.get_location("Atlantica Cavern Nook Clam" , player).access_rule = lambda state: ( - has_item(state, player, "Crystal Trident") + state.has("Crystal Trident", player) ) multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Crabclaw") - and has_item(state, player, "Mermaid Kick") + state.has("Mermaid Kick", player) and has_offensive_magic(state, player) - and has_item(state, player, "Crystal Trident") + and state.has("Crystal Trident", player) ) if options.cups: multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Entry Pass") + state.has("Phil Cup", player) + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Entry Pass") + state.has("Phil Cup", player) + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Phil Cup Time Trial" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Entry Pass") + state.has("Phil Cup", player) + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: ( - has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Entry Pass") + state.has("Pegasus Cup", player) + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: ( - has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Entry Pass") + state.has("Pegasus Cup", player) + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: ( - has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Entry Pass") + state.has("Pegasus Cup", player) + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: ( - has_item(state, player, "Hercules Cup") + state.has("Hercules Cup", player) and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: ( - has_item(state, player, "Hercules Cup") + state.has("Hercules Cup", player) and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: ( - has_item(state, player, "Hercules Cup") + state.has("Hercules Cup", player) and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: ( - has_item(state, player, "Hercules Cup") + state.has("Hercules Cup", player) and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: ( - has_item(state, player, "Hercules Cup") + state.has("Hercules Cup", player) and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_item(state, player, "Guard") + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and state.has("Guard", player) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) if options.super_bosses: multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: ( - has_item(state, player, "Green Trinity") - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) + 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) ) multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + 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) ) multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: ( @@ -2020,29 +1987,29 @@ def set_rules(kh1world): ) if options.super_bosses or options.goal.current_key == "sephiroth": multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: ( - has_item(state, player, "Phil Cup") - and has_item(state, player, "Pegasus Cup") - and has_item(state, player, "Hercules Cup") - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + state.has("Phil Cup", player) + and state.has("Pegasus Cup", player) + and state.has("Hercules Cup", player) + and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) - and has_item(state, player, "Entry Pass") + and state.has("Entry Pass", player) ) if options.super_bosses or options.goal.current_key == "unknown": multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + 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) ) multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + 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) ) for i in range(options.level_checks): @@ -2054,17 +2021,17 @@ def set_rules(kh1world): has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports, options.keyblades_unlock_chests) ) - multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: has_item(state, player,"Wonderland") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Olympus Coliseum" , player).access_rule = lambda state: has_item(state, player,"Olympus Coliseum") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: has_item(state, player,"Deep Jungle") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: has_item(state, player,"Agrabah") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Monstro" , player).access_rule = lambda state: has_item(state, player,"Monstro") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: state.has("Wonderland", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Olympus Coliseum" , player).access_rule = lambda state: state.has("Olympus Coliseum", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: state.has("Deep Jungle", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: state.has("Agrabah", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Monstro" , player).access_rule = lambda state: state.has("Monstro", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) if options.atlantica: - multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: has_item(state, player,"Atlantica") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: has_item(state, player,"Halloween Town") and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Neverland" , player).access_rule = lambda state: has_item(state, player,"Neverland") and has_x_worlds(state, player, 3, options.keyblades_unlock_chests) - multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: has_item(state, player,"Hollow Bastion") and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) - multiworld.get_entrance("End of the World" , player).access_rule = lambda state: has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and (has_reports(state, player, eotw_required_reports) or has_item(state, player,"End of the World")) - multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: has_item(state, player, "Progressive Fire") + multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: state.has("Atlantica", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: state.has("Halloween Town", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + multiworld.get_entrance("Neverland" , player).access_rule = lambda state: state.has("Neverland", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests) + multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: state.has("Hollow Bastion", player) and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) + multiworld.get_entrance("End of the World" , player).access_rule = 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)) + multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: state.has("Progressive Fire", player) multiworld.completion_condition[player] = lambda state: state.has("Victory", player) From fd8f4371f0f13de66ad40310218bed8ebf633b8c Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 14:58:30 -0500 Subject: [PATCH 255/284] removed junk in missable locations option --- worlds/kh1/Locations.py | 44 ++++++++++++------------ worlds/kh1/Options.py | 12 ------- worlds/kh1/Regions.py | 28 +++++++-------- worlds/kh1/Rules.py | 75 ----------------------------------------- worlds/kh1/__init__.py | 16 --------- 5 files changed, 36 insertions(+), 139 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index a36b50eb393c..e4f3b33590af 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -24,7 +24,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: location_table: Dict[str, KH1LocationData] = { - #"Destiny Islands Chest": KH1LocationData("Destiny Islands", 265_0011), missable + #"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), @@ -225,7 +225,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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 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), @@ -252,10 +252,10 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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 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 + #"Awakening Chest": KH1LocationData("Awakening", 265_5093), 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), @@ -330,10 +330,10 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "Atlantica Undersea Garden Clam": KH1LocationData("Atlantica", 265_6215), "Atlantica Undersea Cave Clam": KH1LocationData("Atlantica", 265_6216), - #"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 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), @@ -361,18 +361,18 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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 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), @@ -436,8 +436,8 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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), + #"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), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 613136997808..37605bf3cebf 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -346,17 +346,6 @@ class VanillaEmblemPieces(DefaultOnToggle): """ display_name = "Vanilla Emblem Pieces" -class JunkInMissableLocations(DefaultOnToggle): - """ - If on, will place Elixirs in missable locations. If turned off, there is a chance you will need to play the game multiple times to check missed locations. - Locations include: - Leon Gift - Aerith Gift - Clock Tower Doors - World Terminus Hollow Bastion Chest - """ - display_name = "Junk in Missable Locations" - 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". @@ -387,7 +376,6 @@ class KH1Options(PerGameCommonOptions): extra_shared_abilities: ExtraSharedAbilities exp_zero_in_pool: EXPZeroInPool vanilla_emblem_pieces: VanillaEmblemPieces - junk_in_missable_locations: JunkInMissableLocations donald_death_link: DonaldDeathLink goofy_death_link: GoofyDeathLink randomize_keyblade_stats: RandomizeKeybladeStats diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index b1694d6da87f..fe3f382ec154 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -248,18 +248,18 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Monstro"].locations.append("Monstro Mouth Near Ship Chest") 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") @@ -290,10 +290,10 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Olympus Coliseum"].locations.append("Olympus Coliseum Coliseum Gates White Trinity Chest") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Cerberus Inferno Band Event") 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 Aerith Gift") regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity Balcony Chest") 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 2nd District Boots and Shoes Awning Chest") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index db19248a1e1b..8a28a5c443eb 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1196,9 +1196,6 @@ def set_rules(kh1world): multiworld.get_location("End of the World World Terminus 100 Acre Wood Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") ) - multiworld.get_location("End of the World World Terminus Hollow Bastion Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) multiworld.get_location("End of the World Final Rest Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") ) @@ -1458,78 +1455,6 @@ def set_rules(kh1world): multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: ( has_puppies(state, player, 99) ) - multiworld.get_location("Neverland Clock Tower 01:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 02:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 03:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 04:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 05:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 06:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 07:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 08:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 09:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 10:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 11:00 Door" , player).access_rule = 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) - ) - multiworld.get_location("Neverland Clock Tower 12:00 Door" , player).access_rule = 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) - ) multiworld.get_location("Neverland Hold Aero Chest" , player).access_rule = lambda state: ( state.has("Yellow Trinity", player) ) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index f805b7542595..aeadf4f62d51 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -191,22 +191,6 @@ def pre_fill(self) -> None: "final_rest": "End of the World Final Rest Chest" } self.multiworld.get_location(goal_dict[self.options.goal.current_key], self.player).place_locked_item(self.create_item("Victory")) - if self.options.junk_in_missable_locations: - self.multiworld.get_location("Traverse Town 1st District Leon Gift", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Traverse Town 1st District Aerith Gift", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("End of the World World Terminus Hollow Bastion Chest", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 01:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 02:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 03:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 04:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 05:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 06:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 07:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 08:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 09:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 10:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 11:00 Door", self.player).place_locked_item(self.create_item("Elixir")) - self.multiworld.get_location("Neverland Clock Tower 12:00 Door", self.player).place_locked_item(self.create_item("Elixir")) if self.options.vanilla_emblem_pieces: self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)", self.player).place_locked_item(self.create_item("Emblem Piece (Flame)")) self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)", self.player).place_locked_item(self.create_item("Emblem Piece (Statue)")) From f64f5bf38598521a360852d5cbaccdfef0f446a3 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 15:00:42 -0500 Subject: [PATCH 256/284] Update __init__.py --- worlds/kh1/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index aeadf4f62d51..7de50b990d27 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -100,8 +100,6 @@ def create_items(self): if True: #Allow notepad++ to collapse this section prefilled_items = [] prefilled_locations = 1 #Victory - if self.options.junk_in_missable_locations: - prefilled_locations = prefilled_locations + 15 if self.options.vanilla_emblem_pieces: prefilled_locations = prefilled_locations + 4 prefilled_items = prefilled_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] From 243f4c85e40b260fd08b2be801e1219e10bce416 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 15:01:32 -0500 Subject: [PATCH 257/284] Change credits order --- worlds/kh1/docs/en_Kingdom Hearts.md | 48 ++++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index f405f3f2686f..3a10df27a013 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -1,28 +1,5 @@ # Kingdom Hearts (PC) -## Credits -This is a collaborative effort from several individuals in the Kingdom Hearts community, but most of all, denhonator. - -Denho's original KH rando laid the foundation for the work here and makes everything here possible, so thank you Denho for such a blast of a randomizer. - -Other credits include: - -Sonicshadowsilver2 for their work finding many memory addresses, working to identify and resolve bugs, and converting the code base to the latest EGS update. - -Shananas and the rest of the OpenKH team for providing such an amazing tool for us to utilize on this project. - -TopazTK for their work on the `Show Prompt` method and Krujo for their implementation of the method in AP. - -JaredWeakStrike for helping clean up my mess of code. - -KSX for their interact in battle code. - -RavSpect for their title screen image edit. - -SunCatMC for their work on ChecksFinder, which I used as a basis for game-to-client communication. - -ThePhar for their work on Rogue Legacy AP, which I used as a basis for the apworld creation. - ## Where is the options page? The [player options page for this game](../player-options) contains most of the options you need to @@ -85,4 +62,27 @@ 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. \ No newline at end of file +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. + +Denho's original KH rando laid the foundation for the work here and makes everything here possible, so thank you Denho for such a blast of a randomizer. + +Other credits include: + +Sonicshadowsilver2 for their work finding many memory addresses, working to identify and resolve bugs, and converting the code base to the latest EGS update. + +Shananas and the rest of the OpenKH team for providing such an amazing tool for us to utilize on this project. + +TopazTK for their work on the `Show Prompt` method and Krujo for their implementation of the method in AP. + +JaredWeakStrike for helping clean up my mess of code. + +KSX for their interact in battle code. + +RavSpect for their title screen image edit. + +SunCatMC for their work on ChecksFinder, which I used as a basis for game-to-client communication. + +ThePhar for their work on Rogue Legacy AP, which I used as a basis for the apworld creation. From 7cb28b9e2d7657d97edd3e678785e56e3edf36a3 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 15:02:32 -0500 Subject: [PATCH 258/284] Update en_Kingdom Hearts.md --- worlds/kh1/docs/en_Kingdom Hearts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 3a10df27a013..91779bd72a69 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -79,7 +79,7 @@ TopazTK for their work on the `Show Prompt` method and Krujo for their implement JaredWeakStrike for helping clean up my mess of code. -KSX for their interact in battle code. +KSX for their `Interact in Battle` code. RavSpect for their title screen image edit. From 9ebd8f691fd9e0951247cae181fdd81881d7002f Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 15:03:37 -0500 Subject: [PATCH 259/284] Standardize punctuation --- worlds/kh1/docs/kh1_en.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index 70b16032beec..522da20b0dc9 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -4,21 +4,21 @@ BEFORE MODDING, PLEASE INSTALL AND RUN KH1 AT LEAST ONCE. -1. Install OpenKH and the LUA Backend. +1. Install OpenKH and the LUA Backend Download the [latest release of OpenKH](https://github.com/OpenKH/OpenKh/releases/tag/latest) Extract the files to a directory of your choosing. - Open `OpenKh.Tools.ModsManager.exe` and run first time set up. + Open `OpenKh.Tools.ModsManager.exe` and run first time set up When prompted for game edition, choose `PC Release`, select which platform you're using (EGS or Steam), navigate to your `Kingdom Hearts I.5 + II.5` installation folder in the path box and click `Next` When prompted, install Panacea, then click `Next` - When prompted, check KH1 plus any other AP game you play and click `Install and configure LUA backend`, then click `Next`. + When prompted, check KH1 plus any other AP game you play and click `Install and configure LUA backend`, then click `Next` - Extracting game data for KH1 is unnecessary, but you may want to extract data for KH2 if you plan on playing KH2 AP. + Extracting game data for KH1 is unnecessary, but you may want to extract data for KH2 if you plan on playing KH2 AP Click `Finish` From 9430efb1cf75268e7a99bdcab9d817086d9efe74 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 15:06:39 -0500 Subject: [PATCH 260/284] Update en_Kingdom Hearts.md --- worlds/kh1/docs/en_Kingdom Hearts.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 91779bd72a69..f1a3bf528fb9 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -37,30 +37,30 @@ Please reach out to Gicu#7034 on Discord. ## How do I progress in a certain world? -###The evidence boxes aren't spawning in Wonderland. +### The evidence boxes aren't spawning in Wonderland. Find `Footprints` in the multiworld. -###I can't enter any cups in Olympus Coliseum. +### 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. +### The slides aren't spawning in Deep Jungle. Find `Slides` in the multiworld. -###I can't progress in Atlantica. +### I can't progress in Atlantica. Find `Crystal Trident` in the multiworld. -###I can't progress in Halloween Town. +### 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. +### The Hollow Bastion Library is missing a book. Find `Theon Vol. 6` in the multiworld. -##How do I enter the End of the World? +## 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. From c4245ddecc535b2ed9ac25a2070e6fbe5ec778b9 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 15:07:40 -0500 Subject: [PATCH 261/284] Update en_Kingdom Hearts.md --- worlds/kh1/docs/en_Kingdom Hearts.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index f1a3bf528fb9..5167505efbbd 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -15,11 +15,11 @@ The default goal is to enter End of the World and defeat Final Ansem. ## What items and locations get shuffled? -###Items +### Items Any weapon, accessory, spell, trinity, summon, world, key item, stat up, consumable, or ability can be found in any location. -###Locations +### Locations Locations the player can find items include chests, event rewards, Atlantica clams, level up rewards, 101 Dalmatian rewards, and postcard rewards. From 582b0786c45673d4b0495441593c0befee1a1321 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 15:18:49 -0500 Subject: [PATCH 262/284] Update Regions.py --- worlds/kh1/Regions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index fe3f382ec154..72043ad80335 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -138,7 +138,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") From 3aa96a9d9d2dbcaf8558a12e5f185587041a4856 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 15:46:52 -0500 Subject: [PATCH 263/284] Removed "disclude" options in generation fillers --- worlds/kh1/Items.py | 4 ++-- worlds/kh1/__init__.py | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index 5040aec4cbc6..a34848631c4a 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -15,10 +15,10 @@ class KH1ItemData(NamedTuple): weight: int = 1 -def get_items_by_category(category: str, disclude: list) -> Dict[str, KH1ItemData]: +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 and all(x not in name for x in disclude): + if data.category == category: item_dict.setdefault(name, data) return item_dict diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 7de50b990d27..f9b79709d5f0 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -47,6 +47,10 @@ class KH1World(World): location_name_to_id = {name: data.code for name, data in location_table.items()} item_name_groups = item_name_groups location_name_groups = location_name_groups + fillers = {} + fillers.update(get_items_by_category("Item")) + fillers.update(get_items_by_category("Camping")) + fillers.update(get_items_by_category("Stat Ups")) def create_items(self): #Handle starting worlds @@ -196,13 +200,8 @@ def pre_fill(self) -> None: self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)", self.player).place_locked_item(self.create_item("Emblem Piece (Chest)")) def get_filler_item_name(self) -> str: - fillers = {} - disclude = [] - fillers.update(get_items_by_category("Item", disclude)) - fillers.update(get_items_by_category("Camping", disclude)) - fillers.update(get_items_by_category("Stat Ups", disclude)) - weights = [data.weight for data in fillers.values()] - return self.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] + weights = [data.weight for data in self.fillers.values()] + return self.random.choices([filler for filler in self.fillers.keys()], weights, k=1)[0] def fill_slot_data(self) -> dict: slot_data = {"xpmult": int(self.options.exp_multiplier)/16, From 83ca2254e035cee23ff52cd4b857b189d41d8a17 Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 16:12:01 -0500 Subject: [PATCH 264/284] Update Rules.py --- worlds/kh1/Rules.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 8a28a5c443eb..e0159e1d6e1a 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -39,13 +39,13 @@ def has_all_summons(state: CollectionState, player: int) -> bool: def has_all_magic_lvx(state: CollectionState, player: int, level) -> bool: return state.has_all_counts({ - "Progressive Fire": 3, - "Progressive Blizzard": 3, - "Progressive Thunder": 3, - "Progressive Cure": 3, - "Progressive Gravity": 3, - "Progressive Aero": 3, - "Progressive Stop": 3}, player) + "Progressive Fire": level, + "Progressive Blizzard": level, + "Progressive Thunder": level, + "Progressive Cure": level, + "Progressive Gravity": level, + "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) From ca63e3c1f44b531a9aaca4b887ef8b098709015c Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 16:17:53 -0500 Subject: [PATCH 265/284] Update __init__.py --- worlds/kh1/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index f9b79709d5f0..070e356f5dd2 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -201,7 +201,7 @@ def pre_fill(self) -> None: 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, k=1)[0] + 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, From 128ff15334b8a0f06a640f6f7cd04bce9f39065a Mon Sep 17 00:00:00 2001 From: gaithern Date: Mon, 29 Jul 2024 17:44:38 -0500 Subject: [PATCH 266/284] Fix cemetery typo --- worlds/kh1/Locations.py | 8 ++++---- worlds/kh1/Regions.py | 8 ++++---- worlds/kh1/Rules.py | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index e4f3b33590af..5b0b5e83dfa5 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -142,9 +142,9 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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 Cemetary Behind Grave Chest": KH1LocationData("Halloween Town", 265_3054), - "Halloween Town Cemetary By Cat Shape Chest": KH1LocationData("Halloween Town", 265_3091), - "Halloween Town Cemetary Between Graves Chest": KH1LocationData("Halloween Town", 265_3092), + "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), @@ -154,7 +154,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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 Cemetary By Striped Grave Chest": KH1LocationData("Halloween Town", 265_3292), + "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), diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 72043ad80335..662abcb6a015 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -147,10 +147,10 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Halloween Town"].locations.append("Halloween Town Bridge Left of Gate Chest") regions["Halloween Town"].locations.append("Halloween Town Bridge Right of Gate Chest") regions["Halloween Town"].locations.append("Halloween Town Bridge Under Bridge") - regions["Halloween Town"].locations.append("Halloween Town Cemetary Behind Grave Chest") - regions["Halloween Town"].locations.append("Halloween Town Cemetary Between Graves Chest") - regions["Halloween Town"].locations.append("Halloween Town Cemetary By Cat Shape Chest") - regions["Halloween Town"].locations.append("Halloween Town Cemetary By Striped Grave Chest") + regions["Halloween Town"].locations.append("Halloween Town Cemetery Behind Grave Chest") + regions["Halloween Town"].locations.append("Halloween Town Cemetery Between Graves Chest") + regions["Halloween Town"].locations.append("Halloween Town Cemetery By Cat Shape Chest") + regions["Halloween Town"].locations.append("Halloween Town Cemetery By Striped Grave Chest") regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie Boogie Ansem's Report 7") regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie Boogie Holy Circlet Event") regions["Halloween Town"].locations.append("Halloween Town Defeat Oogie's Manor Gravity Event") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index e0159e1d6e1a..f53206b5f4fc 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -662,19 +662,19 @@ def set_rules(kh1world): or options.advanced_logic ) ) - multiworld.get_location("Halloween Town Cemetary Behind Grave Chest" , player).access_rule = lambda state: ( + multiworld.get_location("Halloween Town Cemetery Behind Grave Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and state.has("Jack-In-The-Box", player) and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) - multiworld.get_location("Halloween Town Cemetary By Cat Shape Chest" , player).access_rule = lambda state: ( + multiworld.get_location("Halloween Town Cemetery By Cat Shape Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and state.has("Jack-In-The-Box", player) and state.has("Forget-Me-Not", player) and has_oogie_manor(state, player, options.advanced_logic) ) - multiworld.get_location("Halloween Town Cemetary Between Graves Chest" , player).access_rule = lambda state: ( + multiworld.get_location("Halloween Town Cemetery Between Graves Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and state.has("Jack-In-The-Box", player) and state.has("Forget-Me-Not", player) @@ -748,7 +748,7 @@ def set_rules(kh1world): or options.advanced_logic ) ) - multiworld.get_location("Halloween Town Cemetary By Striped Grave Chest" , player).access_rule = lambda state: ( + multiworld.get_location("Halloween Town Cemetery By Striped Grave Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") and state.has("Jack-In-The-Box", player) and state.has("Forget-Me-Not", player) From 251534caf30c649aeaffff33bf355c7f6738f895 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Jul 2024 17:47:09 -0500 Subject: [PATCH 267/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 37605bf3cebf..62a04c247971 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -380,10 +380,10 @@ class KH1Options(PerGameCommonOptions): goofy_death_link: GoofyDeathLink randomize_keyblade_stats: RandomizeKeybladeStats bad_starting_weapons: BadStartingWeapons - keyblade_max_str: KeybladeMaxStrength keyblade_min_str: KeybladeMinStrength - keyblade_max_mp: KeybladeMaxMP + keyblade_max_str: KeybladeMaxStrength keyblade_min_mp: KeybladeMinMP + keyblade_max_mp: KeybladeMaxMP level_checks: LevelChecks force_stats_on_levels: ForceStatsOnLevels strength_increase: StrengthIncrease From 3e681f64f65016dede8e4673e53eedbbd6e49348 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 30 Jul 2024 00:24:13 -0500 Subject: [PATCH 268/284] Add option groups and option presets --- worlds/kh1/Options.py | 50 +++++++++++- worlds/kh1/Presets.py | 177 +++++++++++++++++++++++++++++++++++++++++ worlds/kh1/__init__.py | 5 +- 3 files changed, 230 insertions(+), 2 deletions(-) create mode 100644 worlds/kh1/Presets.py diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 37605bf3cebf..1a8bdb6a6d62 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from Options import NamedRange, Choice, Range, Toggle, DefaultOnToggle, PerGameCommonOptions, StartInventoryPool +from Options import NamedRange, Choice, Range, Toggle, DefaultOnToggle, PerGameCommonOptions, StartInventoryPool, OptionGroup class StrengthIncrease(Range): """ @@ -395,3 +395,51 @@ class KH1Options(PerGameCommonOptions): item_slot_increase: ItemSlotIncrease start_inventory_from_pool: StartInventoryPool +kh1_option_groups = [ + OptionGroup("Goal", [ + Goal, + EndoftheWorldUnlock, + FinalRestDoor, + RequiredReportsDoor, + RequiredReportsEotW, + ReportsInPool + ]), + OptionGroup("Locations", [ + SuperBosses, + Atlantica, + Cups, + HundredAcreWood, + VanillaEmblemPieces, + ]), + OptionGroup("Levels", [ + EXPMultiplier, + LevelChecks, + ForceStatsOnLevels, + StrengthIncrease, + DefenseIncrease, + HPIncrease, + APIncrease, + MPIncrease, + AccessorySlotIncrease, + ItemSlotIncrease + ]), + OptionGroup("Keyblades", [ + KeybladesUnlockChests, + RandomizeKeybladeStats, + BadStartingWeapons, + KeybladeMaxStrength, + KeybladeMinStrength, + KeybladeMaxMP, + KeybladeMinMP + ]), + OptionGroup("Misc", [ + StartingWorlds, + Puppies, + InteractInBattle, + AdvancedLogic, + ExtraSharedAbilities, + EXPZeroInPool, + DonaldDeathLink, + GoofyDeathLink, + ]) +] diff --git a/worlds/kh1/Presets.py b/worlds/kh1/Presets.py new file mode 100644 index 000000000000..503c0d2dabc8 --- /dev/null +++ b/worlds/kh1/Presets.py @@ -0,0 +1,177 @@ +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. + "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, + + "super_bosses": False, + "atlantica": False, + "hundred_acre_wood": False, + "cups": False, + "vanilla_emblem_pieces": True, + + "exp_multiplier": 48, + "level_checks": 100, + "force_stats_on_levels": 1, + "strength_increase": 24, + "defense_increase": 24, + "hp_increase": 23, + "ap_increase": 18, + "mp_increase": 7, + "accessory_slot_increase": 1, + "item_slot_increase": 3, + + "keyblades_unlock_chests": False, + "randomize_keyblade_stats": True, + "bad_starting_weapons": False, + "keyblade_max_str": 14, + "keyblade_min_str": 3, + "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, + "exp_zero_in_pool": False, + "donald_death_link": False, + "goofy_death_link": False + }, + # Puppies are found individually, and the goal is to return them all. + "Puppy Hunt": { + "goal": Goal.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, + + "super_bosses": False, + "atlantica": False, + "hundred_acre_wood": False, + "cups": False, + "vanilla_emblem_pieces": True, + + "exp_multiplier": 48, + "level_checks": 100, + "force_stats_on_levels": 1, + "strength_increase": 24, + "defense_increase": 24, + "hp_increase": 23, + "ap_increase": 18, + "mp_increase": 7, + "accessory_slot_increase": 1, + "item_slot_increase": 3, + + "keyblades_unlock_chests": False, + "randomize_keyblade_stats": True, + "bad_starting_weapons": False, + "keyblade_max_str": 14, + "keyblade_min_str": 3, + "keyblade_max_mp": 3, + "keyblade_min_mp": -2, + + "puppies": Puppies.option_individual, + "starting_worlds": 0, + "interact_in_battle": False, + "advanced_logic": False, + "extra_shared_abilities": False, + "exp_zero_in_pool": False, + "donald_death_link": False, + "goofy_death_link": 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, + + "super_bosses": True, + "atlantica": True, + "hundred_acre_wood": True, + "cups": True, + "vanilla_emblem_pieces": False, + + "exp_multiplier": 48, + "level_checks": 100, + "force_stats_on_levels": 1, + "strength_increase": 24, + "defense_increase": 24, + "hp_increase": 23, + "ap_increase": 18, + "mp_increase": 7, + "accessory_slot_increase": 1, + "item_slot_increase": 3, + + "keyblades_unlock_chests": True, + "randomize_keyblade_stats": True, + "bad_starting_weapons": True, + "keyblade_max_str": 14, + "keyblade_min_str": 3, + "keyblade_max_mp": 3, + "keyblade_min_mp": -2, + + "puppies": Puppies.option_triplets, + "starting_worlds": 0, + "interact_in_battle": True, + "advanced_logic": True, + "extra_shared_abilities": True, + "exp_zero_in_pool": True, + "donald_death_link": False, + "goofy_death_link": 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, + + "super_bosses": False, + "atlantica": False, + "hundred_acre_wood": False, + "cups": False, + "vanilla_emblem_pieces": True, + + "exp_multiplier": 16, + "level_checks": 0, + "force_stats_on_levels": 101, + "strength_increase": 0, + "defense_increase": 0, + "hp_increase": 0, + "mp_increase": 0, + "accessory_slot_increase": 6, + "item_slot_increase": 5, + + "keyblades_unlock_chests": False, + "randomize_keyblade_stats": True, + "bad_starting_weapons": False, + "keyblade_max_str": 14, + "keyblade_min_str": 3, + "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, + "exp_zero_in_pool": False, + "donald_death_link": False, + "goofy_death_link": False + } +} \ No newline at end of file diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 070e356f5dd2..38ada150b0ea 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -4,9 +4,10 @@ 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 .Options import KH1Options +from .Options import KH1Options, kh1_option_groups from .Regions import create_regions from .Rules import set_rules +from .Presets import kh1_option_presets from worlds.LauncherComponents import Component, components, Type, launch_subprocess @@ -29,6 +30,8 @@ class KH1Web(WebWorld): "kh1/en", ["Gicu"] )] + option_groups = kh1_option_groups + options_presets = kh1_option_presets class KH1World(World): From 99c658d0b1d830c3a93a87fdc688acb208dddea9 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:24:11 -0500 Subject: [PATCH 269/284] Update worlds/kh1/__init__.py That's a good idea! Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 38ada150b0ea..a3571a474f42 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -219,8 +219,12 @@ def fill_slot_data(self) -> dict: 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: From 4787f119a97d6f596414808b3f40d5214257a81c Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:24:24 -0500 Subject: [PATCH 270/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 6ec4f7811874..d61627c8dd3e 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -402,7 +402,7 @@ class KH1Options(PerGameCommonOptions): FinalRestDoor, RequiredReportsDoor, RequiredReportsEotW, - ReportsInPool + ReportsInPool, ]), OptionGroup("Locations", [ SuperBosses, From 40edd5d7605b59984f3c4e1392040fafcea25e63 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:24:30 -0500 Subject: [PATCH 271/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index d61627c8dd3e..79eea43f1765 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -421,7 +421,7 @@ class KH1Options(PerGameCommonOptions): APIncrease, MPIncrease, AccessorySlotIncrease, - ItemSlotIncrease + ItemSlotIncrease, ]), OptionGroup("Keyblades", [ KeybladesUnlockChests, From 468059d7eb19ac9298334c1f1c0fefe3235111c1 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:24:36 -0500 Subject: [PATCH 272/284] Update worlds/kh1/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 79eea43f1765..ee01ae83bf5d 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -430,7 +430,7 @@ class KH1Options(PerGameCommonOptions): KeybladeMaxStrength, KeybladeMinStrength, KeybladeMaxMP, - KeybladeMinMP + KeybladeMinMP, ]), OptionGroup("Misc", [ StartingWorlds, From 8ad65b472aa1e30de7e9a0b239dfc1a1d2a6b388 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:24:47 -0500 Subject: [PATCH 273/284] Update worlds/kh1/Presets.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Presets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Presets.py b/worlds/kh1/Presets.py index 503c0d2dabc8..77b43b7624b9 100644 --- a/worlds/kh1/Presets.py +++ b/worlds/kh1/Presets.py @@ -174,4 +174,4 @@ "donald_death_link": False, "goofy_death_link": False } -} \ No newline at end of file +} From 6b9256d3e5bc02dfea4ed8e7a0880bcd1cfeb2b6 Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 2 Aug 2024 08:35:21 -0500 Subject: [PATCH 274/284] fixed HB rule and formatting on a line in Items.py --- worlds/kh1/Items.py | 2 +- worlds/kh1/Rules.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index a34848631c4a..bac98a9b3284 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -518,7 +518,7 @@ def get_items_by_category(category: str) -> Dict[str, KH1ItemData]: "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, ), + #"Hades Cup": KH1ItemData("Cups", code = 264_9004, classification = ItemClassification.progression, ), } event_item_table: Dict[str, KH1ItemData] = {} diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index f53206b5f4fc..13afb973dcf6 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -962,10 +962,9 @@ def set_rules(kh1world): and ( state.has("Progressive Glide", player) - or state.has("Progressive Blizzard", 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)) ) - and has_emblems(state, player, options.keyblades_unlock_chests) ) multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: ( has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") From 357f756eb7fb6b32cba10c04842a20e9f1c20a5a Mon Sep 17 00:00:00 2001 From: gaithern Date: Fri, 2 Aug 2024 22:12:34 -0500 Subject: [PATCH 275/284] Fix logic bug with Geppetto's House postcard --- worlds/kh1/Rules.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 13afb973dcf6..edaa5a6007a4 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1576,6 +1576,7 @@ def set_rules(kh1world): 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) ) multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)" , player).access_rule = lambda state: ( ( From e0a284b317281c417dd353b169f2a55b91822a9c Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 3 Aug 2024 10:13:51 -0500 Subject: [PATCH 276/284] Update Rules.py --- worlds/kh1/Rules.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index edaa5a6007a4..9dc9cccd9729 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -3,15 +3,15 @@ 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"] def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keyblades_unlock_chests: bool) -> bool: worlds_acquired = 0.0 - 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"] - for i in range(len(worlds)): - if state.has(worlds[i], player): + 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 has_keyblade(state, player, keyblades_unlock_chests, keyblades[i])) or (state.has(worlds[i], player) and worlds[i] == "Atlantica"): + if (state.has(WORLDS[i], player) and has_keyblade(state, player, keyblades_unlock_chests, KEYBLADES[i])) or (state.has(WORLDS[i], player) and WORLDS[i] == "Atlantica"): worlds_acquired = worlds_acquired + 0.5 return worlds_acquired >= num_of_worlds From c9bfbb241b67149daf095bc69e9940027b51740f Mon Sep 17 00:00:00 2001 From: gaithern Date: Sun, 11 Aug 2024 09:56:56 -0500 Subject: [PATCH 277/284] Update Options.py --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index ee01ae83bf5d..e01f693d0e11 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -132,7 +132,7 @@ class Goal(Choice): default = 3 class EndoftheWorldUnlock(Choice): - """Determines how End of the World is Unlocked. + """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""" From 06c333e2f7604a69828542c97cf612ab6fad85a9 Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 13 Aug 2024 10:43:14 -0500 Subject: [PATCH 278/284] Update __init__.py --- worlds/kh1/__init__.py | 56 ++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index a3571a474f42..0fd090b10a7d 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -1,3 +1,4 @@ +import logging from typing import List from BaseClasses import Tutorial @@ -260,34 +261,41 @@ def set_rules(self): def create_regions(self): create_regions(self.multiworld, self.player, self.options) - def get_numbers_of_reports_to_consider(self) -> List[int]: - numbers_to_consider = [] - if self.options.end_of_the_world_unlock.current_key == "reports": - numbers_to_consider.append(self.options.required_reports_eotw.value) - if self.options.final_rest_door.current_key == "reports": - numbers_to_consider.append(self.options.required_reports_door.value) - if self.options.final_rest_door.current_key == "reports" or self.options.end_of_the_world_unlock.current_key == "reports": - numbers_to_consider.append(self.options.reports_in_pool.value) - numbers_to_consider.sort() - return numbers_to_consider + 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] + for i in range(3): + if initial_report_settings[i] != new_report_settings[i]: + logging.info(f"{self.multiworld.get_file_safe_player_name(self.player)}'s value {initial_report_settings[i]} for {value_names[i]} was invalid\n" + f"Setting {value_names[i]} value to {new_report_settings[i]}") + 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]) + + 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.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]) + def determine_reports_in_pool(self) -> int: - numbers_to_consider = self.get_numbers_of_reports_to_consider() - return max(numbers_to_consider, default=0) + if self.options.end_of_the_world_unlock == "reports" or self.options.final_rest_door == "reports": + return self.options.reports_in_pool.value + else: + return 0 def determine_reports_required_to_open_end_of_the_world(self) -> int: - if self.options.end_of_the_world_unlock.current_key == "reports": - numbers_to_consider = self.get_numbers_of_reports_to_consider() - if len(numbers_to_consider) > 0: - return numbers_to_consider[0] + if self.options.end_of_the_world_unlock == "reports": + return self.options.required_reports_eotw.value return 14 def determine_reports_required_to_open_final_rest_door(self) -> int: - if self.options.final_rest_door.current_key == "reports": - numbers_to_consider = self.get_numbers_of_reports_to_consider() - if len(numbers_to_consider) == 3: - return numbers_to_consider[1] - elif len(numbers_to_consider) == 2: - return numbers_to_consider[0] - return 14 - + if self.options.final_rest_door == "reports": + return self.options.required_reports_door.value + return 14 From 16699e60e8800a5dd2be67b13971a2d1681f39ad Mon Sep 17 00:00:00 2001 From: gaithern Date: Tue, 13 Aug 2024 10:58:03 -0500 Subject: [PATCH 279/284] Update __init__.py --- worlds/kh1/__init__.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 0fd090b10a7d..bf66cb9b241c 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -268,8 +268,8 @@ def generate_early(self): new_report_settings = [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value] for i in range(3): if initial_report_settings[i] != new_report_settings[i]: - logging.info(f"{self.multiworld.get_file_safe_player_name(self.player)}'s value {initial_report_settings[i]} for {value_names[i]} was invalid\n" - f"Setting {value_names[i]} value to {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]}") 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": @@ -287,8 +287,7 @@ def change_numbers_of_reports_to_consider(self) -> None: 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 - else: - return 0 + return 0 def determine_reports_required_to_open_end_of_the_world(self) -> int: if self.options.end_of_the_world_unlock == "reports": From 6c1ea980daf393253b400ad542c564f3c3716069 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 17 Aug 2024 14:15:02 -0500 Subject: [PATCH 280/284] Huge under-the-hood update for PR --- worlds/kh1/Locations.py | 2 +- worlds/kh1/Options.py | 4 +- worlds/kh1/Regions.py | 2 +- worlds/kh1/Rules.py | 3062 +++++++++++++++++++-------------------- worlds/kh1/__init__.py | 91 +- 5 files changed, 1567 insertions(+), 1594 deletions(-) diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index 5b0b5e83dfa5..a82be70f090b 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -185,7 +185,7 @@ def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: "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 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), diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index e01f693d0e11..63732f61b2d0 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -194,7 +194,7 @@ class RequiredReportsEotW(Range): default = 4 range_start = 0 range_end = 13 - + class RequiredReportsDoor(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. @@ -394,7 +394,7 @@ class KH1Options(PerGameCommonOptions): accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease start_inventory_from_pool: StartInventoryPool - + kh1_option_groups = [ OptionGroup("Goal", [ Goal, diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 662abcb6a015..a6f85fe617cb 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -267,7 +267,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Neverland"].locations.append("Neverland Encounter Hook Cure Event") regions["Neverland"].locations.append("Neverland Galley Chest") regions["Neverland"].locations.append("Neverland Hold Aero Chest") - regions["Neverland"].locations.append("Neverland Hold Flight 1st Chest ") + regions["Neverland"].locations.append("Neverland Hold Flight 1st Chest") regions["Neverland"].locations.append("Neverland Hold Flight 2nd Chest") regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Green Chest") regions["Neverland"].locations.append("Neverland Hold Yellow Trinity Left Blue Chest") diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 9dc9cccd9729..61b2a6389abf 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,4 +1,5 @@ from BaseClasses import CollectionState +from worlds.generic.Rules import add_rule 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)] @@ -11,7 +12,7 @@ def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keybla 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 has_keyblade(state, player, keyblades_unlock_chests, KEYBLADES[i])) or (state.has(WORLDS[i], player) and WORLDS[i] == "Atlantica"): + 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 @@ -23,10 +24,14 @@ def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bo "Emblem Piece (Fountain)", "Hollow Bastion"}, player) and has_x_worlds(state, player, 5, keyblades_unlock_chests) -def has_puppies(state: CollectionState, player: int, puppies_required: int) -> bool: - puppies_available = state.count_from_list_unique(SINGLE_PUPPIES, player) - puppies_available = puppies_available + (state.count_from_list_unique(TRIPLE_PUPPIES, player) * 3) - return (puppies_available >= puppies_required) or state.has("All Puppies", player) +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, -(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 @@ -53,11 +58,16 @@ def has_offensive_magic(state: CollectionState, player: int) -> bool: 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): +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": - return has_puppies(state, player, 99) + if puppies_choice == "individual": + return has_puppies_individual(state, player, 99) + elif puppies_choice == "triplets": + return has_puppies_triplets(state, player, 99) + else: + 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": @@ -71,21 +81,10 @@ def has_final_rest_door(state: CollectionState, player: int, final_rest_door_req def has_defensive_tools(state: CollectionState, player: int) -> bool: return ( - ( - state.has("Progressive Cure", player, 2) - and state.has("Leaf Bracer", player) - and state.has("Dodge Roll", player) - ) - and ( - state.has("Second Chance", player) - or state.has("MP Rage", player) - or state.has("Progressive Aero", player, 2) - ) + 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_keyblade(state: CollectionState, player: int, keyblade_required: bool, item: str) -> bool: - return not keyblade_required or state.has(item, player) - def can_dumbo_skip(state: CollectionState, player: int) -> bool: return ( state.has("Dumbo", player) @@ -106,87 +105,49 @@ def set_rules(kh1world): 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 - - multiworld.get_location("Traverse Town 1st District Candle Puzzle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and state.has("Progressive Blizzard", player) - ) - multiworld.get_location("Traverse Town 1st District Accessory Shop Roof Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town 2nd District Rooftop Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town 2nd District Gizmo Shop Facade Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town Alleyway Balcony Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town Alleyway Blue Room Awning Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town Alleyway Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town Green Room Clock Puzzle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town Green Room Table Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town Red Room Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town Mystical House Yellow Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and state.has("Progressive Fire", player) + + 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 + + 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 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) ) - ) - multiworld.get_location("Traverse Town Accessory Shop Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Traverse Town Secret Waterway White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and state.has("White Trinity", player) - ) - multiworld.get_location("Traverse Town Geppetto's House Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and state.has("Monstro", 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) - ) - multiworld.get_location("Traverse Town Item Workshop Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - ) - multiworld.get_location("Traverse Town 1st District Blue Trinity Balcony Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and - ( - (state.has("Blue Trinity", player) and state.has("Progressive Glide", player)) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - ) - multiworld.get_location("Traverse Town Mystical House Glide Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and + )) + 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) + )) + 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)) + )) + add_rule(kh1world.get_location("Traverse Town Mystical House Glide Chest"), + lambda state: ( ( state.has("Progressive Glide", player) or @@ -206,516 +167,310 @@ def set_rules(kh1world): ) ) and state.has("Progressive Fire", player) - ) - multiworld.get_location("Traverse Town Alleyway Behind Crates Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and state.has("Red Trinity", player) - ) - multiworld.get_location("Traverse Town Item Workshop Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - ) - multiworld.get_location("Traverse Town Secret Waterway Near Stairs Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lionheart") - ) - multiworld.get_location("Wonderland Rabbit Hole Green Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and state.has("Green Trinity", player) - ) - multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 1 Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - ) - multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 2 Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - ) - multiworld.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) - ) - multiworld.get_location("Wonderland Bizarre Room Green Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and state.has("Green Trinity", player) - ) - multiworld.get_location("Wonderland Queen's Castle Hedge Left Red Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - state.has("Footprints", player) - or state.has("High Jump", player) - or state.has("Progressive Glide", player) - ) - ) - multiworld.get_location("Wonderland Queen's Castle Hedge Right Blue Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + )) + 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)) + 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) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) + )) + add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Blue Chest"), + lambda state: ( + state.has("Footprints", player) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) + )) + add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Red Chest"), + lambda state: ( + state.has("Footprints", player) + or state.has("High Jump", player) + or 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) + )) + add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest"), + lambda state: ( + state.has_all({ + "Progressive Thunder", + "Footprints"}, player) + )) + add_rule(kh1world.get_location("Wonderland Lotus Forest Glide Chest"), + lambda state: ( + state.has("Progressive Glide", player) + or ( - state.has("Footprints", player) - or state.has("High Jump", player) - or state.has("Progressive Glide", player) + options.advanced_logic + and (state.has("High Jump", player) or can_dumbo_skip(state, player)) + and state.has("Footprints", player) ) - ) - multiworld.get_location("Wonderland Queen's Castle Hedge Right Red Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + )) + add_rule(kh1world.get_location("Wonderland Lotus Forest Corner Chest"), + lambda state: ( ( - state.has("Footprints", player) - or state.has("High Jump", player) + state.has("High Jump", player) or state.has("Progressive Glide", player) ) - ) - multiworld.get_location("Wonderland Lotus Forest Thunder Plant Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and state.has("Progressive Thunder", player) - and state.has("Footprints", player) - ) - multiworld.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and state.has("Progressive Thunder", player) - and state.has("Footprints", player) - ) - multiworld.get_location("Wonderland Lotus Forest Glide Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - state.has("Progressive Glide", player) - or - ( - options.advanced_logic - and (state.has("High Jump", player) or can_dumbo_skip(state, player)) - and state.has("Footprints", player) - ) - ) - ) - multiworld.get_location("Wonderland Lotus Forest Nut Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - ) - multiworld.get_location("Wonderland Lotus Forest Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and - ( - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - ) - or options.advanced_logic - ) - ) - multiworld.get_location("Wonderland Bizarre Room Lamp Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and state.has("Footprints", player) - ) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + or options.advanced_logic + )) + add_rule(kh1world.get_location("Wonderland Bizarre Room Lamp Chest"), + lambda state: state.has("Footprints", player)) + 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("Progressive Glide", player) - or - ( - options.advanced_logic - and state.has("High Jump", player) - and state.has("Footprints", player) - ) - ) - ) - multiworld.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + options.advanced_logic + and state.has_all({ + "High Jump", + "Footprints"}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest"), + lambda state: ( + state.has("Progressive Glide", player) + or ( - state.has("Progressive Glide", player) - or - ( - options.advanced_logic - and state.has("High Jump", player) - and state.has("Footprints", player) - ) - ) - ) - multiworld.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + options.advanced_logic + and state.has_all({ + "High Jump", + "Footprints"}, 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)) + or state.has("High Jump", player, 2) + )) + 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("Footprints", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - or state.has("High Jump", player, 2) + state.has("High Jump", player, 3) + and state.has("Footprints", player) ) - ) - multiworld.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and + or ( - state.has("Progressive Glide", player) - or - ( - state.has("High Jump", player, 3) - and state.has("Footprints", player) - ) + options.advanced_logic + and state.has_all({ + "High Jump", + "Footprints", + "Combo Master"}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest"), + lambda state: ( + state.has_all({ + "White Trinity", + "Footprints"}, player) + )) + 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 + )) + 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) + )) + 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)) + add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Middle Chest"), + lambda state: state.has("Slides", player)) + add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Wall Chest"), + lambda state: state.has("Slides", player)) + add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Middle Chest"), + lambda state: state.has("Slides", player)) + add_rule(kh1world.get_location("Deep Jungle Tree House Suspended Boat Chest"), + lambda state: ( + state.has("Progressive Glide", player) + or options.advanced_logic + )) + 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)) + )) + add_rule(kh1world.get_location("Agrabah Palace Gates High Opposite Palace Chest"), + lambda state: ( + state.has("High Jump", player) + or options.advanced_logic + )) + add_rule(kh1world.get_location("Agrabah Palace Gates High Close to Palace Chest"), + lambda state: ( + ( + state.has_all({ + "High Jump", + "Progressive Glide"}, player) or ( options.advanced_logic - and state.has("High Jump", player) - and state.has("Footprints", player) - and state.has("Combo Master", player) - ) - ) - ) - multiworld.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Lady Luck") - and state.has("White Trinity", player) - and state.has("Footprints", player) - ) - multiworld.get_location("Deep Jungle Tree House Beneath Tree House Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) - multiworld.get_location("Deep Jungle Tree House Rooftop Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) - multiworld.get_location("Deep Jungle Hippo's Lagoon Center Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) - multiworld.get_location("Deep Jungle Hippo's Lagoon Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) - multiworld.get_location("Deep Jungle Hippo's Lagoon Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or options.advanced_logic - ) - ) - multiworld.get_location("Deep Jungle Vines Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) - multiworld.get_location("Deep Jungle Vines 2 Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) - multiworld.get_location("Deep Jungle Climbing Trees Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and state.has("Blue Trinity", player) - ) - multiworld.get_location("Deep Jungle Tunnel Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) - multiworld.get_location("Deep Jungle Cavern of Hearts White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and state.has("White Trinity", player) - and state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Camp Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and state.has("Blue Trinity", player) - ) - multiworld.get_location("Deep Jungle Tent Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) - multiworld.get_location("Deep Jungle Waterfall Cavern Low Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Waterfall Cavern Middle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Waterfall Cavern High Wall Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Waterfall Cavern High Middle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Cliff Right Cliff Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) - multiworld.get_location("Deep Jungle Cliff Right Cliff Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - ) - multiworld.get_location("Deep Jungle Tree House Suspended Boat Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Jungle King") - and - ( - state.has("Progressive Glide", player) - or options.advanced_logic - ) - ) - multiworld.get_location("Agrabah Plaza By Storage Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Plaza Raised Terrace Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Plaza Top Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Alley Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Bazaar Across Windows Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Bazaar High Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Main Street Right Palace Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Main Street High Above Alley Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or (options.advanced_logic and can_dumbo_skip(state, player)) - ) - ) - multiworld.get_location("Agrabah Palace Gates Low Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Palace Gates High Opposite Palace Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - state.has("High Jump", player) - or options.advanced_logic - ) - ) - multiworld.get_location("Agrabah Palace Gates High Close to Palace Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - ( - state.has("High Jump", player) - and state.has("Progressive Glide", player) - or + and ( - options.advanced_logic - and - ( - state.has("Combo Master", player) - or can_dumbo_skip(state, player) - ) + state.has("Combo Master", player) + or can_dumbo_skip(state, player) ) ) - or state.has("High Jump", player, 3) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - ) - multiworld.get_location("Agrabah Storage Green Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and state.has("Green Trinity", player) - ) - multiworld.get_location("Agrabah Storage Behind Barrel Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Entrance Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - 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) - ) - ) - multiworld.get_location("Agrabah Cave of Wonders Hall High Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or options.advanced_logic - ) - ) - multiworld.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Treasure Room Above Fire Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Relic Chamber Stairs Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest", player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Bridge Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and state.has("Blue Trinity", player) - ) - multiworld.get_location("Agrabah Cave of Wonders Hidden Room Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - state.has("Yellow Trinity", player) - or state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - ) - multiworld.get_location("Agrabah Cave of Wonders Hidden Room Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and - ( - state.has("Yellow Trinity", player) - or state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) ) - ) - multiworld.get_location("Agrabah Aladdin's House Main Street Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Aladdin's House Plaza Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - ) - multiworld.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Three Wishes") - and state.has("White Trinity", player) - ) - multiworld.get_location("Monstro Chamber 6 Other Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Combo Master", player)) - ) - ) - multiworld.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - state.has("High Jump", player) - or options.advanced_logic - ) - ) - multiworld.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Combo Master", player)) - ) - ) - multiworld.get_location("Monstro Chamber 6 Low Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - multiworld.get_location("Halloween Town Moonlight Hill White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("White Trinity", player) - and state.has("Forget-Me-Not", player) - ) - multiworld.get_location("Halloween Town Bridge Under Bridge" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) - ) - multiworld.get_location("Halloween Town Boneyard Tombstone Puzzle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Forget-Me-Not", player) - ) - multiworld.get_location("Halloween Town Bridge Right of Gate Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + or state.has("High Jump", player, 3) + or (options.advanced_logic and state.has("Progressive Glide", 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) + )) + 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 + )) + 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)) + )) + 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)) + )) + 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("High Jump", 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 + )) + add_rule(kh1world.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), + lambda state: ( + state.has("High Jump", player) + or (options.advanced_logic and state.has("Combo Master", player)) + )) + add_rule(kh1world.get_location("Halloween Town Moonlight Hill White Trinity Chest"), + lambda state: ( + state.has_all({ + "White Trinity", + "Forget-Me-Not"}, player) + )) + add_rule(kh1world.get_location("Halloween Town Bridge Under Bridge"), + lambda state: ( + state.has_all({ + "Jack-In-The-Box", + "Forget-Me-Not"}, player) + )) + add_rule(kh1world.get_location("Halloween Town Boneyard Tombstone Puzzle Chest"), + lambda state: state.has("Forget-Me-Not", player)) + 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) and ( state.has("Progressive Glide", player) or options.advanced_logic ) - ) - multiworld.get_location("Halloween Town Cemetery Behind Grave Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + )) + 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) - ) - multiworld.get_location("Halloween Town Cemetery By Cat Shape Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + )) + 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) - ) - multiworld.get_location("Halloween Town Cemetery Between Graves Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + )) + 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) - ) - multiworld.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + )) + 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) - ) - multiworld.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + )) + 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) - ) - multiworld.get_location("Halloween Town Oogie's Manor Hollow Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + )) + 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) - ) - multiworld.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) - and state.has("Red Trinity", player) - ) - multiworld.get_location("Halloween Town Guillotine Square High Tower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and - ( - 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)) - ) - ) - multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and + )) + 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) + )) + 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)) + )) + 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)) @@ -726,40 +481,40 @@ def set_rules(kh1world): or (options.advanced_logic and state.has("Combo Master", player)) or state.has("High Jump", player, 2) ) - ) - multiworld.get_location("Halloween Town Oogie's Manor Entrance Steps Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) - ) - multiworld.get_location("Halloween Town Oogie's Manor Inside Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) - ) - multiworld.get_location("Halloween Town Bridge Left of Gate Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", 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 ) - ) - multiworld.get_location("Halloween Town Cemetery By Striped Grave Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + )) + 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) - ) - multiworld.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - ) - multiworld.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Pumpkinhead") - and + )) + 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)) @@ -768,582 +523,339 @@ def set_rules(kh1world): ( state.has("Progressive Glide", player) or (options.advanced_logic and state.has("Combo Master", player)) - or state.has("High Jump", player, 2) - ) - ) - multiworld.get_location("Olympus Coliseum Coliseum Gates Left Behind Columns Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - ) - multiworld.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and state.has("Blue Trinity", player) - ) - multiworld.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and state.has("Blue Trinity", player) - ) - multiworld.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and state.has("White Trinity", player) - ) - multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and state.has("Progressive Blizzard", player, 2) - ) - multiworld.get_location("Olympus Coliseum Coliseum Gates Blizzaga Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Olympia") - and state.has("Progressive Blizzard", player, 3) - ) - multiworld.get_location("Monstro Mouth Boat Deck Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - multiworld.get_location("Monstro Mouth High Platform Boat Side Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - ) - ) - multiworld.get_location("Monstro Mouth High Platform Across from Boat Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - ) - ) - multiworld.get_location("Monstro Mouth Near Ship Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - multiworld.get_location("Monstro Mouth Green Trinity Top of Boat Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - ) - and state.has("Green Trinity", player) - ) - multiworld.get_location("Monstro Chamber 2 Ground Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - multiworld.get_location("Monstro Chamber 2 Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - multiworld.get_location("Monstro Chamber 5 Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and state.has("High Jump", player) - ) - multiworld.get_location("Monstro Chamber 3 Ground Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - multiworld.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - state.has("High Jump", player) - or options.advanced_logic - ) - ) - multiworld.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - multiworld.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - state.has("High Jump", player) - or options.advanced_logic - ) - ) - multiworld.get_location("Monstro Mouth High Platform Near Teeth Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - multiworld.get_location("Monstro Chamber 5 Atop Barrel Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and - ( - state.has("High Jump", player) - or options.advanced_logic - ) - ) - multiworld.get_location("Monstro Chamber 5 Low 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - multiworld.get_location("Monstro Chamber 5 Low 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - ) - multiworld.get_location("Neverland Pirate Ship Deck White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and state.has("White Trinity", player) - and state.has("Green Trinity", player) - ) - multiworld.get_location("Neverland Pirate Ship Crows Nest Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and state.has("Green Trinity", player) - ) - multiworld.get_location("Neverland Hold Yellow Trinity Right Blue Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and state.has("Yellow Trinity", player) - ) - multiworld.get_location("Neverland Hold Yellow Trinity Left Blue Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and state.has("Yellow Trinity", player) - ) - multiworld.get_location("Neverland Galley Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - ) - multiworld.get_location("Neverland Cabin Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and state.has("Green Trinity", player) - ) - multiworld.get_location("Neverland Hold Flight 1st Chest " , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and - ( - state.has("Green Trinity", player) - or state.has("Progressive Glide", player) - or state.has("High Jump", player, 3) - ) - ) - multiworld.get_location("Neverland Clock Tower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and state.has("Green Trinity", player) - and has_all_magic_lvx(state, player, 2) - ) - multiworld.get_location("Neverland Hold Flight 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and - ( - state.has("Green Trinity", player) - or state.has("Progressive Glide", player) - or state.has("High Jump", player, 3) - ) - ) - multiworld.get_location("Neverland Hold Yellow Trinity Green Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and state.has("Yellow Trinity", player) - ) - multiworld.get_location("Neverland Captain's Cabin Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Fairy Harp") - and state.has("Green Trinity", player) - ) - multiworld.get_location("Hollow Bastion Rising Falls Water's Surface Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - multiworld.get_location("Hollow Bastion Rising Falls Under Water 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - multiworld.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or state.has("Progressive Blizzard", player) - ) - ) - multiworld.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or state.has("Progressive Blizzard", player) - ) - ) - multiworld.get_location("Hollow Bastion Rising Falls High Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - 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)) - ) - ) - multiworld.get_location("Hollow Bastion Castle Gates Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and 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)) - ) - ) - multiworld.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - 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)) - ) - ) - multiworld.get_location("Hollow Bastion Castle Gates High Pillar Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - 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)) - ) - ) - multiworld.get_location("Hollow Bastion Great Crest Lower Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Great Crest After Battle Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion High Tower 2nd Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion High Tower 1st Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Library Top of Bookshelf Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - multiworld.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and state.has("Progressive Gravity", player) - ) - multiworld.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - and state.has("Progressive Glide", player) - and state.has("Progressive Gravity", player) - ) - multiworld.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and state.has("Progressive Gravity", player) - ) - multiworld.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - multiworld.get_location("Hollow Bastion Base Level Platform Near Entrance Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - multiworld.get_location("Hollow Bastion Base Level Near Crystal Switch Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - multiworld.get_location("Hollow Bastion Waterway Near Save Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - multiworld.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - (state.has("Progressive Blizzard", player) and state.has("High Jump", player)) - or state.has("High Jump", player, 3) - ) - ) - multiworld.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - multiworld.get_location("Hollow Bastion Dungeon By Candles Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - multiworld.get_location("Hollow Bastion Dungeon Corner Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - ) - multiworld.get_location("Hollow Bastion Grand Hall Steps Right Side Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Grand Hall Oblivion Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Grand Hall Left of Gate Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and - ( - state.has("High Jump", player) - or - ( - options.advanced_logic - and can_dumbo_skip(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) - ) - ) - ) - multiworld.get_location("Hollow Bastion Rising Falls White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Divine Rose") - and state.has("White Trinity", player) - ) - multiworld.get_location("End of the World Final Dimension 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Final Dimension 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Final Dimension 3rd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Final Dimension 4th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Final Dimension 5th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Final Dimension 6th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Final Dimension 10th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Final Dimension 9th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Final Dimension 8th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Final Dimension 7th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Giant Crevasse 3rd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Giant Crevasse 5th Chest" , player).access_rule = lambda state: ( - state.has("High Jump", player) or state.has("Progressive Glide", player) - and has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Giant Crevasse 1st Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - and + or state.has("High Jump", player, 2) + ) + )) + 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"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest"), + lambda state: state.has("White Trinity", player)) + add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest"), + lambda state: state.has("Progressive Blizzard", player, 2)) + add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Blizzaga Chest"), + lambda state: state.has("Progressive Blizzard", player, 3)) + 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) + )) + 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) + )) + 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) ) - ) - multiworld.get_location("End of the World Giant Crevasse 4th Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") + and state.has("Green Trinity", player) + )) + add_rule(kh1world.get_location("Monstro Chamber 5 Platform Chest"), + lambda state: state.has("High Jump", player)) + 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 + )) + 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 + )) + add_rule(kh1world.get_location("Monstro Chamber 5 Atop Barrel Chest"), + lambda state: ( + state.has("High Jump", player) + or options.advanced_logic + )) + add_rule(kh1world.get_location("Neverland Pirate Ship Deck White Trinity Chest"), + lambda state: ( + state.has_all({ + "White Trinity", + "Green Trinity"}, player) + )) + add_rule(kh1world.get_location("Neverland Pirate Ship Crows Nest Chest"), + lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Right Blue Chest"), + lambda state: state.has("Yellow Trinity", player)) + add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Left Blue Chest"), + lambda state: state.has("Yellow Trinity", player)) + add_rule(kh1world.get_location("Neverland Cabin Chest"), + lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Neverland Hold Flight 1st Chest"), + lambda state: ( + state.has("Green Trinity", player) + or state.has("Progressive Glide", player) + or 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) + )) + 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) + )) + 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: ( + state.has("High Jump", player) + or state.has("Progressive Glide", player) + or state.has("Progressive Blizzard", player) + )) + add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest"), + lambda state: ( + state.has("High Jump", player) + or state.has("Progressive Glide", player) + or state.has("Progressive Blizzard", player) + )) + 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)) + )) + add_rule(kh1world.get_location("Hollow Bastion Castle Gates Gravity Chest"), + lambda state: ( + state.has("Progressive Gravity", player) and ( - ( - options.advanced_logic - and state.has("High Jump", player) - and state.has("Combo Master", player) - ) - or state.has("Progressive Glide", player) + 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)) ) - ) - multiworld.get_location("End of the World Giant Crevasse 2nd Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World World Terminus Traverse Town Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World World Terminus Wonderland Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World World Terminus Olympus Coliseum Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World World Terminus Deep Jungle Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World World Terminus Agrabah Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - and + )) + 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)) + )) + 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)) + )) + add_rule(kh1world.get_location("Hollow Bastion Great Crest Lower Chest"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Great Crest After Battle Platform Chest"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + 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) + )) + 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) + )) + add_rule(kh1world.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + 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) + )) + 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) + )) + 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) + )) + 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) + )) + add_rule(kh1world.get_location("Hollow Bastion Grand Hall Steps Right Side Chest"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Grand Hall Oblivion Chest"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Grand Hall Left of Gate Chest"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest"), + lambda state: ( + state.has("High Jump", player) + or ( - state.has("High Jump", player) - or - ( - options.advanced_logic - and can_dumbo_skip(state, player) - and state.has("Progressive Glide", player) - ) + options.advanced_logic + and can_dumbo_skip(state, player) + and has_emblems(state, player, options.keyblades_unlock_chests) ) - ) - multiworld.get_location("End of the World World Terminus Halloween Town Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World World Terminus Neverland Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World World Terminus 100 Acre Wood Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("End of the World Final Rest Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oblivion") - ) - multiworld.get_location("Monstro Chamber 6 White Trinity Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Wishing Star") - and state.has("White Trinity", player) - ) - multiworld.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("Hollow Bastion Rising Falls White Trinity Chest"), + lambda state: state.has("White Trinity", player)) + add_rule(kh1world.get_location("End of the World Giant Crevasse 5th Chest"), + lambda state: ( + state.has("High Jump", player) + or state.has("Progressive Glide", player) + )) + 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) + )) + add_rule(kh1world.get_location("End of the World Giant Crevasse 4th Chest"), + lambda state: ( + ( + options.advanced_logic + and state.has("High Jump", player) + and state.has("Combo Master", player) + ) + 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 + and can_dumbo_skip(state, player) + and 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) and state.has("Hollow Bastion", player) and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) - ) - multiworld.get_location("Deep Jungle Defeat Sabor White Fang Event" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Defeat Clayton Cure Event" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Seal Keyhole Jungle King Event" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Seal Keyhole Red Trinity Event" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event" , player).access_rule = lambda state: ( - state.has("Entry Pass", player) - ) - multiworld.get_location("Olympus Coliseum Cloud Sonic Blade Event" , player).access_rule = lambda state: ( - state.has("Entry Pass", player) - ) - multiworld.get_location("Wonderland Defeat Trickmaster Blizzard Event" , player).access_rule = lambda state: ( - state.has("Footprints", player) - ) - multiworld.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event" , player).access_rule = lambda state: ( - state.has("Footprints", player) - ) - multiworld.get_location("Monstro Defeat Parasite Cage II Stop Event" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("Deep Jungle Defeat Sabor White Fang Event"), + lambda state: state.has("Slides", player)) + add_rule(kh1world.get_location("Deep Jungle Defeat Clayton Cure Event"), + lambda state: state.has("Slides", player)) + add_rule(kh1world.get_location("Deep Jungle Seal Keyhole Jungle King Event"), + lambda state: state.has("Slides", player)) + add_rule(kh1world.get_location("Deep Jungle Seal Keyhole Red Trinity Event"), + lambda state: state.has("Slides", player)) + add_rule(kh1world.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event"), + lambda state: state.has("Entry Pass", player)) + add_rule(kh1world.get_location("Olympus Coliseum Cloud Sonic Blade Event"), + lambda state: state.has("Entry Pass", player)) + add_rule(kh1world.get_location("Wonderland Defeat Trickmaster Blizzard Event"), + lambda state: state.has("Footprints", player)) + add_rule(kh1world.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event"), + lambda state: state.has("Footprints", player)) + 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) ) - ) - multiworld.get_location("Halloween Town Defeat Oogie Boogie Holy Circlet Event" , player).access_rule = lambda state: ( - state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + )) + 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) - ) - multiworld.get_location("Halloween Town Defeat Oogie's Manor Gravity Event" , player).access_rule = lambda state: ( - state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + )) + 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) - ) - multiworld.get_location("Halloween Town Seal Keyhole Pumpkinhead Event" , player).access_rule = lambda state: ( - state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) + )) + 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) - ) - multiworld.get_location("Neverland Defeat Anti Sora Raven's Claw Event" , player).access_rule = lambda state: ( - state.has("Green Trinity", player) - ) - multiworld.get_location("Neverland Encounter Hook Cure Event" , player).access_rule = lambda state: ( - state.has("Green Trinity", player) - ) - multiworld.get_location("Neverland Seal Keyhole Fairy Harp Event" , player).access_rule = lambda state: ( - state.has("Green Trinity", player) - ) - multiworld.get_location("Neverland Seal Keyhole Tinker Bell Event" , player).access_rule = lambda state: ( - state.has("Green Trinity", player) - ) - multiworld.get_location("Neverland Seal Keyhole Glide Event" , player).access_rule = lambda state: ( - state.has("Green Trinity", player) - ) - multiworld.get_location("Neverland Defeat Captain Hook Ars Arcanum Event" , player).access_rule = lambda state: ( - state.has("Green Trinity", player) - ) - multiworld.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Defeat Riku II Ragnarok Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Defeat Behemoth Omega Arts Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Speak to Princesses Fire Event" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Traverse Town Mail Postcard 01 Event" , player).access_rule = lambda state: ( - state.has("Postcard", player) - ) - multiworld.get_location("Traverse Town Mail Postcard 02 Event" , player).access_rule = lambda state: ( - state.has("Postcard", player, 2) - ) - multiworld.get_location("Traverse Town Mail Postcard 03 Event" , player).access_rule = lambda state: ( - state.has("Postcard", player, 3) - ) - multiworld.get_location("Traverse Town Mail Postcard 04 Event" , player).access_rule = lambda state: ( - state.has("Postcard", player, 4) - ) - multiworld.get_location("Traverse Town Mail Postcard 05 Event" , player).access_rule = lambda state: ( - state.has("Postcard", player, 5) - ) - multiworld.get_location("Traverse Town Mail Postcard 06 Event" , player).access_rule = lambda state: ( - state.has("Postcard", player, 6) - ) - multiworld.get_location("Traverse Town Mail Postcard 07 Event" , player).access_rule = lambda state: ( - state.has("Postcard", player, 7) - ) - multiworld.get_location("Traverse Town Mail Postcard 08 Event" , player).access_rule = lambda state: ( - state.has("Postcard", player, 8) - ) - multiworld.get_location("Traverse Town Mail Postcard 09 Event" , player).access_rule = lambda state: ( - state.has("Postcard", player, 9) - ) - multiworld.get_location("Traverse Town Mail Postcard 10 Event" , player).access_rule = lambda state: ( - state.has("Postcard", player, 10) - ) - multiworld.get_location("Traverse Town Defeat Opposite Armor Aero Event" , player).access_rule = lambda state: ( - state.has("Red Trinity", player) - ) - multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7" , player).access_rule = lambda state: ( - state.has("Jack-In-The-Box", player) - and state.has("Forget-Me-Not", player) - and state.has("Progressive Fire", player) - ) - multiworld.get_location("Neverland Defeat Hook Ansem's Report 9" , player).access_rule = lambda state: ( - state.has("Green Trinity", player) - ) - multiworld.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 1" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("Neverland Defeat Anti Sora Raven's Claw Event"), + lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Neverland Encounter Hook Cure Event"), + lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Neverland Seal Keyhole Fairy Harp Event"), + lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Neverland Seal Keyhole Tinker Bell Event"), + 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 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)) + add_rule(kh1world.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Defeat Riku II Ragnarok Event"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Defeat Behemoth Omega Arts Event"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Speak to Princesses Fire Event"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + 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"), + lambda state: state.has("Postcard", player, 2)) + add_rule(kh1world.get_location("Traverse Town Mail Postcard 03 Event"), + lambda state: state.has("Postcard", player, 3)) + add_rule(kh1world.get_location("Traverse Town Mail Postcard 04 Event"), + lambda state: state.has("Postcard", player, 4)) + add_rule(kh1world.get_location("Traverse Town Mail Postcard 05 Event"), + lambda state: state.has("Postcard", player, 5)) + add_rule(kh1world.get_location("Traverse Town Mail Postcard 06 Event"), + lambda state: state.has("Postcard", player, 6)) + add_rule(kh1world.get_location("Traverse Town Mail Postcard 07 Event"), + lambda state: state.has("Postcard", player, 7)) + add_rule(kh1world.get_location("Traverse Town Mail Postcard 08 Event"), + lambda state: state.has("Postcard", player, 8)) + add_rule(kh1world.get_location("Traverse Town Mail Postcard 09 Event"), + lambda state: state.has("Postcard", player, 9)) + add_rule(kh1world.get_location("Traverse Town Mail Postcard 10 Event"), + 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("Hollow Bastion Speak with Aerith Ansem's Report 2"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + 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) + )) + 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)) + add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 1"), + lambda state: ( state.has("Monstro", player) and ( @@ -1351,8 +863,9 @@ def set_rules(kh1world): or (options.advanced_logic and state.has("Progressive Glide", player)) ) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 2" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 2"), + lambda state: ( state.has("Monstro", player) and ( @@ -1360,8 +873,9 @@ def set_rules(kh1world): or (options.advanced_logic and state.has("Progressive Glide", player)) ) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 3" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 3"), + lambda state: ( state.has("Monstro", player) and ( @@ -1369,8 +883,9 @@ def set_rules(kh1world): or (options.advanced_logic and state.has("Progressive Glide", player)) ) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 4" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 4"), + lambda state: ( state.has("Monstro", player) and ( @@ -1378,8 +893,9 @@ def set_rules(kh1world): or (options.advanced_logic and state.has("Progressive Glide", player)) ) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) - multiworld.get_location("Traverse Town Geppetto's House Geppetto Reward 5" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 5"), + lambda state: ( state.has("Monstro", player) and ( @@ -1387,8 +903,9 @@ def set_rules(kh1world): or (options.advanced_logic and state.has("Progressive Glide", player)) ) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) - multiworld.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward"), + lambda state: ( state.has("Monstro", player) and ( @@ -1397,8 +914,9 @@ def set_rules(kh1world): ) and has_all_summons(state, player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) - multiworld.get_location("Traverse Town Geppetto's House Talk to Pinocchio" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("Traverse Town Geppetto's House Talk to Pinocchio"), + lambda state: ( state.has("Monstro", player) and ( @@ -1406,170 +924,144 @@ def set_rules(kh1world): or (options.advanced_logic and state.has("Progressive Glide", player)) ) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) - multiworld.get_location("Traverse Town Magician's Study Obtained All Arts Items" , player).access_rule = lambda state: ( + )) + 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) - ) - multiworld.get_location("Traverse Town Magician's Study Obtained All LV1 Magic" , player).access_rule = lambda state: ( - has_all_magic_lvx(state, player, 1) - ) - multiworld.get_location("Traverse Town Magician's Study Obtained All LV3 Magic" , player).access_rule = lambda state: ( - has_all_magic_lvx(state, player, 3) - ) - multiworld.get_location("Traverse Town Piano Room Return 10 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 10) - ) - multiworld.get_location("Traverse Town Piano Room Return 20 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 20) - ) - multiworld.get_location("Traverse Town Piano Room Return 30 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 30) - ) - multiworld.get_location("Traverse Town Piano Room Return 40 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 40) - ) - multiworld.get_location("Traverse Town Piano Room Return 50 Puppies Reward 1" , player).access_rule = lambda state: ( - has_puppies(state, player, 50) - ) - multiworld.get_location("Traverse Town Piano Room Return 50 Puppies Reward 2" , player).access_rule = lambda state: ( - has_puppies(state, player, 50) - ) - multiworld.get_location("Traverse Town Piano Room Return 60 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 60) - ) - multiworld.get_location("Traverse Town Piano Room Return 70 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 70) - ) - multiworld.get_location("Traverse Town Piano Room Return 80 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 80) - ) - multiworld.get_location("Traverse Town Piano Room Return 90 Puppies" , player).access_rule = lambda state: ( - has_puppies(state, player, 90) - ) - multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1" , player).access_rule = lambda state: ( - has_puppies(state, player, 99) - ) - multiworld.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2" , player).access_rule = lambda state: ( - has_puppies(state, player, 99) - ) - multiworld.get_location("Neverland Hold Aero Chest" , player).access_rule = lambda state: ( - state.has("Yellow Trinity", player) - ) - multiworld.get_location("Deep Jungle Camp Hi-Potion Experiment" , player).access_rule = lambda state: ( - state.has("Progressive Fire", player) - ) - multiworld.get_location("Deep Jungle Camp Ether Experiment" , player).access_rule = lambda state: ( - state.has("Progressive Blizzard", player) - ) - multiworld.get_location("Deep Jungle Camp Replication Experiment" , player).access_rule = lambda state: ( - state.has("Progressive Blizzard", player) - ) - multiworld.get_location("Deep Jungle Cliff Save Gorillas" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Tree House Save Gorillas" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Camp Save Gorillas" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Bamboo Thicket Save Gorillas" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Climbing Trees Save Gorillas" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Jungle Slider 10 Fruits" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Jungle Slider 20 Fruits" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Jungle Slider 30 Fruits" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Jungle Slider 40 Fruits" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Deep Jungle Jungle Slider 50 Fruits" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Wonderland Bizarre Room Read Book" , player).access_rule = lambda state: ( - state.has("Footprints", player) - ) - multiworld.get_location("Olympus Coliseum Coliseum Gates Green Trinity" , player).access_rule = lambda state: ( - state.has("Green Trinity", player) - ) - multiworld.get_location("Olympus Coliseum Coliseum Gates Hero's License Event" , player).access_rule = lambda state: ( - state.has("Entry Pass", player) - ) - multiworld.get_location("Deep Jungle Cavern of Hearts Navi-G Piece Event" , player).access_rule = lambda state: ( - state.has("Slides", player) - ) - multiworld.get_location("Wonderland Bizarre Room Navi-G Piece Event" , player).access_rule = lambda state: ( - state.has("Footprints", player) - ) - multiworld.get_location("Traverse Town Synth Log" , player).access_rule = lambda state: ( + )) + 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)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 20 Puppies"), + lambda state: has_puppies(state, player, 20)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 30 Puppies"), + lambda state: has_puppies(state, player, 30)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 40 Puppies"), + lambda state: has_puppies(state, player, 40)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 50 Puppies Reward 1"), + lambda state: has_puppies(state, player, 50)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 50 Puppies Reward 2"), + lambda state: has_puppies(state, player, 50)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 60 Puppies"), + lambda state: has_puppies(state, player, 60)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 70 Puppies"), + lambda state: has_puppies(state, player, 70)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 80 Puppies"), + lambda state: has_puppies(state, player, 80)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 90 Puppies"), + lambda state: has_puppies(state, player, 90)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1"), + lambda state: has_puppies(state, player, 99)) + add_rule(kh1world.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2"), + lambda state: has_puppies(state, player, 99)) + 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"), + lambda state: state.has("Progressive Fire", player)) + add_rule(kh1world.get_location("Deep Jungle Camp Ether Experiment"), + lambda state: state.has("Progressive Blizzard", player)) + 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)) + add_rule(kh1world.get_location("Deep Jungle Tree House Save Gorillas"), + lambda state: state.has("Slides", player)) + add_rule(kh1world.get_location("Deep Jungle Camp Save Gorillas"), + lambda state: state.has("Slides", player)) + add_rule(kh1world.get_location("Deep Jungle Bamboo Thicket Save Gorillas"), + lambda state: state.has("Slides", player)) + 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)) + add_rule(kh1world.get_location("Wonderland Bizarre Room Read Book"), + lambda state: state.has("Footprints", player)) + 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)) + add_rule(kh1world.get_location("Deep Jungle Cavern of Hearts Navi-G Piece Event"), + lambda state: state.has("Slides", player)) + 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: ( state.has("Empty Bottle", player, 6) and ( state.has("Green Trinity", player) or state.has("High Jump", player, 3) ) - ) - multiworld.get_location("Traverse Town Synth Cloth" , player).access_rule = lambda state: ( + )) + 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) ) - ) - multiworld.get_location("Traverse Town Synth Rope" , player).access_rule = lambda state: ( + )) + 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) ) - ) - multiworld.get_location("Traverse Town Synth Seagull Egg" , player).access_rule = lambda state: ( + )) + 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) ) - ) - multiworld.get_location("Traverse Town Synth Fish" , player).access_rule = lambda state: ( + )) + 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) ) - ) - multiworld.get_location("Traverse Town Synth Mushroom" , player).access_rule = lambda state: ( + )) + 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) ) - ) - multiworld.get_location("Traverse Town Gizmo Shop Postcard 1" , player).access_rule = lambda state: ( - state.has("Progressive Thunder", player) - ) - multiworld.get_location("Traverse Town Gizmo Shop Postcard 2" , player).access_rule = lambda state: ( - state.has("Progressive Thunder", player) - ) - multiworld.get_location("Traverse Town Item Workshop Postcard" , player).access_rule = lambda state: ( + )) + 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) - ) - multiworld.get_location("Traverse Town Geppetto's House Postcard" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("Traverse Town Geppetto's House Postcard"), + lambda state: ( state.has("Monstro", player) and ( @@ -1577,8 +1069,9 @@ def set_rules(kh1world): or (options.advanced_logic and state.has("Progressive Glide", player)) ) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)" , player).access_rule = lambda state: ( + )) + 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) @@ -1592,371 +1085,864 @@ def set_rules(kh1world): or state.has("Progressive Thunder", player) or options.advanced_logic ) - ) - multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)" , player).access_rule = lambda state: ( + )) + 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) - ) - multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)" , player).access_rule = lambda state: ( + )) + 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) ) and state.has("Red Trinity", player) - ) - multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)" , player).access_rule = lambda state: ( + )) + 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) - ) - multiworld.get_location("Hollow Bastion Library Speak to Belle Divine Rose" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) - multiworld.get_location("Hollow Bastion Library Speak to Aerith Cure" , player).access_rule = lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - ) + )) + add_rule(kh1world.get_location("Hollow Bastion Library Speak to Belle Divine Rose"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Hollow Bastion Library Speak to Aerith Cure"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) if options.hundred_acre_wood: - multiworld.get_location("100 Acre Wood Meadow Inside Log Chest" , player).access_rule = lambda state: ( - has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest" , player).access_rule = lambda state: ( + add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest"), + lambda state: ( has_torn_pages(state, player, 4) and ( state.has("High Jump", player) or state.has("Progressive Glide", player) ) - and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), + lambda state: ( has_torn_pages(state, player, 4) and ( state.has("High Jump", player) or state.has("Progressive Glide", player) ) - and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - and has_keyblade(state, player, options.keyblades_unlock_chests, "Oathkeeper") - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), + lambda state: has_torn_pages(state, 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)) + add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2"), + lambda state: ( has_torn_pages(state, player, 4) and ( state.has("High Jump", player) or state.has("Progressive Glide", player) ) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3"), + lambda state: ( has_torn_pages(state, player, 4) and ( state.has("High Jump", player) or state.has("Progressive Glide", player) ) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4"), + lambda state: ( has_torn_pages(state, player, 4) and ( state.has("High Jump", player) or state.has("Progressive Glide", player) ) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5"), + lambda state: ( has_torn_pages(state, player, 4) and ( state.has("High Jump", player) or state.has("Progressive Glide", player) ) - ) - multiworld.get_location("100 Acre Wood Pooh's House Owl Cheer" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 5) - ) - multiworld.get_location("100 Acre Wood Convert Torn Page 1" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 1) - ) - multiworld.get_location("100 Acre Wood Convert Torn Page 2" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 2) - ) - multiworld.get_location("100 Acre Wood Convert Torn Page 3" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 3) - ) - multiworld.get_location("100 Acre Wood Convert Torn Page 4" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - ) - multiworld.get_location("100 Acre Wood Convert Torn Page 5" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 5) - ) - multiworld.get_location("100 Acre Wood Pooh's House Start Fire" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 3) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Break Log" , player).access_rule = lambda state: ( - has_torn_pages(state, player, 4) - ) - multiworld.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh" , player).access_rule = lambda state: ( + )) + add_rule(kh1world.get_location("100 Acre Wood Pooh's House Owl Cheer"), + lambda state: has_torn_pages(state, player, 5)) + add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 1"), + lambda state: has_torn_pages(state, player, 1)) + add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 2"), + lambda state: has_torn_pages(state, player, 2)) + add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 3"), + lambda state: has_torn_pages(state, player, 3)) + add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 4"), + lambda state: has_torn_pages(state, player, 4)) + add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 5"), + lambda state: has_torn_pages(state, player, 5)) + add_rule(kh1world.get_location("100 Acre Wood Pooh's House Start Fire"), + lambda state: has_torn_pages(state, player, 3)) + add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Break Log"), + lambda state: has_torn_pages(state, 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) and ( state.has("High Jump", player) or state.has("Progressive Glide", player) ) - ) + )) if options.atlantica: - multiworld.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest" , player).access_rule = lambda state: ( - state.has("Progressive Fire", player) - and state.has("Crystal Trident", player) - ) - multiworld.get_location("Atlantica Triton's Palace White Trinity Chest" , player).access_rule = lambda state: ( - state.has("White Trinity", player) - ) - multiworld.get_location("Atlantica Defeat Ursula I Mermaid Kick Event" , player).access_rule = lambda state: ( + add_rule(kh1world.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest"), + lambda state: ( + state.has_all({ + "Progressive Fire", + "Crystal Trident"}, player) + )) + 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) - ) - multiworld.get_location("Atlantica Defeat Ursula II Thunder Event" , player).access_rule = lambda state: ( + )) + 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) - ) - multiworld.get_location("Atlantica Seal Keyhole Crabclaw Event" , player).access_rule = lambda state: ( + )) + 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) - ) - multiworld.get_location("Atlantica Undersea Gorge Blizzard Clam" , player).access_rule = lambda state: ( - state.has("Progressive Blizzard", player) - ) - multiworld.get_location("Atlantica Undersea Valley Fire Clam" , player).access_rule = lambda state: ( - state.has("Progressive Fire", player) - ) - multiworld.get_location("Atlantica Triton's Palace Thunder Clam" , player).access_rule = lambda state: ( - state.has("Progressive Thunder", player) - ) - multiworld.get_location("Atlantica Cavern Nook Clam" , player).access_rule = lambda state: ( - state.has("Crystal Trident", player) - ) - multiworld.get_location("Atlantica Defeat Ursula II Ansem's Report 3" , player).access_rule = lambda state: ( - state.has("Mermaid Kick", player) + )) + add_rule(kh1world.get_location("Atlantica Undersea Gorge Blizzard Clam"), + lambda state: state.has("Progressive Blizzard", player)) + add_rule(kh1world.get_location("Atlantica Undersea Valley Fire Clam"), + lambda state: state.has("Progressive Fire", player)) + 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)) + 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) - and state.has("Crystal Trident", player) - ) + )) if options.cups: - multiworld.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", player) + 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Phil Cup" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Phil Cup Solo" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Phil Cup Time Trial" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Pegasus Cup" , player).access_rule = lambda state: ( - state.has("Pegasus Cup", player) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Pegasus Cup Solo" , player).access_rule = lambda state: ( - state.has("Pegasus Cup", player) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Pegasus Cup Time Trial" , player).access_rule = lambda state: ( - state.has("Pegasus Cup", player) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Hercules Cup" , player).access_rule = lambda state: ( - state.has("Hercules Cup", player) + )) + add_rule(kh1world.get_location("Complete Phil Cup"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Entry Pass"}, player) + )) + add_rule(kh1world.get_location("Complete Phil Cup Solo"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Entry Pass"}, player) + )) + add_rule(kh1world.get_location("Complete Phil Cup Time Trial"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Entry Pass"}, player) + )) + add_rule(kh1world.get_location("Complete Pegasus Cup"), + lambda state: ( + state.has_all({ + "Pegasus Cup", + "Entry Pass"}, player) + )) + add_rule(kh1world.get_location("Complete Pegasus Cup Solo"), + lambda state: ( + state.has_all({ + "Pegasus Cup", + "Entry Pass"}, player) + )) + add_rule(kh1world.get_location("Complete Pegasus Cup Time Trial"), + lambda state: ( + state.has_all({ + "Pegasus Cup", + "Entry Pass"}, player) + )) + 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Hercules Cup Solo" , player).access_rule = lambda state: ( - state.has("Hercules Cup", player) + )) + 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Hercules Cup Time Trial" , player).access_rule = lambda state: ( - state.has("Hercules Cup", player) + )) + 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Hades Cup" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", player) + )) + 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Hades Cup Solo" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Complete Hades Cup Time Trial" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Hades Cup Defeat Cloud and Leon Event" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Hades Cup Defeat Yuffie Event" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Hades Cup Defeat Cerberus Event" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Hades Cup Defeat Behemoth Event" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Hades Cup Defeat Hades Event" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Hercules Cup Defeat Cloud Event" , player).access_rule = lambda state: ( - state.has("Hercules Cup", player) + )) + 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Hercules Cup Yellow Trinity Event" , player).access_rule = lambda state: ( - state.has("Hercules Cup", player) + )) + 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", player) + )) + 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 state.has("Guard", player) and has_defensive_tools(state, player) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Olympus Coliseum Olympia Chest" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", player) + )) + 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) - and state.has("Entry Pass", player) - ) + )) if options.super_bosses: - multiworld.get_location("Neverland Defeat Phantom Stop Event" , player).access_rule = lambda state: ( + 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) - ) - multiworld.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11" , player).access_rule = lambda state: ( + )) + 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) - ) - multiworld.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event" , player).access_rule = lambda state: ( + )) + 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) - ) + )) if options.super_bosses or options.goal.current_key == "sephiroth": - multiworld.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", player) + 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) - and state.has("Entry Pass", player) - ) - multiworld.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event" , player).access_rule = lambda state: ( - state.has("Phil Cup", player) - and state.has("Pegasus Cup", player) - and state.has("Hercules Cup", player) + )) + 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) - and state.has("Entry Pass", player) - ) + )) if options.super_bosses or options.goal.current_key == "unknown": - multiworld.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13" , player).access_rule = lambda state: ( + 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) - ) - multiworld.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event" , player).access_rule = lambda state: ( + )) + 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) - ) + )) for i in range(options.level_checks): - multiworld.get_location("Level " + str(i+1).rjust(3,'0') , player).access_rule = lambda state, level_num=i: ( + add_rule(kh1world.get_location("Level " + str(i+1).rjust(3,'0')), + lambda state, level_num=i: ( has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests) - ) + )) if options.goal.current_key == "final_ansem": - multiworld.get_location("Final Ansem" , player).access_rule = lambda state: ( - has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports, options.keyblades_unlock_chests) - ) - - multiworld.get_entrance("Wonderland" , player).access_rule = lambda state: state.has("Wonderland", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Olympus Coliseum" , player).access_rule = lambda state: state.has("Olympus Coliseum", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Deep Jungle" , player).access_rule = lambda state: state.has("Deep Jungle", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Agrabah" , player).access_rule = lambda state: state.has("Agrabah", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Monstro" , player).access_rule = lambda state: state.has("Monstro", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) + 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)) + + + add_rule(kh1world.get_entrance("Wonderland"), + lambda state: state.has("Wonderland", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + 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)) + 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)) + add_rule(kh1world.get_entrance("Agrabah"), + lambda state: state.has("Agrabah", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + add_rule(kh1world.get_entrance("Monstro"), + lambda state: state.has("Monstro", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) if options.atlantica: - multiworld.get_entrance("Atlantica" , player).access_rule = lambda state: state.has("Atlantica", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Halloween Town" , player).access_rule = lambda state: state.has("Halloween Town", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - multiworld.get_entrance("Neverland" , player).access_rule = lambda state: state.has("Neverland", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests) - multiworld.get_entrance("Hollow Bastion" , player).access_rule = lambda state: state.has("Hollow Bastion", player) and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) - multiworld.get_entrance("End of the World" , player).access_rule = 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)) - multiworld.get_entrance("100 Acre Wood" , player).access_rule = lambda state: state.has("Progressive Fire", player) + add_rule(kh1world.get_entrance("Atlantica"), + lambda state: state.has("Atlantica", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + 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)) + add_rule(kh1world.get_entrance("Neverland"), + lambda state: state.has("Neverland", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests)) + 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)) + 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))) + add_rule(kh1world.get_entrance("100 Acre Wood"), + lambda state: state.has("Progressive Fire", player)) multiworld.completion_condition[player] = lambda state: state.has("Victory", player) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index bf66cb9b241c..ada7f4e052c1 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -44,7 +44,6 @@ class KH1World(World): options_dataclass = KH1Options options: KH1Options topology_present = True - required_client_version = (0, 3, 5) web = KH1Web() item_name_to_id = {name: data.code for name, data in item_table.items()} @@ -57,7 +56,8 @@ class KH1World(World): fillers.update(get_items_by_category("Stat Ups")) def create_items(self): - #Handle starting worlds + self.place_predetermined_items() + # Handle starting worlds starting_worlds = [] if self.options.starting_worlds > 0: possible_starting_worlds = ["Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Halloween Town", "Neverland", "Hollow Bastion"] @@ -73,46 +73,43 @@ def create_items(self): possible_level_up_item_pool = [] level_up_item_pool = [] - #Calculate Level Up Items - if True: #Allow notepad++ to collapse this section - # Fill pool with mandatory items - for _ in range(self.options.item_slot_increase): - level_up_item_pool.append("Item Slot Increase") - for _ in range(self.options.accessory_slot_increase): - level_up_item_pool.append("Accessory Slot Increase") + # Calculate Level Up Items + # Fill pool with mandatory items + for _ in range(self.options.item_slot_increase): + level_up_item_pool.append("Item Slot Increase") + for _ in range(self.options.accessory_slot_increase): + level_up_item_pool.append("Accessory Slot Increase") - # Create other pool - for _ in range(self.options.strength_increase): - possible_level_up_item_pool.append("Strength Increase") - for _ in range(self.options.defense_increase): - possible_level_up_item_pool.append("Defense Increase") - for _ in range(self.options.hp_increase): - possible_level_up_item_pool.append("Max HP Increase") - for _ in range(self.options.mp_increase): - possible_level_up_item_pool.append("Max MP Increase") - for _ in range(self.options.ap_increase): - possible_level_up_item_pool.append("Max AP Increase") + # Create other pool + for _ in range(self.options.strength_increase): + possible_level_up_item_pool.append("Strength Increase") + for _ in range(self.options.defense_increase): + possible_level_up_item_pool.append("Defense Increase") + for _ in range(self.options.hp_increase): + possible_level_up_item_pool.append("Max HP Increase") + for _ in range(self.options.mp_increase): + possible_level_up_item_pool.append("Max MP Increase") + for _ in range(self.options.ap_increase): + possible_level_up_item_pool.append("Max AP Increase") - # Fill remaining pool with items from other pool - while len(level_up_item_pool) < 100 and len(possible_level_up_item_pool) > 0: - level_up_item_pool.append(possible_level_up_item_pool.pop(self.random.randrange(len(possible_level_up_item_pool)))) + # Fill remaining pool with items from other pool + while len(level_up_item_pool) < 100 and len(possible_level_up_item_pool) > 0: + level_up_item_pool.append(possible_level_up_item_pool.pop(self.random.randrange(len(possible_level_up_item_pool)))) - level_up_locations = list(get_locations_by_category("Levels").keys()) - self.random.shuffle(level_up_item_pool) - starting_level_for_stats_only = self.options.force_stats_on_levels.value - 1 - while len(level_up_item_pool) > 0 and starting_level_for_stats_only < self.options.level_checks: - self.multiworld.get_location(level_up_locations[starting_level_for_stats_only], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) - starting_level_for_stats_only += 1 + level_up_locations = list(get_locations_by_category("Levels").keys()) + self.random.shuffle(level_up_item_pool) + starting_level_for_stats_only = self.options.force_stats_on_levels.value - 1 + while len(level_up_item_pool) > 0 and starting_level_for_stats_only < self.options.level_checks: + self.multiworld.get_location(level_up_locations[starting_level_for_stats_only], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) + starting_level_for_stats_only += 1 - #Calculate prefilled locations and items - if True: #Allow notepad++ to collapse this section - prefilled_items = [] - prefilled_locations = 1 #Victory - if self.options.vanilla_emblem_pieces: - prefilled_locations = prefilled_locations + 4 - prefilled_items = prefilled_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] + # Calculate prefilled locations and items + prefilled_items = [] + prefilled_locations = 1 # Victory + if self.options.vanilla_emblem_pieces: + prefilled_items = prefilled_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] - total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - prefilled_locations + total_locations = len(self.multiworld.get_unfilled_locations(self.player)) non_filler_item_categories = ["Key", "Magic", "Worlds", "Trinities", "Cups", "Summons", "Abilities", "Shared Abilities", "Keyblades", "Accessory", "Weapons", "Puppies"] if self.options.hundred_acre_wood: @@ -165,29 +162,19 @@ def create_items(self): item_pool += [self.create_item("Ansem's Report " + str(i+1))] while len(item_pool) > total_locations: - item_pool.pop(0) + removed_item = item_pool.pop(0) + logging.warn(f"Item {removed_item} had to be removed from {self.player_name}'s world due to insufficient location count") while len(item_pool) < total_locations and len(level_up_item_pool) > 0: item_pool += [self.create_item(level_up_item_pool.pop())] # Fill any empty locations with filler items. - item_names = [] - attempts = 0 # If we ever try to add items 200 times, and all the items are used up, lets clear the item_names array, we probably don't have enough items while len(item_pool) < total_locations: - item_name = self.get_filler_item_name() - if item_name not in item_names: - item_names.append(item_name) - item_pool.append(self.create_item(item_name)) - attempts = 0 - elif attempts >= 200: - item_names = [] - attempts = 0 - else: - attempts = attempts + 1 - + item_pool.append(self.create_item(self.get_filler_item_name())) + self.multiworld.itempool += item_pool - def pre_fill(self) -> None: + 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", From 385fe9caae39f089882575f794dbfe9e567a91a2 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 17 Aug 2024 18:56:51 -0500 Subject: [PATCH 281/284] More updates for PR --- worlds/kh1/__init__.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index ada7f4e052c1..f42280efa643 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -93,19 +93,18 @@ def create_items(self): possible_level_up_item_pool.append("Max AP Increase") # Fill remaining pool with items from other pool - while len(level_up_item_pool) < 100 and len(possible_level_up_item_pool) > 0: - level_up_item_pool.append(possible_level_up_item_pool.pop(self.random.randrange(len(possible_level_up_item_pool)))) + self.multiworld.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()) self.random.shuffle(level_up_item_pool) starting_level_for_stats_only = self.options.force_stats_on_levels.value - 1 while len(level_up_item_pool) > 0 and starting_level_for_stats_only < self.options.level_checks: - self.multiworld.get_location(level_up_locations[starting_level_for_stats_only], self.player).place_locked_item(self.create_item(level_up_item_pool.pop())) + self.get_location(level_up_locations[starting_level_for_stats_only]).place_locked_item(self.create_item(level_up_item_pool.pop())) starting_level_for_stats_only += 1 # Calculate prefilled locations and items prefilled_items = [] - prefilled_locations = 1 # Victory if self.options.vanilla_emblem_pieces: prefilled_items = prefilled_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] @@ -161,10 +160,6 @@ def create_items(self): for i in range(self.determine_reports_in_pool()): item_pool += [self.create_item("Ansem's Report " + str(i+1))] - while len(item_pool) > total_locations: - removed_item = item_pool.pop(0) - logging.warn(f"Item {removed_item} had to be removed from {self.player_name}'s world due to insufficient location count") - while len(item_pool) < total_locations and len(level_up_item_pool) > 0: item_pool += [self.create_item(level_up_item_pool.pop())] @@ -183,12 +178,12 @@ def place_predetermined_items(self) -> None: "puppies": "Traverse Town Piano Room Return 99 Puppies Reward 2", "final_rest": "End of the World Final Rest Chest" } - self.multiworld.get_location(goal_dict[self.options.goal.current_key], self.player).place_locked_item(self.create_item("Victory")) + self.get_location(goal_dict[self.options.goal.current_key]).place_locked_item(self.create_item("Victory")) if self.options.vanilla_emblem_pieces: - self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)", self.player).place_locked_item(self.create_item("Emblem Piece (Flame)")) - self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)", self.player).place_locked_item(self.create_item("Emblem Piece (Statue)")) - self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)", self.player).place_locked_item(self.create_item("Emblem Piece (Fountain)")) - self.multiworld.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)", self.player).place_locked_item(self.create_item("Emblem Piece (Chest)")) + 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)")) def get_filler_item_name(self) -> str: weights = [data.weight for data in self.fillers.values()] From fbab6173413f938ebb42f9de45f9799ff9899c0a Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sat, 17 Aug 2024 19:01:27 -0500 Subject: [PATCH 282/284] Update worlds/kh1/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index f42280efa643..45beda592865 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -98,8 +98,8 @@ def create_items(self): level_up_locations = list(get_locations_by_category("Levels").keys()) self.random.shuffle(level_up_item_pool) - starting_level_for_stats_only = self.options.force_stats_on_levels.value - 1 - while len(level_up_item_pool) > 0 and starting_level_for_stats_only < self.options.level_checks: + starting_level_for_stats_only = self.options.force_stats_on_levels.value + while len(level_up_item_pool) > 0 and starting_level_for_stats_only <= self.options.level_checks: self.get_location(level_up_locations[starting_level_for_stats_only]).place_locked_item(self.create_item(level_up_item_pool.pop())) starting_level_for_stats_only += 1 From 4d5fc1857c62b2245f691b2529f948cb534d35c4 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Sat, 17 Aug 2024 19:01:44 -0500 Subject: [PATCH 283/284] Update worlds/kh1/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/kh1/Rules.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 61b2a6389abf..c8cb71ffd636 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -64,10 +64,9 @@ def has_final_rest_door(state: CollectionState, player: int, final_rest_door_req if final_rest_door_requirement == "puppies": if puppies_choice == "individual": return has_puppies_individual(state, player, 99) - elif puppies_choice == "triplets": + if puppies_choice == "triplets": return has_puppies_triplets(state, player, 99) - else: - return has_puppies_all(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": From ea84da1d90324ead8b14d550e202e01772c2b257 Mon Sep 17 00:00:00 2001 From: gaithern Date: Sat, 17 Aug 2024 20:53:37 -0500 Subject: [PATCH 284/284] Update __init__.py --- worlds/kh1/__init__.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 45beda592865..63b457556894 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -93,15 +93,15 @@ def create_items(self): possible_level_up_item_pool.append("Max AP Increase") # Fill remaining pool with items from other pool - self.multiworld.random.shuffle(possible_level_up_item_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()) self.random.shuffle(level_up_item_pool) - starting_level_for_stats_only = self.options.force_stats_on_levels.value - while len(level_up_item_pool) > 0 and starting_level_for_stats_only <= self.options.level_checks: - self.get_location(level_up_locations[starting_level_for_stats_only]).place_locked_item(self.create_item(level_up_item_pool.pop())) - starting_level_for_stats_only += 1 + 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 # Calculate prefilled locations and items prefilled_items = []